Что такое Namespace и для чего он используется?

Что такое Namespace

Namespace в Kubernetes — это логическая (именованная) область в кластере, которая группирует ресурсы (Pod, Service, Deployment, Secret и т.д.). По факту namespace даёт пространственную область видимости имён: объекты с одинаковыми именами могут существовать в разных namespace, а большинство ресурсов по умолчанию — namespace-scoped.

Для чего используется (основные цели)

  • Разделение областей видимости — каждый namespace содержит свой набор объектов; позволяет избежать конфликтов имён (svcA в team-a ≠ svcA в team-b).

  • Многоарендность/логическая изоляция — удобен для разделения команд, проектов, окружений (dev/stage/prod) внутри одного кластера.

  • Разграничение прав доступа (RBAC) — Role/RoleBinding действуют в контексте namespace; даёт мелкую гранулярность прав.

  • Ограничение ресурсов — ResourceQuota и LimitRange применяются на namespace и предотвращают перерасход CPU/memory/storage.

  • Сетевая сегментация — NetworkPolicy может контролировать ingress/egress между namespace.

  • Организация и управление — структурирование окружений, автоматизация onboarding, привязка billing/monitoring.

Важные практики и поведение

  • Системные namespace: default, kube-system, kube-public, kube-node-lease. Не ломайте их; создавайте свои для приложений.

  • DNS-имена: сервис доступен через my-svc.my-namespace.svc.cluster.local. Это позволяет вызывать сервисы из других namespace по полному имени.

  • RBAC: Role/RoleBinding — namespace-scoped; ClusterRole/ClusterRoleBinding — глобальные. Для изоляции давайте ролям доступ только к нужному namespace.

  • Ресурсы секьюрити: Secret, ConfigMap, ServiceAccount, PersistentVolumeClaim — имеют область видимости namespace; нельзя напрямую ссылаться на Secret из другого namespace.

  • ResourceQuota / LimitRange — пример: ограничить CPU/memory, количество подов, PVC в namespace.

apiVersion: v1
kind: Namespace
metadata:
name: dev
\---
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
pods: "20"
requests.cpu: "10"
requests.memory: 20Gi
persistentvolumeclaims: "5"
  • Политики сети (пример): запретить входящий трафик в namespace, кроме от приложений того же namespace.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-from-others
namespace: dev
spec:
podSelector: {}
policyTypes: \["Ingress"\]
ingress:
\- from:
\- podSelector: {} # только из этого же namespace

Практические команды

  • Создать namespace: kubectl create namespace team-a или манифестом.

  • Работать в namespace: kubectl -n team-a get pods или установить дефолт в контексте: kubectl config set-context --current --namespace=team-a.

  • Привязать роль: kubectl create rolebinding view-team-a --role=view --namespace=team-a --user=alice@example.com.

Ограничения и советы по дизайну

  • Namespace — логическая, а не безопасная изоляция уровня «железо». Для строгой мультиарендности (полная изоляция, отдельный сетевой/учётный boundary) лучше отдельные кластеры.

  • Не злоупотребляйте: слишком много мелких namespace усложняет управление; слишком мало — мешает разделению ответственности. Подходы: окружения (prod/dev/stage) или по командам/проектам.

  • Комбинируйте namespace с ResourceQuota, NetworkPolicy и RBAC для реальной многопользовательской дисциплины.

  • Используйте метки (labels) на namespace для автоматизации (CI/CD, billing, политики) и единых правил через OPA/Gatekeeper.

Жизненный цикл

  • Удаление namespace — операция, которая удаляет все входящие в него ресурсы; удаление может занимать время из-за finalizers. Планируйте осторожно и имейте бэкапы/истории IaC.

Используйте namespace как основной инструмент логической сегментации кластера, но проектируйте политику доступа и квоты, комбинируя с сетевыми и RBAC-механизмами; при требованиях строгой изоляции рассматривайте отдельные кластеры.