Przestrzenie nazw (ang. Namespaces)
W Kubernetesie przestrzenie nazw zapewniają mechanizm izolowania grup zasobów w ramach jednego klastra. Nazwy zasobów muszą być unikalne w obrębie danej przestrzeni nazw, ale nie muszą być unikalne w całym klastrze. Zakres oparty na przestrzeniach nazw dotyczy tylko obiektów (np. Deploymentów, Service'ów, itp.), a nie dla obiektów dotyczących całego klastra (np. StorageClass, Nodes, PersistentVolumes, itp.).
Kiedy używać wielu przestrzeni nazw
Przestrzenie nazw są przeznaczone do użycia w środowiskach z wieloma użytkownikami rozproszonymi w różnych zespołach lub projektach. Dla klastrów z użytkownikami w ilości od kilku do kilkunastu nie powinieneś potrzebować tworzyć ani myśleć o przestrzeniach nazw. Zacznij używać przestrzeni nazw, gdy potrzebujesz funkcji, które one oferują.
Namespace'y zapewniają zakres dla nazw. Nazwy zasobów muszą być unikalne w obrębie jednego namespace'u, ale nie muszą być unikalne w różnych namespace'ach. Namespace'y nie mogą być zagnieżdżane w sobie wzajemnie, a każdy zasób Kubernetesa może znajdować się tylko w jednym namespace'ie.
Namespacey są sposobem na podział zasobów klastra pomiędzy wielu użytkowników (przez resource quotas).
Nie ma potrzeby używania wielu przestrzeni nazw do oddzielania nieznacznie różniących się zasobów, takich jak różne wersje tego samego oprogramowania: zamiast tego wykorzystaj etykiety, aby rozróżnić zasoby w obrębie jednej przestrzeni nazw.
Informacja:
Dla klastra produkcyjnego, rozważ nie używanie przestrzeni nazwdefault
. Zamiast tego stwórz inne przestrzenie nazw i używaj ich.Początkowe przestrzenie nazw
Kubernetes rozpoczyna z czterema początkowymi przestrzeniami nazw:
default
: Kubernetes zawiera tę przestrzeń nazw, aby umożliwić rozpoczęcie
korzystania z nowego klastra bez konieczności wcześniejszego tworzenia przestrzeni nazw.
kube-node-lease
: Ta przestrzeń nazw przechowuje obiekty Lease powiązane z każdym węzłem. Pozwalają one kubeletowi
na wysyłanie sygnałów życia (ang. heartbeats), dzięki czemu warstwa sterowania może wykryć awarię węzła.
kube-public
: Ta przestrzeń nazw jest możliwa do odczytu przez wszystkich klientów (w tym tych, którzy nie są uwierzytelnieni). Ta przestrzeń nazw jest głównie zarezerwowana do
użytku klastra, na wypadek gdyby niektóre zasoby miały być widoczne i czytelne publicznie w całym klastrze. Publiczny aspekt tej przestrzeni nazw jest jedynie konwencją, a nie wymogiem.
kube-system
: Przestrzeń nazw dla
obiektów tworzonych przez system Kubernetesa.
Praca z przestrzeniami nazw
Tworzenie i usuwanie przestrzeni nazw zostało opisane w dokumentacji Przewodnika Administratora dotyczącej przestrzeni nazw.
Informacja:
Unikaj tworzenia przestrzeni nazw z prefiksemkube-
, ponieważ jest on zarezerwowany dla przestrzeni nazw systemu Kubernetes.Przeglądanie przestrzeni nazw
Możesz wyświetlić listę bieżących przestrzeni nazw w klastrze za pomocą:
kubectl get namespace
NAME STATUS AGE
default Active 1d
kube-node-lease Active 1d
kube-public Active 1d
kube-system Active 1d
Ustawianie przestrzeni nazw dla żądania
Aby ustawić przestrzeń nazw dla bieżącego żądania, użyj flagi --namespace
.
Na przykład:
kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>
Ustawianie preferencji przestrzeni nazw
Możesz na stałe zapisać przestrzeń nazw dla wszystkich kolejnych poleceń kubectl w tym kontekście.
kubectl config set-context --current --namespace=<insert-namespace-name-here>
# Validate it
kubectl config view --minify | grep namespace:
Przestrzenie nazw i DNS
Kiedy tworzysz Service, tworzy on
odpowiadający mu rekord DNS.
Ten wpis ma postać <service-name>.<namespace-name>.svc.cluster.local
, co oznacza,
że jeśli kontener używa tylko <service-name>
, odwołuje się on do usługi lokalnej
dla danego namespace'a. Jest to przydatne do używania tej samej konfiguracji w
wielu namespace'ach, takich jak Development, Staging i Production. Jeśli chcesz uzyskać dostęp
do zasobów między namespace'ami, musisz użyć w pełni kwalifikowanej nazwy domeny (FQDN).
W związku z tym, wszystkie nazwy przestrzeni nazw muszą być zgodne z etykietami DNS RFC 1123.
Ostrzeżenie:
Poprzez tworzenie przestrzeni nazw o takiej samej nazwie jak publiczne domeny najwyższego poziomu, usługi w tych przestrzeniach nazw mogą mieć krótkie nazwy DNS, które pokrywają się z publicznymi rekordami DNS. Zapytania DNS wykonywane przez workloady z dowolnej przestrzeni nazw, bez kończącej kropki, będą przekierowane do tych usług, mając pierwszeństwo przed publicznym wpisem DNS.
Aby temu zapobiec, ogranicz uprawnienia do tworzenia przestrzeni nazw dla zaufanych użytkowników. Jeśli to konieczne, możesz dodatkowo skonfigurować zewnętrzne mechanizmy kontroli bezpieczeństwa, takie jak admission webhooks, aby zablokować tworzenie jakiejkolwiek przestrzeni nazw o nazwie z listy domen najwyższego poziomu (ang. TLD - Top-Level Domain).
Nie wszystkie obiekty znajdują się w przestrzeni nazw.
Większość zasobów Kubernetesa (np. pody, usługi, kontrolery replikacji i inne) znajduje się w jakiś przestrzeniach nazw. Jednak zasoby przestrzeni nazw nie są same w sobie w przestrzeni nazw. Zasoby niskiego poziomu, takie jak węzły i persistentVolumes, nie znajdują się w żadnej przestrzeni nazw.
Aby zobaczyć, które zasoby Kubernetesa znajdują się w przestrzeni nazw, a które nie:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
Automatyczne etykietowanie
Kubernetes 1.22 [stable]
Warstwa sterowania Kubernetesa ustawia niezmienną
etykietę kubernetes.io/metadata.name
na
wszystkich przestrzeniach nazw. Wartością etykiety jest nazwa przestrzeni nazw.
Co dalej?
- Dowiedz się więcej o tworzeniu przestrzeni nazw.
- Dowiedz się więcej o usuwaniu przestrzeni nazw.