kalafoto - stock.adobe.com
Anleitung für das Verwalten von Namespaces in Kubernetes
Mit Namensräumen teilen Sie Bereiche eines Kubernetes-Clusters logisch ab. Erfahren Sie in diesem Artikel wie Sie Namespaces in Kubernetes verwalten und ihnen Kontingente zuweisen.
Kubernetes-Namespaces, auch bekannt als Namensräume, teilen einen Kubernetes-Cluster in logisch isolierte Bereiche. Auf diese Weise organisieren IT-Teams die Ressourcen der Kubernetes-Infrastruktur so, dass verschiedene Benutzer und Teams zusammenarbeiten können, während die Umgebungen trotzdem getrennt bleiben.
Mit Namensräumen isolieren IT-Teams beispielsweise Entwicklungs-, Test- und Produktionsumgebungen logisch. Sie bieten auch administrative Kontrolle, da Administratoren Beschränkungen und Grenzen für Ressourcenkontingente einrichten können.
Wenn Sie zum ersten Mal einen Kubernetes-Cluster einrichtet, erstellt der Orchestrator automatisch vier Namensräume:
- Standard. Alle Ressourcenbereitstellungen ohne Namespace werden hier bereitgestellt.
- Kube-System. Dieser Namensraum enthält Kubernetes-Systemkonfigurationen und -Bereitstellungen, die für das Cluster wichtig sind.
- kube-public. Dieser Namespace steht allen Benutzern mit schreibgeschütztem Zugriff offen, ist jedoch für die Systemnutzung reserviert.
- kube-node-lease. Alle Knoten haben ein zugehöriges Lease-Objekt in diesem Namensraum. Ein Lease steigert die Leistung der Knoten-Heartbeats – Nachrichten, die Knoten an den Knoten-Controller senden, um die Verfügbarkeit anzuzeigen – während der Kubernetes-Cluster skaliert.
Lassen Sie uns tiefer in die Arbeit mit Namensräumen einsteigen. Als Voraussetzung muss ein Kubernetes-Cluster eingerichtet sein und ausgeführt werden, bevor Sie die Befehle ausführen.
Namensräume abfragen
Führen Sie die folgenden Befehle aus, um die Liste aller Namespaces oder einen bestimmten Namespace in Kubernetes zu erhalten:
kubectl get namespaces
kubectl get namespaces <Name des Namensraums>
Dadurch wird eine Ausgabe ähnlich der in Abbildung 1 erzeugt.
Ausführlichere Informationen zu einem Namespace erhalten Sie mit dem Befehl describe:
kubectl describe namespaces <Name des Namensraums>
Dies fügt der Ausgabe mehr Ausführlichkeit mit Anmerkungen, Beschriftungen und Ressourcenkontingenten und -grenzen hinzu.
Ressourcen in Namespaces erstellen
Um eine Ressource in einem bestimmten, bereits vorhandenen Namespace zu erstellen, übergeben Sie den Namen des Namespace als Argument an den Parameter -n oder --namespace im Befehl:
kubectl create deployment my-nginx --image nginx --namespace webserver
Die Ausgabe sollte ähnlich wie in Abbildung 3 aussehen.
Ressourcen aus allen Namespaces auflisten
Der Switch-Parameter --all-namespaces listet alle Ressourcen in allen Namensräumen auf, wie im folgenden Befehl:
kubectl get pods --all-namespaces
Dies erstellt eine Liste aller Pods, die in allen Namespaces in Kubernetes laufen.
Mit dieser Methode bekommen Sie aber nicht alle Ressourcen in Kubernetes angezeigt; es fehlen diejenigen, die sich außerhalb eines Namensraums befinden – das sind zum Beispiel sind Low-Level-Ressourcen wie Knoten, Clusterrollen und persistente Volumes. Geben Sie den folgenden Befehl aus, um alle derartigen Ressourcen ohne Namespace aufzulisten:
kubectl api-resources --namespaced=false
Die Ausgabe sollte ähnlich wie der Screenshot in Abbildung 5 aussehen, der auch zeigt, dass Namespaces – selbst –in keinem Namespace enthalten sind.
Namespace-Präferenz festlegen
IT-Administratoren können eine Namespace-Präferenz für alle nachfolgend ausgeführten Befehle festlegen, die sie sich merken sollen. Dadurch entfällt die Notwendigkeit, Namespace-Namen mit allen kubectl-Befehlen explizit zu definieren:
kubectl config set-context --current --namespace=<name of namespace>
Siehe beispielsweise Abbildung 6, die einen Webserver-Namespace enthält.
Erstellen Sie einen neuen Namensraum
Namensräumen sind recht einfach zu erstellen: Führen Sie den Befehl kubectl create namespace <Name des Namensraums> aus und fügen Sie den Namen des neuen Namespaces ein, wie in Abbildung 7 gezeigt. Beachten Sie, dass Namensräume nicht hierarchisch sind; Sie können keinen Namespace innerhalb eines anderen Namespace erstellen.
Alternativ können Sie eine YAML-Datei verwenden, um einen Namespace zu erstellen. Richten Sie eine Datei namespace.yml mit den folgenden Deklarationen ein.
Einen Namensraum löschen
Sie löschen einen Namespace mit dem Befehl
kubectl delete namespaces <name of namespace>
asynchron, so dass auch alle Kubernetes-Ressourcen unter dem Namespace gelöscht werden.
Ressourcenkontingente für Namespaces konfigurieren
Kubernetes-Administratoren können Namespaces verwenden, um die Ressourcenzuweisung zu steuern, um zum Beispiel um ein Ressourcenkontingent für einen Namespace zu konfigurieren, erstellen Sie zunächst eine YAML-Datei wie folgt, und definieren Sie harte Grenzen für Anforderungen unter dem Ziel-Namespace und eine Ressourcenobergrenze für Arbeitsspeicher und CPU.
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-quota
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
Wenden Sie dann diese Ressourcenkontingentkonfiguration mit dem folgenden Befehl auf den Namespace an:
kubectl apply -f quota.yml --namespace demo
kubectl describe resourcequota mem-cpu-quota --namespace demo
Die Ausgabe sollte wie in Abbildung 10 aussehen.
Um nun einen Pod in diesem Demo-Namespace zu platzieren und einige Ressourcen zuzuweisen, erstellen Sie eine YAML-Datei namens pods.yml mit den folgenden Einstellungen:
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: demo-container-1
image: nginx
resources:
limits:
memory: "900Mi"
cpu: "900m"
requests:
memory: "700Mi"
cpu: "600m"
Führen Sie die folgenden Befehle aus, um diese Pod-Konfiguration anzuwenden:
kubectl apply -f pods.yml --namespace demo
kubectl beschreiben resourcequota mem-cpu-quota --namespace demo
Einige der Ressourcen aus dem von uns definierten Kontingent sind dem neu erstellten Pod bereits zugewiesen.
Nachdem wir das Ressourcenkontingent für einen Namespace festgelegt und die Knoten erstellt haben, die dieses Kontingent nutzen werden, versuchen wir mit der Datei pod2.yml, einen weiteren Pod mit einer Ressource zu erstellen, der das eingerichtete Limit überschreiten würde:
apiVersion: v1
kind: Pod
metadata:
name: demo-pod-2
spec:
containers:
- name: demo-container-1
image: nginx
resources:
limits:
memory: "900Mi"
cpu: "900m"
requests:
memory: "700Mi"
cpu: "600m"
Wie Sie sehen, schlägt die Anfrage fehl und die Ausgabe teilt uns mit, dass wir das Kontigent überschritten haben.