Короткий ответ
Namespace — это логическая область видимости внутри одного кластера, позволяющая разделять ресурсы (Pod, Service, ConfigMap и т.д.) между командами, окружениями или проектами и независимо применять к ним квоты и права доступа.
Как это работает подробнее
большинство объектов Kubernetes (кроме, например, Node и PersistentVolume, которые кластерного уровня) существуют внутри namespace; имена объектов должны быть уникальны только в пределах одного namespace, а не всего кластера. RBAC, ResourceQuota и NetworkPolicy можно применять именно на уровне namespace.
Пример кода
Команды и вывод
kubectl create namespace staging
kubectl config set-context --current --namespace=staging
kubectl get podsЧто использовать на практике
- Практика. namespace часто используют для разделения окружений (
dev,staging,prod) в одном кластере или для изоляции команд/продуктов в общем кластере, сочетая с RBAC и квотами ресурсов. DNS-имя сервиса включает namespace (svc.namespace.svc.cluster.local), что позволяет иметь одноимённые сервисы в разных namespace.
Подводные камни
- Риски. полагать, что namespace обеспечивает полную сетевую изоляцию "из коробки" — без NetworkPolicy поды из разных namespace по умолчанию могут общаться друг с другом; забывать указывать
-n <namespace>в командах kubectl и случайно работать не с тем окружением; создавать слишком мелкое дробление на namespace без реальной необходимости в изоляции.