Что такое Namespace в Kubernetes?

Ответ

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

Основные цели использования:

  • Логическое разделение: Изоляция окружений (dev, staging, prod), команд или проектов.
  • Управление доступом: Привязка политик RBAC (Role-Based Access Control) к конкретному пространству имён.
  • Квотирование ресурсов: Ограничение потребления CPU, памяти и количества объектов через ResourceQuota.
  • Изоляция сети: Применение NetworkPolicy для управления сетевым трафиком между подами в разных неймспейсах.

Пример манифеста для создания Namespace:

apiVersion: v1
kind: Namespace
metadata:
  name: production

Важные особенности:

  • Системные неймспейсы, такие как kube-system, kube-public, kube-node-lease, создаются и управляются самим Kubernetes.
  • Ресурсы уровня кластера (Nodes, PersistentVolumes, ClusterRoles) не принадлежат ни одному неймспейсу и являются глобальными.
  • Имена ресурсов (например, Pod или Service) должны быть уникальны только в пределах одного неймспейса.

Работа с неймспейсами через kubectl:

# Создать неймспейс
kubectl create namespace dev

# Показать все ресурсы в конкретном неймспейсе
kubectl get all -n dev

# Установить неймспейс по умолчанию для текущего контекста
kubectl config set-context --current --namespace=dev

Ответ 18+ 🔞

А, неймспейсы в кубере! Ну это ж, ёпта, как квартиры в общаге — все в одном здании, но у каждого своя комнатушка, и чтоб сосед к тебе в тапки не срал. Логика простая, как три копейки.

Namespace (пространство имён) — это, грубо говоря, виртуальный закуток внутри одного большого кластера. Туда ты можешь запихнуть свои поды, сервисы, конфиги и прочую хуету, чтобы она не мешалась с ресурсами других ребят. Представь, что у тебя один сервер, но на нём и продакшн, и тестовый стенд, и ещё какая-нибудь левая фигня от стажёра. Без неймспейсов это был бы пиздец и бардак, все бы лезли друг другу в конфиги, как мартышлюшки.

Зачем это вообще нужно, спросишь?

  • Чтобы не запутаться, как свинья в апельсинах. Отделяешь, например, dev от prod. В dev можно хуярить что угодно, а в prod — только проверенное, иначе будет вам хиросима и нагасаки.
  • Чтобы ограничить доступ. Через RBAC можно дать одной команде права только в их неймспейс, а не на весь кластер, чтобы они там чего лишнего не натворили. Доверия ебать ноль, знаешь ли.
  • Чтобы жадные не сожрали все ресурсы. Через ResourceQuota можно сказать: "ребята из отдела маркетинга, вам вот столько CPU и памяти, и ни гигабайтом больше". Иначе они развернут своё говно, которое будет жрать ресурсов овердохуища.
  • Чтобы сеть изолировать. Через NetworkPolicy можно запретить подам из неймспейса monitoring лезть в production без спросу. Безопасность, мать её.

Вот тебе пример, как эту штуку создать:

apiVersion: v1
kind: Namespace
metadata:
  name: production

Создал — и вот тебе чистая песочница под названием production.

А теперь важные нюансы, чтоб не обосраться:

  • Системные неймспейсы типа kube-system — это святое. Там живёт мозг кластера. Туда лучше не лезть со своими кривыми руками, если не хочешь, чтобы всё накрылось медным тазом.
  • Некоторые штуки — глобальные. Ноды, PersistentVolumes, ClusterRoles — они как общий туалет на этаже, не привязаны ни к одной "квартире"-неймспейсу.
  • Имена ресурсов должны быть уникальными только внутри своего неймспейса. То есть в dev и в prod может быть по сервису с именем frontend. А вот если в одном неймспейсе попробуешь создать два одинаковых — получишь по шапке.

Поработать с этим через kubectl — проще пареной репы:

# Создаём неймспейс 'dev', где будет твориться непотребство
kubectl create namespace dev

# Посмотреть, что там понавтыкали в этом неймспейсе
kubectl get all -n dev

# Сделать неймспейс 'dev' рабочим по умолчанию, чтобы не писать '-n dev' каждый раз
kubectl config set-context --current --namespace=dev

Вот и вся магия. Разделяй, изолируй, контролируй — и будет тебе счастье, а не каша в одной большой куче.