web-dev-qa-db-fra.com

Comment listez-vous proprement tous les conteneurs dans un pod Kubernetes?

Je cherche à répertorier tous les conteneurs d'un pod dans un script qui rassemble les journaux après l'exécution d'un test. kubectl describe pods -l k8s-app=kube-dns retourne beaucoup d’informations, mais je cherche simplement un retour comme:

etcd
kube2sky
skydns

Je ne vois pas un moyen simple de formater la sortie de description. Y a-t-il une autre commande? (et je suppose que dans le pire des cas, il y a toujours analyse de la sortie de describe).

52
Charles L.

Vous pouvez utiliser get et choisir l’un des modèles de sortie pris en charge avec le --output (-o) drapeau.

Prenons jsonpath par exemple, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name} vous donne etcd kube2sky skydns.

Les autres modèles de sortie pris en charge sont go-template, go-template-file, jsonpath-file. Voir http://kubernetes.io/docs/user-guide/jsonpath/ pour savoir comment utiliser le modèle jsonpath. Voir https://golang.org/pkg/text/template/#pkg-overview pour savoir comment utiliser le modèle go.

Mise à jour: recherchez dans cette documentation d'autres exemples de commandes pour répertorier les images de conteneur: https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/

41
janetkuo

Répondre

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

Explication

Cela obtient l'objet JSON représentant le pod. Il utilise ensuite JSONpath de kubectl pour extraire le nom de chaque conteneur du conteneur.

36
Cory Klein

Rapide pour éviter de construire la requête JSONpath pour un seul pod:

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

si vous voulez une sortie claire des conteneurs de chaque pod

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

Je rassemble quelques idées dans ce qui suit:

Ligne simple:

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

Split (pour la lisibilité):

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

Si vous utilisez json comme format de sortie de kubectl get vous obtenez beaucoup de détails sur un pod. Avec json processeurs tels que jq , il est facile de sélectionner ou de filtrer certaines parties qui vous intéressent.

Pour lister les conteneurs d'un pod, la requête jq ressemble à ceci:

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

Si vous voulez voir tous les détails concernant un conteneur spécifique, essayez quelque chose comme ceci:

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

J'utilise ceci pour afficher les versions des images sur les pods.

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

C'est juste une petite modification du script de ici , avec l'ajout d'une nouvelle ligne pour démarrer la commande suivante de la console sur la nouvelle ligne, les virgules supprimées à la fin de chaque ligne et la liste de mes pods uniquement, sans les pods de service (par exemple --all-namespaces l'option est supprimée).

0
Dmitriy Popov