Kubernetes theory
September 12, 2022

Namespace

Это базовая сущность или абстракция Kubernetes. Её задача состоит в том, чтобы группировать другие сущности кластера. По своей природе очень напоминает каталоги в ОС.

В namespace создаются: pod, deploy, sts, cj, jobs, ds, service. К namespace как к сущности прикрепляются другие сущности, например: quota, limits.
Но низкоуровневые ресурсы node, pv - не входят в ns.

С помощью namespace удобно группировать в кластере ресурсы разных отделов компании и разные окружения. У отдела разработки свой namespace, а у тестировщиков свой. Свой namespace для продового окружения и для препрода.

Особенности namespace:

1. Имена ресурсов уникальны в пределах одного namespace. В разных namespace имена ресурсов могут совпадать.
2. Ресурс может принадлежать только одному namespace.

3. Один namespace не может быть вложен в другой.

По умолчанию в кластере создаются четыре namespace (или ns в сокращённой форме):

1. default. Предполагается, что пользователи будут сосздавать ресурсы именно в этом ns. Его можно сравнить с домашним каталогом пользователя.

2. kube-system. В этом ns располагаются поды необходимые для корректной работы кластера. Например, тут находятся: CoreDNS, metric-server, kube-proxy и тд.

3. kube-public. Ресурсы, расположенные в этом ns, доступны без исключения всем пользователям кластера.

4. kube-node-lease. Содержит Lease объекты, ассоциированные с каждой нодой кластера.

Помимо четырёх стандартных ns можно создать дополнительные:

kubectl create ns test
kubectl describe ns test
Name:         test
Labels:       kubernetes.io/metadata.name=test
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.

К данному ns пока не привязаны ресурсы вроде quota, limits.

Посмотреть список всех имеющихся в кластере ns можно так:

kubectl get ns

В приведённом списке будет название ns, status, age.

Можно также поправить конфигурацию ns:

kubectl edit ns test

Вывод этой команды будет таким:

apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2022-09-12T20:15:57Z"
  labels:
    kubernetes.io/metadata.name: test
  name: test
  resourceVersion: "36829339"
  uid: c4853862-801e-4922-be6c-8508e880d9fe
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

Например, можно таким образом удалить finalizers. Если он мешает удалению ns.

Посмотреть поды во всех ns можно так:

kubectl get po -A

Посмотреть поды в конкретном ns:

kubectl -n test get po

Использовать другой контекст по-умолчанию:

kubectl config set-context --current --namespace=test

Эта команда установит по-умолчанию ns с именем test.

Удалим ns с именем test:

kubectl delete ns test

Для корректного удаления ns он должен быть пустым. Но если всё равно удаление не проходит, то стоит удалить finalizers из спецификации.

Создадим два ns для дальнейшей работы:

kubectl create ns prod
kubectl create ns preprod

Продовые вещи, требующие постоянной работы будем создавать в prod. А тетировать идеи будем в preprod.

Полезные ссылки:

https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/