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).
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/
kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'
Cela obtient l'objet JSON représentant le pod. Il utilise ensuite JSONpath de kubectl pour extraire le nom de chaque conteneur du conteneur.
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]
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
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}'
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")'
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).