Namespace — механизм виртуального разделения кластера на изолированные сегменты. Позволяет нескольким командам или проектам использовать один кластер без конфликтов имён ресурсов. Имена объектов уникальны внутри одного namespace, но могут повторяться в разных.
[source: kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/]
Встроенные namespace
Kubernetes создаёт четыре namespace при инициализации кластера:
Не трогай kube-system без понимания последствий — это системное пространство кластера.
Cluster-scoped ресурсы
Не все ресурсы привязаны к namespace. Cluster-scoped ресурсы: Node, PersistentVolume, Namespace, ClusterRole, ClusterRoleBinding, StorageClass, IngressClass.
# Посмотреть, какие ресурсы привязаны к namespace
kubectl api-resources --namespaced=true
# Какие нет (cluster-scoped)
kubectl api-resources --namespaced=false
Создание Namespace
Через YAML (рекомендуется)
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
environment: development
team: backend
kubectl apply -f namespace.yaml
Императивно
kubectl create namespace dev
kubectl create namespace staging
kubectl create namespace production
Работа с namespace через kubectl
# Список namespace
kubectl get namespaces
kubectl get ns
# Ресурсы в конкретном namespace
kubectl get pods --namespace=dev
kubectl get pods -n dev
# Все ресурсы в namespace
kubectl get all -n dev
# Ресурсы во всех namespace
kubectl get pods --all-namespaces
kubectl get pods -A
# Удалить namespace (удалит ВСЕ объекты внутри)
kubectl delete namespace dev
Переключение контекста по умолчанию
Чтобы не указывать -n при каждой команде, устанавливают namespace для текущего контекста:
# Посмотреть текущий контекст
kubectl config current-context
# Установить namespace по умолчанию
kubectl config set-context --current --namespace=dev
# Проверить
kubectl config view --minify | grep namespace
# Вернуться в default
kubectl config set-context --current --namespace=default
Инструменты вроде kubens (из пакета kubectx) упрощают переключение до одной команды:
kubens dev # переключиться в namespace dev
kubens - # вернуться к предыдущему
ResourceQuota
ResourceQuota ограничивает суммарное потребление ресурсов в namespace. Хорошая практика — устанавливать квоты для каждой команды или окружения.
[source: kubernetes.io/docs/concepts/policy/resource-quotas/]
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
# Вычислительные ресурсы
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
# Количество объектов
pods: "20"
services: "10"
persistentvolumeclaims: "5"
secrets: "20"
configmaps: "20"
# Просмотр квот
kubectl get resourcequota -n dev
kubectl describe resourcequota dev-quota -n dev
Важно: при активной ResourceQuota с requests.cpu или requests.memory каждый Pod в namespace обязан указать соответствующие requests. Иначе API Server отклонит создание Pod. Поэтому ResourceQuota всегда используют вместе с LimitRange — который задаёт requests/limits по умолчанию (подробно в главе 13).
DNS и межнеймспейсная коммуникация
Каждый Service получает DNS-запись:
<service-name>.<namespace>.svc.cluster.local
[source: kubernetes.io/docs/concepts/services-networking/dns-pod-service/]
Внутри одного namespace — достаточно имени Service:
curl http://my-service
curl http://my-service:8080
Между namespace — нужен FQDN или краткая форма с namespace:
# Из namespace "frontend" к Service в namespace "backend"
curl http://api-service.backend.svc.cluster.local
# Или краткая форма (также работает)
curl http://api-service.backend
Пример: многокомандная структура
# Создать namespace для команд
kubectl create namespace team-alpha
kubectl create namespace team-beta
kubectl create namespace shared-services
# Команда разворачивает приложение в своём namespace
kubectl apply -f app.yaml -n team-alpha
# Применить квоты для команды
kubectl apply -f quota-alpha.yaml -n team-alpha
# Проверить потребление
kubectl describe resourcequota -n team-alpha
# Приложение из team-alpha обращается к shared-сервису
# через FQDN: redis.shared-services.svc.cluster.local
apiVersion: v1
kind: Pod
metadata:
name: app
namespace: team-alpha
spec:
containers:
- name: app
image: myapp:1.0
env:
- name: REDIS_HOST
value: "redis.shared-services.svc.cluster.local"
Типичные ошибки
Удаление namespace с живыми ресурсами. kubectl delete namespace dev удалит ВСЕ объекты в namespace — Pod, Service, Deployment, ConfigMap, Secret, PVC. Операция необратима (namespace переходит в Terminating).
Namespace застрял в Terminating. Причина — финализаторы (finalizers) на объектах внутри, которые не могут завершить очистку. Диагностика: kubectl get namespace dev -o yaml — смотреть поле finalizers. Решение: удалить финализаторы вручную или дождаться завершения очистки контроллером.
Не указывать namespace в CI/CD. Скрипты без -n <namespace> работают с default. При смене контекста kubectl или в другом окружении это приводит к деплою не туда. Всегда явно указывай namespace в автоматизации.
Предполагать изоляцию сети внутри кластера. По умолчанию Pod из разных namespace могут свободно общаться. Изоляция трафика — задача NetworkPolicy (глава 17).
Слишком много namespace. Один namespace на микросервис — антипаттерн. Namespace для изоляции команд/окружений, не для каждого приложения.
Альтернативы
Несколько кластеров — жёсткая изоляция, но дороже в эксплуатации. Актуально для compliance, мультирегиональных деплоев или разделения production/non-production.
Virtual Cluster (vCluster) — полноценный Kubernetes API внутри namespace родительского кластера. Даёт изоляцию на уровне кластера без накладных расходов на отдельные control plane.
Hierarchical Namespaces (HNC) — расширение для создания иерархии namespace с наследованием политик. Всё ещё требует отдельной установки, не встроено в core Kubernetes.