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

«Что такое Namespace в Kubernetes и для чего он используется?» — вопрос из категории Kubernetes, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Namespace (пространство имен) в Kubernetes — это механизм виртуальной изоляции и организации ресурсов (Pods, Services, Deployments и т.д.) внутри одного физического кластера. Это не изоляция на уровне безопасности (как в виртуальных машинах), а логическое разделение для управления доступом, квотами и сетевым взаимодействием.

Основные практические применения:

  1. Разделение по окружениям: dev, staging, prod. Позволяет запускать разные версии одного приложения бок о бок.
  2. Разделение по командам или проектам: team-frontend, team-backend, project-alpha. Каждая команда работает в своем пространстве.
  3. Управление ресурсами через ResourceQuotas: Ограничение суммарного потребления CPU, памяти и количества объектов для всего namespace.
  4. Контроль доступа через RBAC: Роли (Roles) и привязки ролей (RoleBindings) привязаны к namespace, ограничивая права пользователей или сервисных аккаунтов.
  5. Изоляция сетевого трафика: 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