Kapitel 4. Allgemeine kubectl-Befehle

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

Das Kommandozeilenprogramm kubectl ist ein mächtiges Werkzeug. In den folgenden Kapiteln wirst du es verwenden, um Objekte zu erstellen und mit der Kubernetes-API zu interagieren. Zuvor ist es jedoch sinnvoll, die grundlegenden kubectl Befehle durchzugehen, die für alle Kubernetes-Objekte gelten.

Namensräume

Kubernetes verwendet Namensräume, um Objekte im Cluster zu organisieren. Du kannst dir jeden Namensraum als einen Ordner vorstellen, der eine Reihe von Objekten enthält. Standardmäßig interagiert das Kommandozeilenwerkzeug kubectl mit dem Namensraum default. Wenn du einen anderen Namensraum verwenden möchtest, kannst dukubectl das Flag --namespace übergeben. Ein Beispiel, kubectl --namespace=mystuff referenziert Objekte im Namensraum mystuff. Wenn du dich kurz fassen willst, kannst du auch die Abkürzung-n verwenden. Wenn du mit allen Namensräumen interagieren willst - zum Beispiel, um alle Pods in deinem Cluster aufzulisten - kannst du das Flag --all-namespacesübergeben.

Kontexte

Wenn du den Standard-Namensraum dauerhaft ändern willst, kannst du einen Kontext verwenden. Dieser wird in einer kubectl Konfigurationsdatei gespeichert, die sich normalerweise unter $HOME/.kube/config befindet. In dieser Konfigurationsdatei wird auch gespeichert, wie du deinen Cluster finden und dich bei ihm authentifizieren kannst. Du kannst zum Beispiel einen Kontext mit einem anderen Standard-Namensraum für deine kubectl Befehle erstellen:

$ kubectl config set-context my-context --namespace=mystuff

Dadurch wird ein neuer Kontext erstellt, aber er wird noch nicht wirklich verwendet. Um diesen neu erstellten Kontext zu verwenden, kannst du ihn ausführen:

$ kubectl config use-context my-context

Kontexte können auch verwendet werden, um verschiedene Cluster oder verschiedene Benutzer für die Authentifizierung an diesen Clustern zu verwalten, indem die Flags --users oder--clusters mit dem Befehl set-context verwendet werden.

Kubernetes-API-Objekte anzeigen

Alles, was in Kubernetes enthalten ist, wird durch eine RESTful-Ressource repräsentiert. In diesem Buch bezeichnen wir diese Ressourcen als Kubernetes-Objekte. Jedes Kubernetes-Objekt existiert unter einem eindeutigen HTTP-Pfad; zum Beispiel führt https://your-k8s.com/api/v1/namespaces/default/pods/my-pod zur Darstellung eines Pods im Standard-Namensraum namens my-pod. Der Befehl kubectl stellt HTTP-Anfragen an diese URLs, um auf die Kubernetes-Objekte zuzugreifen, die sich unter diesen Pfaden befinden.

Der grundlegendste Befehl zum Anzeigen von Kubernetes-Objekten über kubectl ist get. Wenn du den Befehl kubectl get <resource-name>aufrufst, erhältst du eine Liste aller Ressourcen im aktuellen Namensraum. Wenn du eine bestimmte Ressource abrufen willst, kannst du den Befehl kubectl get <resource-name> <obj-name>.

Standardmäßig verwendet kubectl einen menschenlesbaren Drucker für die Anzeige der Antworten vom API-Server, aber dieser menschenlesbare Drucker entfernt viele Details der Objekte, damit jedes Objekt in eine Terminalzeile passt. Eine Möglichkeit, etwas mehr Informationen zu erhalten, besteht darin, das Flag -o wide hinzuzufügen, das mehr Details in einer längeren Zeile anzeigt. Wenn du das komplette Objekt sehen willst, kannst du dir die Objekte auch als JSON oder YAML anzeigen lassen, indem du die Flags -o json bzw. -o yaml verwendest.

Eine gängige Option zur Bearbeitung der Ausgabe von kubectl ist das Entfernen der Kopfzeilen, was oft nützlich ist, wenn kubectl mit Unix-Pipes kombiniert wird (z. B. kubectl ... | awk ...). Wenn du das Flag --no-headers angibst, überspringt kubectl die Kopfzeilen am Anfang der menschenlesbaren Tabelle.

Eine weitere häufige Aufgabe ist das Extrahieren bestimmter Felder aus dem Objekt. kubectl verwendet die Abfragesprache JSONPath, um Felder im zurückgegebenen Objekt auszuwählen. Die vollständigen Details von JSONPath liegen außerhalb des Rahmens dieses Kapitels, aber als Beispiel wird dieser Befehl die IP-Adresse des angegebenen Pods extrahieren und ausgeben:

$ kubectl get pods my-pod -o jsonpath --template={.status.podIP}

Du kannst auch mehrere Objekte verschiedener Typen anzeigen, indem du zum Beispiel eine durch Komma getrennte Liste von Typen verwendest:

$ kubectl get pods,services

Damit werden alle Pods und Dienste für einen bestimmten Namensraum angezeigt.

Wenn du an genaueren Informationen über ein bestimmtes Objekt interessiert bist, benutze den Befehl describe:

$ kubectl describe <resource-name> <obj-name>

So erhältst du eine ausführliche, mehrzeilige, von Menschen lesbare Beschreibung des Objekts sowie aller anderen relevanten, verwandten Objekte und Ereignisse im Kubernetes-Cluster.

Wenn du eine Liste der unterstützten Felder für jeden unterstützten Typ von Kubernetes-Objekten sehen möchtest, kannst du den Befehl explain verwenden:

$ kubectl explain pods

Manchmal möchtest du den Zustand einer bestimmten Kubernetes-Ressource kontinuierlich beobachten, um Änderungen an der Ressource zu sehen, sobald sie auftreten. Du könntest zum Beispiel darauf warten, dass deine Anwendung neu gestartet wird. Das --watchFlag ermöglicht dies. Du kannst dieses Flag zu jedem kubectl get Befehl hinzufügen, um den Status einer bestimmten Ressource kontinuierlich zu überwachen.

Erstellen, Aktualisieren und Zerstören von Kubernetes-Objekten

Objekte in der Kubernetes-API werden als JSON- oder YAML-Dateien dargestellt. Diese Dateien werden entweder vom Server als Antwort auf eine Anfrage zurückgegeben oder als Teil einer API-Anfrage an den Server gesendet. Du kannst diese YAML- oder JSON-Dateien verwenden, um Objekte auf dem Kubernetes-Server zu erstellen, zu aktualisieren oder zu löschen.

Nehmen wir an, du hast ein einfaches Objekt in obj.yaml gespeichert. Du kannst kubectl verwenden, um dieses Objekt in Kubernetes zu erstellen, indem du ausführst:

$ kubectl apply -f obj.yaml

Beachte, dass du unter den Ressourcentyp des Objekts nicht angeben musst; er wird aus der Objektdatei selbst ermittelt.

Nachdem du Änderungen an dem Objekt vorgenommen hast, kannst du den Befehl apply erneut verwenden, um das Objekt zu aktualisieren:

$ kubectl apply -f obj.yaml

Das Tool apply ändert nur Objekte, die sich von den aktuellen Objekten im Cluster unterscheiden. Wenn die Objekte, die du erstellst, bereits im Cluster vorhanden sind, wird es einfach erfolgreich beendet, ohne irgendwelche Änderungen vorzunehmen. Das macht es nützlich für Schleifen, in denen du sicherstellen willst, dass der Zustand des Clusters mit dem Zustand des Dateisystems übereinstimmt. Du kannst apply wiederholt verwenden, um den Status abzugleichen.

Wenn du sehen willst, was der Befehl apply bewirkt, ohne die Änderungen tatsächlich vorzunehmen, kannst du das Flag --dry-run verwenden, um die Objekte auf dem Terminal auszudrucken, ohne sie tatsächlich an den Server zu senden.

Hinweis

Wenn du Lust hast, interaktive Änderungen vorzunehmen, anstatt eine lokale Datei zu bearbeiten, kannst du stattdessen den Befehl edit verwenden, der den aktuellen Objektstatus herunterlädt und dann einen Editor startet, der die Definition enthält:

$ kubectl edit <resource-name> <obj-name>

Nachdem du die Datei gespeichert hast, wird sie automatisch zurück in den Kubernetes-Cluster hochgeladen.

Der Befehl apply zeichnet auch die Historie der vorherigen Konfigurationen in einer Anmerkung innerhalb des Objekts auf. Du kannst diese Aufzeichnungen mit den Befehlenedit-last-applied, set-last-applied und view-last-applied bearbeiten. Zum Beispiel:

$ kubectl apply -f myobj.yaml view-last-applied

zeigt dir den letzten Zustand, der auf das Objekt angewendet wurde.

Wenn du ein Objekt löschen willst, kannst du es einfach ausführen:

$ kubectl delete -f obj.yaml

Es ist wichtig zu wissen, dass kubectl dich nicht auffordert, den Löschvorgang zu bestätigen. Sobald du den Befehl gibst, wird das Objekt gelöscht.

Genauso kannst du ein Objekt mit Hilfe des Ressourcentyps und des Namens löschen:

$ kubectl delete <resource-name> <obj-name>

Objekte beschriften und annotieren

Labels und Annotationen sind Tags für deine Objekte. Wir werden die Unterschiede in Kapitel 6 besprechen, aber bis dahin kannst du die Labels und Annotationen für jedes Kubernetes-Objekt mit den Befehlen label und annotate aktualisieren. Um zum Beispiel das Label color=red zu einem Pod mit dem Namen bar hinzuzufügen, kannst du den Befehl ausführen:

$ kubectl label pods bar color=red

Die Syntax für Anmerkungen ist identisch.

In der Standardeinstellung lassen label und annotate nicht zu, dass du ein bestehendes Etikett überschreibst. Um dies zu tun, musst du das Flag --overwrite hinzufügen.

Wenn du ein Etikett entfernen möchtest, kannst du die <label-name>- Syntax verwenden:

$ kubectl label pods bar color-

Dadurch wird das Label color von dem Pod namens bar entfernt.

Debugging-Befehle

kubectl stellt auch eine Reihe von Befehlen zum Debuggen deiner Container zur Verfügung. Du kannst die folgenden Befehle verwenden, um die Logs für einen laufenden Container einzusehen:

$ kubectl logs <pod-name>

Wenn du mehrere Container in deinem Pod hast, kannst du den Container, der angezeigt werden soll, mit dem -c Flag auswählen.

Standardmäßig listet kubectl logs die aktuellen Logs auf und beendet sich. Wenn du stattdessen die Protokolle kontinuierlich an das Terminal zurückschicken möchtest, ohne das Programm zu beenden, kannst du das Kommandozeilen-Flag -f (follow) hinzufügen.

Du kannst auch den Befehl exec verwenden, um einen Befehl in einem laufenden Container auszuführen:

$ kubectl exec -it <pod-name> -- bash

Dadurch wird dir eine interaktive Shell innerhalb des laufenden Containers zur Verfügung gestellt, damit du mehr Debugging durchführen kannst.

Wenn du in deinem Container keine Bash oder ein anderes Terminal zur Verfügung hast, kannst du jederzeit attach in den laufenden Prozess einbinden:

$ kubectl attach -it <pod-name>

Der Befehl attach ist ähnlich wie kubectl logs, ermöglicht es dir aber, Eingaben an den laufenden Prozess zu senden, vorausgesetzt, der Prozess ist so eingestellt, dass er von der Standardeingabe liest.

Mit dem Befehl cp kannst du auch Dateien in und aus einem Container kopieren:

$ kubectl cp <pod-name>:</path/to/remote/file> </path/to/local/file>

Damit kopierst du eine Datei von einem laufenden Container auf deinen lokalen Rechner. Du kannst auch Verzeichnisse angeben oder die Syntax umkehren, um eine Datei von deinem lokalen Rechner zurück in den Container zu kopieren.

Wenn du über das Netzwerk auf deinen Pod zugreifen möchtest, kannst du den Befehl port-forward verwenden, um den Netzwerkverkehr von deinem lokalen Rechner zum Pod weiterzuleiten. Auf diese Weise kannst du den Netzwerkverkehr sicher zu Containern tunneln, die im öffentlichen Netzwerk nicht sichtbar sind. Zum Beispiel mit dem folgenden Befehl:

$ kubectl port-forward <pod-name> 8080:80

öffnet eine Verbindung, die den Datenverkehr vom lokalen Rechner auf Port 8080 an den Remote-Container auf Port 80 weiterleitet.

Hinweis

Sie können den Befehl port-forward auch mit Diensten verwenden, indem Sie services/<service-name> anstelle von <pod-name>angibst, beachte aber, dass bei der Portweiterleitung an einen Dienst die Anfragen immer nur an einen einzelnen Pod in diesem Dienst weitergeleitet werden. Sie werden nicht durch den Load Balancer des Dienstes geleitet.

Wenn du dir Kubernetes-Ereignisse ansehen möchtest, kannst du den Befehl kubectl get events verwenden, um eine Liste der letzten 10 Ereignisse für alle Objekte in einem bestimmten Namensraum zu sehen:

$ kubectl get events

Du kannst Ereignisse auch streamen, wenn sie passieren, indem du --watch zum Befehl kubectl get events hinzufügst. Wenn du Ereignisse in allen Namensräumen sehen willst, kannst du auch -A hinzufügen.

Wenn du dich dafür interessierst, wie dein Cluster die Ressourcen nutzt, kannst du mit den Befehl top verwenden, um die Liste der von den Knoten oder Pods genutzten Ressourcen anzuzeigen. Dieser Befehl:

$ kubectl top nodes

zeigt die gesamte CPU- und Speichernutzung der Knoten sowohl in absoluten Einheiten (z. B. Kerne) als auch in Prozent der verfügbaren Ressourcen (z. B. Gesamtzahl der Kerne) an. Ähnlich verhält es sich mit diesem Befehl:

$ kubectl top pods

werden alle Pods und ihre Ressourcennutzung angezeigt. Standardmäßig werden nur Pods im aktuellen Namensraum angezeigt, aber du kannst das Flag --all-namespaces hinzufügen, um die Ressourcennutzung aller Pods im Cluster anzuzeigen.

Diese top Befehle funktionieren nur, wenn ein Metrik-Server in deinem Cluster läuft. Metrik-Server gibt es in fast jeder verwalteten Kubernetes-Umgebung und auch in vielen nicht verwalteten Umgebungen. Wenn diese Befehle fehlschlagen, kann es daran liegen, dass du einen Metrikserver installieren musst.

Cluster Management

Das Tool kubectl kann auch zur Verwaltung des Clusters selbst verwendet werden. Die häufigste Maßnahme zur Verwaltung des Clusters ist die Sperrung und Entleerung eines bestimmten Knotens. Wenn du einen Knoten abriegelst, verhinderst du, dass zukünftige Pods auf diesem Rechner eingeplant werden. Wenn du einen Knoten entleerst, entfernst du alle Pods, die derzeit auf diesem Rechner laufen. Ein guter Anwendungsfall für diese Befehle wäre das Entfernen eines physischen Rechners für Reparaturen oder Upgrades. In diesem Fall kannst du kubectl cordon gefolgt von kubectl drain verwenden, um den Rechner sicher aus dem Cluster zu entfernen. Sobald der Rechner repariert ist, kannst du mit kubectl uncordon die Pods-Planung für den Knoten wieder aktivieren. Es gibt keinen undrain Befehl; Pods werden natürlich auf dem leeren Node eingeplant, wenn sie erstellt werden. Wenn ein Knoten nur kurzzeitig betroffen ist (z. B. ein Neustart des Rechners), ist es in der Regel nicht nötig, den Knoten abzusperren oder zu entleeren; dies ist nur dann notwendig, wenn der Rechner so lange außer Betrieb ist, dass die Pods auf einen anderen Rechner verschoben werden sollen.

Automatische Befehlsvervollständigung

kubectl unterstützt die Integration in deine Shell, um die Tabulatorvervollständigung sowohl für Befehle als auch für Ressourcen zu aktivieren. Je nach deiner Umgebung musst du eventuell das Paket bash-completion installieren, bevor du die automatische Befehlsvervollständigung aktivierst. Du kannst dies mit dem entsprechenden Paketmanager tun:

# macOS
$ brew install bash-completion

# CentOS/Red Hat
$ yum install bash-completion

# Debian/Ubuntu
$ apt-get install bash-completion

Bei der Installation unter macOS solltest du die Anweisungen von brew befolgen, wie du die Tabulatorvervollständigung in deinem ${HOME}/.bash_profile aktivierst.

Sobald bash-completion installiert ist, kannst du es vorübergehend für dein Terminal aktivieren:

$ source <(kubectl completion bash)

Um dies automatisch für jedes Terminal zu machen, füge es zu deiner Datei ${HOME}/.bashrc hinzu:

$ echo "source <(kubectl completion bash)" >> ${HOME}/.bashrc

Wenn du zsh verwendest, kannst du ähnliche Anleitungen online finden.

Alternative Betrachtungsweisen für deinen Cluster

Zusätzlich zu kubectl gibt es weitere Tools für die Interaktion mit deinem Kubernetes-Cluster. So gibt es zum Beispiel Plug-ins für verschiedene Editoren, die Kubernetes und die Editorumgebung integrieren:

Wenn du einen verwalteten Kubernetes-Dienst nutzt, bieten die meisten von ihnen auch eine grafische Oberfläche für Kubernetes, die in ihre webbasierte Benutzeroberfläche integriert ist. Verwaltetes Kubernetes in der öffentlichen Cloud lässt sich auch mit ausgefeilten Überwachungs-Tools integrieren, mit denen du Einblicke in den Betrieb deiner Anwendungen gewinnen kannst.

Es gibt auch mehrere Open-Source-Grafikoberflächen für Kubernetes, darunter Rancher Dashboard und das Headlamp-Projekt.

Zusammenfassung

kubectl ist ein leistungsstarkes Tool für die Verwaltung deiner Anwendungen in deinem Kubernetes-Cluster. In diesem Kapitel wurden viele gängige Anwendungsfälle für das Tool erläutert, aber kubectl verfügt auch über eine umfangreiche integrierte Hilfe. Du kannst diese Hilfe mit aufrufen:

$ kubectl help

oder:

$ kubectl help <command-name>

Get Kubernetes: Up and Running, 3. Auflage now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.