0
votes

Répertorier les images de conteneur dans le cluster Kubernetes avec SIZE (comme l'image docker ls)

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


5 commentaires

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


3 Réponses :


1
votes

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:

  1. obtient le nom de l'image (je suppose que vous avez un conteneur dans le pod, sinon le script sera légèrement plus compliqué en fonction de ce que vous voulez imprimer réellement)
  2. exécute l'image docker ls sur la même machine. Cela suppose que vous avez réellement cette image docker sur la machine sur laquelle vous exécutez cette commande.
  3. Vous formatez légèrement la sortie de cette commande pour "capturer" la taille de l'image

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


7 commentaires

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.



1
votes

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: {}


6 commentaires

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.



1
votes

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'


1 commentaires

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.