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).

Charles L.
quelle

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/

janetkuo
quelle
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.

Cory Klein
quelle
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]
Borek Bernard
quelle
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}'
Shawn
quelle
@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
Gongora
quelle
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")'
Webwurst
quelle
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).

Dmitriy Popov
quelle
0

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

kubectl get pod <pod name> -n <namespace name> -o yaml
Randil Tennakoon
quelle
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>

Auf See verloren
quelle