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

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/


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 .


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]

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}'

@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

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")'

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


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>


1

Użyj poniższego polecenia:

kubectl get pods -o=custom-columns=PodName:.metadata.name,Containers:.spec.containers[*].name,Image:.spec.containers[*].image

0

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

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

0

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

logi kubectl -c -n


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.