¿Cómo se enumeran todos los contenedores en un pod de kubernetes?

82

Estoy buscando enumerar todos los contenedores en un pod en un script que recopila los registros después de ejecutar una prueba. kubectl describe pods -l k8s-app=kube-dnsdevuelve mucha información, pero solo estoy buscando una devolución como:

etcd
kube2sky
skydns

No veo una forma sencilla de formatear la salida de descripción. ¿Hay otro comando? (y supongo que en el peor de los casos siempre se analiza la salida de describe).

Charles L.
fuente

Respuestas:

58

Puede usar gety elegir una de las plantillas de salida admitidas con la marca --output( -o).

Toma, jsonpathpor ejemplo, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}te da etcd kube2sky skydns.

Otras plantillas de salida compatibles son go-template, go-template-file, jsonpath-file. Consulte http://kubernetes.io/docs/user-guide/jsonpath/ para saber cómo usar la plantilla jsonpath. Consulte https://golang.org/pkg/text/template/#pkg-overview para saber cómo usar la plantilla go.

Actualización: consulte este documento para ver otros comandos de ejemplo para enumerar imágenes de contenedores: https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/

janetkuo
fuente
3
Si desea ver la salida json, use kubectl get pods -o json.
janetkuo
19
Si está trabajando con un módulo específico, el comando eskubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
Charles L.
66

Responder

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

Explicación

Esto obtiene el objeto JSON que representa el pod. Luego usa JSONpath de kubectl para extraer el nombre de cada contenedor del pod.

Cory Klein
fuente
27

Truco rápido para evitar construir la consulta JSONpath para un solo pod:

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]
Borek Bernard
fuente
Esta respuesta es exactamente lo que dice ... un truco rápido. Realmente útil :) Por supuesto que no se puede usar en un tipo de script. Sirve al requerimiento.
Rakesh N
El último también da ambos containersyinit containers
Neo
@Neo No veo init containersde esta manera en v1.18.8 :(
subtleseeker
10

Reuní algunas ideas en lo siguiente:

Línea simple:

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

Dividir (para facilitar la lectura):

kubectl get po -o jsonpath='
    {range .items[*]}
    {"pod: "}
    {.metadata.name}
    {"\n"}{range .spec.containers[*]}
    {"\tname: "}
    {.name}
    {"\n\timage: "}
    {.image}
    {"\n"}
    {end}'
Shawn
fuente
@EzLo No estoy seguro de si me gusta más el formato de una sola línea. No soy fanático de tener que desplazarse.
Shawn
puede mostrar ambas alternativas. Siéntase libre de volver a cambiar si lo desea. Usar el formato de código (CTRL + K) suele ser mejor que las comillas (CTRL + Q) debido a la tipografía, para el código.
EzLo
¿Hay alguna forma de que pueda incluir el nombre del pod para cada contenedor en este formato?
Sam Thomas
Para evitar la necesidad de desplazamiento y búsqueda manual, lessviCOMMAND | lessvi<(COMMAND)
envíelo
desplazándose en el desbordamiento de pila @SergeySmolnikov
Shawn
7

si desea una salida clara de qué contenedores son de cada Pod

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

Si lo usa jsoncomo formato de salida kubectl get, obtendrá muchos detalles de un pod. Con jsonprocesadores como jqeste, es fácil seleccionar o filtrar ciertas partes que le interesan.

Para enumerar los contenedores de un pod, la jqconsulta se ve así:

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

Si desea ver todos los detalles sobre un contenedor específico, intente algo como esto:

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

Utilizo esto para mostrar versiones de imágenes en los pods.

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

Es solo una pequeña modificación del script desde aquí , con agregar una nueva línea para iniciar el siguiente comando de la consola en la nueva línea, eliminar las comas al final de cada línea y enumerar solo mis pods, sin los pods de servicio (por ejemplo --all-namespaces, se elimina la opción).

Dmitriy Popov
fuente
0

Utilice el siguiente comando para ver toda la información de un pod en particular

kubectl get pod <pod name> -n <namespace name> -o yaml
Randil Tennakoon
fuente
0

Para ver información detallada junto con los mapas de configuración de todos los contenedores en un pod en particular, use este comando: kubectl describe pod/<pod name> -n <namespace name>

Perdido en el mar
fuente