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

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/


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.


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]

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

@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

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

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


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

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.