Wie listet man alle Container in einem Kubernetes-Pod sauber auf?


82

Ich möchte alle Container in einem Pod in einem Skript auflisten, das die Protokolle nach dem Ausführen eines Tests sammelt. kubectl describe pods -l k8s-app=kube-dnsgibt viele Informationen zurück, aber ich suche nur nach einer Rückgabe wie:

etcd
kube2sky
skydns

Ich sehe keine einfache Möglichkeit, die Beschreibungsausgabe zu formatieren. Gibt es einen anderen Befehl? (und ich denke, im schlimmsten Fall wird die Ausgabe von description immer analysiert).

Antworten:


58

Sie können geteine der unterstützten Ausgabevorlagen mit dem Flag --output( -o) verwenden und auswählen .

Nehmen Sie jsonpathzum Beispiel, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}gibt Ihnen etcd kube2sky skydns.

Andere unterstützte Ausgabe-Ausgabe-Vorlagen sind go-template, go-template-file und jsonpath-file. Informationen zur Verwendung der jsonpath-Vorlage finden Sie unter http://kubernetes.io/docs/user-guide/jsonpath/ . Informationen zur Verwendung der go-Vorlage finden Sie unter https://golang.org/pkg/text/template/#pkg-overview .

Update: In diesem Dokument finden Sie weitere Beispielbefehle zum Auflisten von Container-Images: https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/


3
Wenn Sie die JSON-Ausgabe sehen möchten, verwenden Sie kubectl get pods -o json.
Janetkuo

19
Wenn Sie mit einem bestimmten Pod arbeiten, lautet der Befehlkubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
Charles L.

66

Antworten

kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'

Erläuterung

Dadurch wird das JSON-Objekt abgerufen, das den Pod darstellt. Anschließend wird der JSONpath von kubectl verwendet , um den Namen jedes Containers aus dem Pod zu extrahieren.


27

Schneller Hack, um zu vermeiden, dass die JSONpath-Abfrage für einen einzelnen Pod erstellt wird:

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]

Diese Antwort ist genau das, was es sagt .. ein schneller Hack. Wirklich nützlich :) Kann natürlich nicht in einem Skript verwendet werden. Es dient der Anforderung.
Rakesh N

Neueste gibt auch beide containersundinit containers
Neo

@Neo sehe ich nicht init containersso auf v1.18.8 :(
subtleseeker

10

Ich habe einige Ideen wie folgt zusammengestellt:

Einfache Linie:

kubectl get po -o jsonpath='{range .items[*]}{"pod: "}{.metadata.name}{"\n"}{range .spec.containers[*]}{"\tname: "}{.name}{"\n\timage: "}{.image}{"\n"}{end}'

Split (zur besseren Lesbarkeit):

kubectl get po -o jsonpath='
    {range .items[*]}
    {"pod: "}
    {.metadata.name}
    {"\n"}{range .spec.containers[*]}
    {"\tname: "}
    {.name}
    {"\n\timage: "}
    {.image}
    {"\n"}
    {end}'

@EzLo Ich bin mir nicht sicher, ob mir das einzeilige Format besser gefällt. Ich bin kein Fan von Scrollen.
Shawn

Sie können beide Alternativen zeigen. Fühlen Sie sich frei, zurück zu wechseln, wenn Sie wollen. Die Verwendung der Code-Formatierung (STRG + K) ist aufgrund der Typografie für Code normalerweise besser als das Anführungszeichen (STRG + Q).
EzLo

Gibt es eine Möglichkeit, den Pod-Namen für jeden Container in diesem Format aufzulisten?
Sam Thomas

Um das Scrollen und die manuelle Suche zu vermeiden, leiten Sie es an lessoder an vi: COMMAND | less odervi<(COMMAND)
Sergey Smolnikov

Scrollen bei Stapelüberlauf @SergeySmolnikov
Shawn

7

Wenn Sie eine eindeutige Ausgabe der Container von jedem Pod wünschen

kubectl get po -l k8s-app=kube-dns \
   -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name

2

Wenn Sie jsonals Ausgabeformat von verwenden, erhalten kubectl getSie viele Details von a pod. Mit jsonProzessoren wie ist jqes einfach, bestimmte Teile auszuwählen oder zu filtern, an denen Sie interessiert sind.

Um die Container eines Pods jqaufzulisten, sieht die Abfrage folgendermaßen aus:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq --raw-output '.items[].spec.containers[].name'

Wenn Sie alle Details zu einem bestimmten Container anzeigen möchten, versuchen Sie Folgendes:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq '.items[].spec.containers[] | select(.name=="etcd")'

1

Ich benutze dies, um Bildversionen auf den Pods anzuzeigen.

kubectl get pods  -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{end}{end}' && printf '\n'

Es ist nur eine kleine Änderung des Skripts von hier aus , mit dem Hinzufügen einer neuen Zeile zum Starten des nächsten Konsolenbefehls in der neuen Zeile, Entfernen von Kommas am Ende jeder Zeile und Auflisten nur meiner Pods ohne Service-Pods (z. B. --all-namespacesOption wird entfernt).


0

Verwenden Sie den folgenden Befehl, um alle Informationen eines bestimmten Pods anzuzeigen

kubectl get pod <pod name> -n <namespace name> -o yaml

0

Verwenden Sie diesen Befehl, um ausführliche Informationen zusammen mit Konfigurationszuordnungen aller Container in einem bestimmten Pod anzuzeigen: kubectl describe pod/<pod name> -n <namespace name>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.