Dans la documentation Kubernetes List All Container Images Running in a Cluster, nous pouvons lister tous les conteneurs par:
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ubuntu latest 3556258649b2 7 days ago 64.2 MB docker.io/alpine latest b7b28af77ffe 2 weeks ago 5.58 MB docker.io/centos latest 9f38484d220f 4 months ago 202 MB docker.io/hello-world latest fce289e99eb9 7 months ago 1.84 kB
Voici un exemple de sortie:
1 cdkbot/addon-resizer-amd64:1.8.1 1 cdkbot/hostpath-provisioner-amd64:1.0.0 1 cdkbot/registry-amd64:2.6 1 coredns/coredns:1.6.6 1 docker.io/cdkbot/addon-resizer-amd64:1.8.1 1 docker.io/cdkbot/hostpath-provisioner-amd64:1.0.0 1 docker.io/cdkbot/registry-amd64:2.6 1 docker.io/coredns/coredns:1.6.6 1 docker.io/grafana/grafana:6.4.3 2 docker.io/istio/citadel:1.5.1 2 docker.io/istio/examples-bookinfo-details-v1:1.15.0 2 docker.io/istio/examples-bookinfo-productpage-v1:1.15.0 2 docker.io/istio/examples-bookinfo-ratings-v1:1.15.0 2 docker.io/istio/examples-bookinfo-reviews-v1:1.15.0 2 docker.io/istio/examples-bookinfo-reviews-v2:1.15.0 2 docker.io/istio/examples-bookinfo-reviews-v3:1.15.0 2 docker.io/istio/galley:1.5.1 4 docker.io/istio/kubectl:1.5.1 4 docker.io/istio/mixer:1.5.1 2 docker.io/istio/pilot:1.5.1 34 docker.io/istio/proxyv2:1.5.1 2 docker.io/istio/sidecar_injector:1.5.1 2 docker.io/jaegertracing/all-in-one:1.16 1 docker.io/kubernetesui/dashboard:v2.0.0 1 docker.io/kubernetesui/metrics-scraper:v1.0.4 2 docker.io/library/nginx:latest 2 docker.io/prom/prometheus:v2.12.0 1 docker.io/radial/busyboxplus:curl 1 grafana/grafana:6.4.3 2 k8s.gcr.io/metrics-server-amd64:v0.2.1 1 kubernetesui/dashboard:v2.0.0 1 kubernetesui/metrics-scraper:v1.0.4 2 nginx 2 quay.io/kiali/kiali:v1.9 1 radial/busyboxplus:curl
Malheureusement, la taille de l'image du docker est manquante. Existe-t-il un moyen d'obtenir la taille de l'image du conteneur? Un peu comme l' docker image ls
. Copie de la sortie de cet exemple pour plus de commodité:
kubectl get pods --all-namespaces -o jsonpath="{..image}" |\ tr -s '[[:space:]]' '\n' |\ sort |\ uniq -c
3 Réponses :
Sur mon système k8s, kubectl describe pod ABC n'affiche pas la taille de l'image, mais vous pouvez créer un script qui:
Dans l'ensemble, cela ressemble à ceci:
docker image ls `kubectl get pod YOUR_POD_NAME_GOES_HERE -o jsonpath='{.spec.containers[0].image}'` --format='{{println .Size}}'
Les pods que j'utilise ont 1, 2, 3 conteneurs à l'intérieur. Avec 2, 3 la majorité des cas. Le type d'application que j'utilise a des conteneurs side-car injectés lorsque l'application est déployée.
Eh bien, dans ce cas, vous devrez légèrement modifier le script et utiliser -o jsonpath='{.spec.containers[1].image}'
ou ('2' ou '3' selon ce que vous voulez).
kubectl get pod my-nginx-5dc4865748-8cm8m -o jsonpath='{.spec.containers[0].image}'
renvoie nginx
comme nom d'image du docker. Cependant, lorsque docker image ls
autour d'elle comme vous le suggérez, le résultat est vide. Pour info, mon K8S est microk8s.
Nginx n'est probablement pas disponible dans le nœud sur lequel vous exécutez la commande. Essayez de voir sur quels nœuds le pod nginx a réellement été déployé ...
J'ai vérifié que l'image existe en exécutant kubectl get pod my-nginx-5dc4865748-8cm8m -o jsonpath='{.spec.containers[0].image}'
. Il s'agit d'une configuration à un seul nœud (microk8s). Toutes les commandes sont exécutées sur ce nœud unique (Ubuntu 20.04).
Et si vous exécutez des docker images | grep nginx
voyez-vous cette image? Je ne connais pas les microk8, désolé ...
Pas besoin de grep
, j'aurais été content de la sortie des docker images
. Il semble que docker ne voit aucune image.
Kubernetes ne fournit pas d'informations sur la taille de l'image dans ses sorties. Même si nous sommes en mesure d'obtenir une liste d'images s'exécutant dans un cluster, ce n'est pas un processus simple pour obtenir la taille d'une image dans un cluster à plusieurs nœuds. Mais dans les cas où nous exécutons un cluster à nœud unique, nous pourrions y parvenir en exécutant un conteneur docker ou DinD (Docker in Docker) dans le cluster Kubernetes. Pourtant, c'est une bonne approche à des fins de test uniquement. Je n'ai rien à dire sur l'exécution de ceci sur des environnements critiques. Ça dépend.
/var/lib/docker.sock
un pod en montant le fichier /var/lib/docker.sock
l'hôte à l'intérieur et exécutez comme indiqué ci-dessous.
$ kubectl exec -i dind -n dev sh -- docker images nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4571e56e27f0 11 hours ago 132MB $kubectl exec -i dind -n dev sh -- docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4571e56e27f0 21 hours ago 132MB
apiVersion: v1 kind: Pod metadata: labels: run: dind name: dind spec: containers: - image: docker:dind name: dind command: ["cat"] tty: true resources: {} volumeMounts: - mountPath: /var/run/docker.sock name: docker readOnly: true volumes: - name: docker hostPath: path: /var/run/docker.sock type: File dnsPolicy: ClusterFirst restartPolicy: Never status: {}
Merci, cela a l'air excitant. J'ai dû supprimer readOnly: true
(microk8s 1.18.3 signale une erreur "ValidationError (Pod.spec.volumes [0] .hostPath): champ inconnu" readOnly "dans io.k8s.api.core.v1.HostPathVolumeSource". Après cela , exec docker images ls
dans ce pod "dind" ne renvoie que la ligne d'en-tête. Aucune image docker n'est répertoriée.
@Polymerase J'ai mis à jour la réponse. Le readOnly: true
devrait venir sous volumeMounts
et la commande docker image ls
volumeMounts
les images.
supprimé + recréé le pod "dind". Ran kubectl exec -i dind sh -- docker image ls
(NOTE -n dev
supprimée). Même problème, seulement la ligne d'en-tête. Aucune image de docker n'a été trouvée et j'ai beaucoup de conteneurs dans divers pods. Quel est votre environnement K8S? Le mien est MicroK8S sur Ubuntu 20.04
@Polymerase J'utilise K8s v1.18.3 sur Minikube.
"K8s v1.18.3 sur Minikube" sur quel OS?
@Polymerase Mac OS Catalina.
Si vous disposez des autorisations appropriées, obtenez les nœuds et non les pods.
kubectl get nodes -o json | jq '.items[].status.images[] | .names[1], .sizeBytes'
Cette réponse semble être un bon début! Pensez à expliquer pourquoi les nœuds doivent être utilisés à la place des pods . Une autre bonne pratique pour donner des solutions en ligne de commande consiste à expliquer les différents composants de la commande que vous avez suggérée et les options utilisées.
Salut quelles ressources essayez-vous d'obtenir? CPU ? Mémoire seulement? tous les deux ?
@yAzou Liste les images du conteneur et la taille de chaque image.
J'ai précédemment posté une réponse à votre question mais j'ai réalisé que cela vous donnera la taille en mémoire des pods .... pas de l'image hébergée par chaque pods ... même si je pense que la différence entre eux n'est pas si importante ... je supprime ma réponse après avoir remarqué qu'elle ne vous donnera pas la réponse exacte à votre question .... faites-moi savoir si vous souhaitez que je la montre quand même
@yAzou bien sûr, je suis plus qu'intéressé. Même si cela ne répond pas exactement à la question. Cela m'aide à apprendre de nouvelles astuces. Merci.
Je le supprime .... s'il vous plaît laissez-moi savoir si cela aide d'une manière ou d'une autre