2015-11-25 29 views
22

Sto cercando di elencare tutti i contenitori in un pod in uno script che raccoglie i registri dopo aver eseguito un test. kubectl describe pods -l k8s-app=kube-dns restituisce un sacco di informazioni, ma io sono solo alla ricerca di un ritorno come:Come si elencano in modo pulito tutti i contenitori in un pod kubernetes?

etcd 
kube2sky 
skydns 

Non vedo un modo semplice per formattare l'output descrivere. C'è un altro comando? (e immagino che il caso peggiore sia sempre quello di analizzare l'output di descrivere).

risposta

21

È possibile utilizzare get e scegliere uno dei modelli di output supportati con il flag --output (-o).

Prendere jsonpath ad esempio, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name} fornisce etcd kube2sky skydns.

Altri modelli di output di output supportati sono go-template, go-template-file, jsonpath-file. Vedi http://kubernetes.io/docs/user-guide/jsonpath/ per come usare il template jsonpath. Vedi https://golang.org/pkg/text/template/#pkg-overview per come utilizzare go template.

+1

Se volete vedere l'uscita JSON, usate 'kubectl ottenere cialde -o json'. – janetkuo

+4

Se si sta lavorando con un pod specifico, il comando è 'kubectl get pods kube-dns-q2oh6 -o jsonpath = {. Spec.containers [*]. Name}' –

0

Se si utilizza json come formato di output di kubectl get si ottengono molti dettagli di un pod. Con json processori come jq è facile da selezionare o filtrare per alcune parti a cui è interessato

Per elencare i contenitori di un baccello query jq assomiglia a questo:.

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

Se volete vedere tutti i dettagli riguardanti uno specifico contenitore provare qualcosa di simile:

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

se si vuole un'uscita chiara delle quali contenitori sono gli uni dagli Pod

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

risposta

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

Spiegazione

Questo diventa l'oggetto JSON che rappresenta il pod. Quindi usa kubectl JSONpath per estrarre il nome di ciascun contenitore dal pod.

+0

Per chi ottiene 'nessuna corrispondenza trovata: jsonpath = {.spec.containers [*]. name} 'quando cercano di eseguire quel comando, prova ad eseguire' kubectl get pods POD_NAME_HERE -o jsonpath = '{. spec.containers [*]. name}' ' – Pauline

+0

Grazie @Pauline Ho aggiornato la risposta –

1

mod rapidamente per evitare la costruzione di query JSONpath per un singolo pod:

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