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.

Abbildung 1: Eine Liste der Kubernetes-Namensräume
Abbildung 1: Eine Liste der Kubernetes-Namensräume

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.

Abbildung 2: Beschreibung von Kubernetes-Namenräumen
Abbildung 2: Beschreibung von Kubernetes-Namenräumen

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.

Abbildung 3: Leiten Sie den Namensraum an das Argument weiter.
Abbildung 3: Leiten Sie den Namensraum an das Argument weiter.

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.

Abbildung 4: Ressourcen in allen Namensräumen.
Abbildung 4: Ressourcen in allen Namensräumen.

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.

Abbildung 5: Ressourcen Außerhalb von Namensräumen.
Abbildung 5: Ressourcen Außerhalb von Namensräumen.

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.

Abbildung 6: Konfigurieren Sie Einstellungen für den Namensraum.
Abbildung 6: Konfigurieren Sie Einstellungen für den Namensraum.

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.

Abbildung 7: Errichten Sie einen Kubernetes-Namensraum
Abbildung 7: Errichten Sie einen Kubernetes-Namensraum

Alternativ können Sie eine YAML-Datei verwenden, um einen Namespace zu erstellen. Richten Sie eine Datei namespace.yml mit den folgenden Deklarationen ein.

Abbildung 8: So erstellen Sie einen Namensraum über eine YAML-Datei.
Abbildung 8: So erstellen Sie einen Namensraum über eine YAML-Datei.

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.

Abbildung 9: Entfernen Sie einen Namensraum.
Abbildung 9: Entfernen Sie einen Namensraum.

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.

Abbildung 10: Weisen Sie dem Namespace ein Ressourcenkontingent zu.
Abbildung 10: Weisen Sie dem Namespace ein Ressourcenkontingent zu.

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.

Abbildung 11: Wenden Sie die Pod-Konfiguration an.
Abbildung 11: Wenden Sie die Pod-Konfiguration an.

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.

Abbildung 12: Die Anfrage scheitert, da das Kontingent überschritten wurde.
Abbildung 12: Die Anfrage scheitert, da das Kontingent überschritten wurde.

Erfahren Sie mehr über Server- und Desktop-Virtualisierung