02: Namespace'y
Zarządzanie przestrzeniami nazw (Namespaces) w Kubernetes
10 min
Cel zadania
Celem zadania jest zrozumienie koncepcji przestrzeni nazw w Kubernetes oraz nauka podstawowych operacji związanych z ich tworzeniem i zarządzaniem.
Teoria
Przestrzenie nazw w Kubernetes
- Namespace: Wirtualny klaster wewnątrz klastra Kubernetes
- Izolacja: Oddzielenie zasobów i obiektów między różnymi projektami/zespołami
- Organizacja: Grupowanie powiązanych obiektów i zasobów
- Kontrola dostępu: Zarządzanie uprawnieniami na poziomie przestrzeni nazw
Domyślne przestrzenie nazw
- default: Domyślna przestrzeń dla obiektów bez określonego namespace
- kube-system: Systemowe komponenty Kubernetes
- kube-public: Zasoby publicznie dostępne
- kube-node-lease: Informacje o dostępności węzłów
Dlaczego Namespace?
- Izolacja multi-tenant — różne zespoły/projekty na tym samym klastrze, bez ryzyka konfliktów nazw
- Bezpieczeństwo — RBAC pozwala ograniczyć dostęp do konkretnych Namespace’ów
- Limity zasobów — ResourceQuota pozwala ograniczyć CPU/Memory per Namespace
- Organizacja — łatwiej zarządzać zasobami gdy są pogrupowane logicznie
graph TB
CLUSTER["Klaster Kubernetes"]
subgraph NS1["Namespace: dev"]
P1["Pod: frontend"]
P2["Pod: backend"]
S1["Service: api"]
end
subgraph NS2["Namespace: staging"]
P3["Pod: frontend"]
P4["Pod: backend"]
S2["Service: api"]
end
subgraph NS3["Namespace: prod"]
P5["Pod: frontend"]
P6["Pod: backend"]
S3["Service: api"]
end
CLUSTER --- NS1
CLUSTER --- NS2
CLUSTER --- NS3
style NS1 fill:#e3f2fd
style NS2 fill:#fff3e0
style NS3 fill:#e8f5e9
Każdy Namespace to osobny “wirtualny klaster” — te same nazwy obiektów mogą istnieć w różnych Namespace’ach bez konfliktu.
Przebieg ćwiczenia
- Utworzysz nową przestrzeń nazw
- Nauczysz się przełączać między przestrzeniami
- Utworzysz obiekty w różnych przestrzeniach
- Poznasz sposoby wyświetlania i filtrowania obiektów
- Nauczysz się usuwać przestrzenie nazw
Środowisko
Przed rozpoczęciem upewnij się, że:
- Masz działający klaster Kubernetes
- Masz zainstalowane narzędzie
kubectl- Masz odpowiednie uprawnienia do tworzenia namespaces
Zadanie 1: Podstawowe operacje na przestrzeniach nazw
1.1. Wyświetl istniejące przestrzenie nazw
kubectl get namespaces
Zobacz listę wszystkich przestrzeni nazw w klastrze
1.2. Utwórz nową przestrzeń nazw
kubectl create namespace dev-XX
Tworzy nową przestrzeń nazw o nazwie
dev-XX. Zamień XX na numer podany przez prowadzącego
1.3. Sprawdź szczegóły przestrzeni nazw
kubectl describe namespace dev-XX
Zobacz szczegółowe informacje o utworzonej przestrzeni nazw
1.4. Wyświetl przestrzeń nazw w formacie YAML
kubectl get namespace dev-XX -o yaml
Zobacz pełną definicję przestrzeni nazw w formacie YAML
Zadanie 2: Praca z obiektami w przestrzeniach nazw
2.1. Utwórz pod w określonej przestrzeni nazw
kubectl run nginx-pod-XX --image=nginx:latest --namespace=dev-XX
Tworzy pod nginx w przestrzeni nazw dev-XX
2.2. Wyświetl pody w przestrzeni nazw
kubectl get pods --namespace=dev-XX
Lista podów w określonej przestrzeni nazw
2.3. Wyświetl pody ze wszystkich przestrzeni nazw
kubectl get pods --all-namespaces
Zobacz pody ze wszystkich przestrzeni nazw
2.4. Utwórz przestrzeń nazw z pliku YAML
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: test-XX
EOF
Tworzy przestrzeń nazw używając definicji YAML
Zadanie 3: Przełączanie kontekstu przestrzeni nazw
3.1. Ustaw domyślną przestrzeń nazw
kubectl config set-context --current --namespace=dev-XX
Ustawia dev-XX jako domyślną przestrzeń nazw dla bieżącego kontekstu
3.2. Sprawdź bieżący kontekst
kubectl config view --minify | grep namespace:
Pokazuje aktualnie ustawioną przestrzeń nazw
3.3. Wyświetl obiekty bez podawania namespace
kubectl get pods
Teraz pokazuje pody z domyślnej przestrzeni nazw (dev-XX)
Zadanie 4: Czyszczenie zasobów
4.1. Usuń pojedynczy pod z przestrzeni nazw
kubectl delete pod nginx-pod-XX --namespace=dev-XX
Usuwa określony pod z przestrzeni nazw
4.2. Usuń przestrzeń nazw
kubectl delete namespace dev-XX
Usuwa przestrzeń nazw i wszystkie obiekty w niej zawarte
4.3. Usuń wszystkie zasoby z przestrzeni nazw
kubectl delete all --all --namespace=test-XX
Usuwa wszystkie zasoby z przestrzeni nazw, ale zachowuje samą przestrzeń
4.4. Ustaw przestrzeń nazw test-XX jako domyślną
kubectl config set-context --current --namespace=test-XX
Najczęstsze problemy
| Problem | Rozwiązanie |
|---|---|
| Brak uprawnień do tworzenia namespace | Sprawdź uprawnienia RBAC |
| Namespace nie może zostać usunięty | Sprawdź czy wszystkie zasoby zostały usunięte |
| Obiekty niewidoczne | Upewnij się, że używasz właściwej przestrzeni nazw |
| Konflikt nazw | Użyj unikalnych nazw z odpowiednim suffiksem -XX |
Dobre praktyki
- Używaj opisowych nazw przestrzeni
- dev-XX dla rozwoju
- prod-XX dla produkcji
- test-XX dla testów
- Stosuj etykiety (labels)
kubectl label namespace dev-XX environment=development team=teamXX - Regularnie sprawdzaj zasoby
kubectl get all --namespace=dev-XX - Dokumentuj przestrzenie nazw
kubectl annotate namespace dev-XX description="Przestrzeń developerska dla zespołu XX"
Podsumowanie
- Przestrzenie nazw zapewniają izolację zasobów
- Każdy obiekt musi należeć do jakiejś przestrzeni nazw
- Nazwy obiektów muszą być unikalne w ramach przestrzeni nazw
- Usunięcie przestrzeni nazw usuwa wszystkie obiekty w niej zawarte
- Używaj suffiksu -XX dla unikalności nazw
Przydatne skróty i wskazówki
- Krótsze polecenia z aliasami:
alias kn='kubectl get namespaces' alias kgpn='kubectl get pods --namespace' - Szybkie przełączanie kontekstu:
kubens dev-XX # wymaga narzędzia kubens - Sprawdzanie zasobów w przestrzeni nazw:
kubectl api-resources --namespaced=true kubectl api-resources --namespaced=false