Ответ
Namespace (пространство имен) в Kubernetes — это механизм виртуальной изоляции и организации ресурсов (Pods, Services, Deployments и т.д.) внутри одного физического кластера. Это не изоляция на уровне безопасности (как в виртуальных машинах), а логическое разделение для управления доступом, квотами и сетевым взаимодействием.
Основные практические применения:
- Разделение по окружениям:
dev,staging,prod. Позволяет запускать разные версии одного приложения бок о бок. - Разделение по командам или проектам:
team-frontend,team-backend,project-alpha. Каждая команда работает в своем пространстве. - Управление ресурсами через ResourceQuotas: Ограничение суммарного потребления CPU, памяти и количества объектов для всего namespace.
- Контроль доступа через RBAC: Роли (Roles) и привязки ролей (RoleBindings) привязаны к namespace, ограничивая права пользователей или сервисных аккаунтов.
- Изоляция сетевого трафика: NetworkPolicies можно применять для контроля трафика между Pods в разных namespace.
Пример создания namespace и deployment в нем:
# 1. Создаем namespace
apiVersion: v1
kind: Namespace
metadata:
name: production
---
# 2. Создаем deployment в namespace production
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: production # Ключевой параметр
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
Важные нюансы:
- Служебные namespace:
kube-system,kube-public,default. Не удаляйте их. - Глобальные ресурсы: Некоторые ресурсы кластера (Nodes, PersistentVolumes, ClusterRoles) находятся вне namespace.
- Сетевое взаимодействие: Сервисы внутри namespace доступны по короткому имени (
service-name). Для доступа к сервису из другого namespace используйте FQDN:service-name.namespace-name.svc.cluster.local.
Работа с namespace через kubectl:
# Просмотр всех namespace
kubectl get namespaces
# Выполнение команды в конкретном namespace
kubectl get pods -n production
# Установка namespace по умолчанию для текущего контекста
kubectl config set-context --current --namespace=production