Jak uporządkować listę wszystkich kontenerów w kapsule Kubernetes?

86

Chcę wyświetlić listę wszystkich kontenerów w kapsule w skrypcie, który zbiera dzienniki po uruchomieniu testu. kubectl describe pods -l k8s-app=kube-dnszwraca dużo informacji, ale szukam tylko zwrotu takiego jak:

etcd
kube2sky
skydns

Nie widzę prostego sposobu sformatowania opisanego wyniku. Czy jest inne polecenie? (i myślę, że najgorszym przypadkiem jest zawsze parsowanie wyniku opisania).

Charles L.
źródło

Odpowiedzi:

60

Możesz użyć geti wybrać jeden z obsługiwanych szablonów wyjściowych z flagą --output( -o).

Weź jsonpathna przykład, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}daje etcd kube2sky skydns.

Inne obsługiwane szablony wyjściowe to go-template, go-template-file, jsonpath-file. Zobacz http://kubernetes.io/docs/user-guide/jsonpath/, aby dowiedzieć się, jak używać szablonu jsonpath. Zobacz https://golang.org/pkg/text/template/#pkg-overview, aby dowiedzieć się, jak używać szablonu go.

Aktualizacja: sprawdź ten dokument, aby zobaczyć inne przykładowe polecenia do wyświetlania obrazów kontenerów: https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/

janetkuo
źródło
3
Jeśli chcesz zobaczyć dane wyjściowe json, użyj kubectl get pods -o json.
janetkuo
21
Jeśli pracujesz z konkretnym kapsułą, polecenie brzmikubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
Charles L.
OP był dla jednego konkretnego kapsuły
Olivera
70

Odpowiedź

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

Wyjaśnienie

Spowoduje to pobranie obiektu JSON reprezentującego pod. Następnie używa JSONpath kubectl do wyodrębnienia nazwy każdego kontenera z poda .

Cory Klein
źródło
27

Szybki hack, aby uniknąć konstruowania zapytania JSONpath dla pojedynczego poda:

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]
Borek Bernard
źródło
Ta odpowiedź jest dokładnie tym, co mówi ... szybki hack. Naprawdę przydatne :) Oczywiście nie można tego używać w skrypcie. Spełnia wymagania.
Rakesh N
Najnowszy zawiera również oba containersiinit containers
Neo
@Neo Nie widzę init containersw ten sposób w wersji 1.18.8 :(
subtleseeker
11

Połączyłem kilka pomysłów w następujące:

Prosta linia:

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

Podziel (dla czytelności):

kubectl get po -o jsonpath='
    {range .items[*]}
    {"pod: "}
    {.metadata.name}
    {"\n"}{range .spec.containers[*]}
    {"\tname: "}
    {.name}
    {"\n\timage: "}
    {.image}
    {"\n"}
    {end}'
Shawn
źródło
@EzLo Nie jestem pewien, czy bardziej podoba mi się format jednowierszowy. Nie jestem fanem przewijania.
Shawn
możesz pokazać obie alternatywy. Jeśli chcesz, możesz zmienić go z powrotem. Użycie formatowania kodu (CTRL + K) jest zwykle lepsze niż cudzysłowu (CTRL + Q) ze względu na typografię kodu.
EzLo
Czy istnieje sposób, aby wyświetlić nazwę poda dla każdego kontenera w tym formacie?
Sam Thomas
Aby uniknąć konieczności przewijania i ręcznego wyszukiwania - lessviCOMMAND | lessvi<(COMMAND)
prześlij
przewijanie przy przepełnieniu stosu @SergeySmolnikov
Shawn
7

jeśli chcesz mieć wyraźny wynik pokazujący, które kontenery pochodzą z każdego zasobnika

kubectl get po -l k8s-app=kube-dns \
   -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name
Gongora
źródło
2

Jeśli używasz jsonjako formatu wyjściowegokubectl get , otrzymasz wiele szczegółów dotyczących pliku pod. Dzięki jsontakim procesorom jqłatwo jest wybrać lub filtrować określone części, które Cię interesują.

Aby wyświetlić listę kontenerów kapsuły, należy wpisać jq zapytanie wygląda następująco:

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

Jeśli chcesz zobaczyć wszystkie szczegóły dotyczące jednego konkretnego kontenera, spróbuj czegoś takiego:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq '.items[].spec.containers[] | select(.name=="etcd")'
webwurst
źródło
1

Używam tego do wyświetlania wersji obrazów na strąkach.

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

To tylko mała modyfikacja skryptu stąd , z dodaniem nowej linii, aby rozpocząć następne polecenie konsoli w nowej linii, usuniętymi przecinkami na końcu każdej linii i wyświetleniem tylko moich podów, bez podów usług (np. --all-namespacesOpcja jest usunięta).

Dmitriy Popov
źródło
1

Aby zobaczyć szczegółowe informacje wraz z mapami konfiguracji wszystkich kontenerów w określonym pod, użyj tego polecenia: kubectl describe pod/<pod name> -n <namespace name>

Zaginiony na morzu
źródło
1

Użyj poniższego polecenia:

kubectl get pods -o=custom-columns=PodName:.metadata.name,Containers:.spec.containers[*].name,Image:.spec.containers[*].image
Sandeep Arora
źródło
0

Użyj poniższego polecenia, aby wyświetlić wszystkie informacje o konkretnym kapsule

kubectl get pod <pod name> -n <namespace name> -o yaml
Randil Tennakoon
źródło
0

Najłatwiejszy sposób na poznanie pojemników w kapsule:

logi kubectl -c -n

Srikanth Praveen
źródło
Uwaga: odpowiedzi, które są bardzo krótkie i / lub są pytaniami do autora, prawdopodobnie powinny być komentarzami. Potrzebujesz tylko 50 punktów rep, aby skomentować pytanie - czy możesz to tam przenieść?
Tyler2P