Namespace
Это базовая сущность или абстракция Kubernetes. Её задача состоит в том, чтобы группировать другие сущности кластера. По своей природе очень напоминает каталоги в ОС.
В namespace создаются: pod, deploy, sts, cj, jobs, ds, service. К namespace как к сущности прикрепляются другие сущности, например: quota, limits.
Но низкоуровневые ресурсы node, pv - не входят в ns.
С помощью 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.
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/