web-dev-qa-db-fra.com

Comment nettoyer les anciennes images / balises Kubernetes inutilisées?

Pour simplifier déploiement et restauration à court terme, il est utile d'utiliser une nouvelle balise d'image Docker pour chaque nouvelle version à déployer sur Kubernetes. Sans nettoyage, cela signifie que les anciennes images: les balises sont conservées pour toujours.

Comment puis-je répertorier toutes les balises image: qui sont utilisées par un conteneur Kubernetes afin que je puisse trouver toutes les anciennes balises image: anciennes qui ne sont pas utilisées pour les supprimer automatiquement du Docker Registry?

Mon objectif est idéalement pour Google Container Engine (GKE) de supprimer les images inutilisées a Google Container Registry .

15
Wernight

Comme approche alternative, vous pourriez envisager de laisser Kubernetes gérer la récupération des anciennes images pour vous.

Actuellement, ImageManager gère la récupération des images candidates. Voir: Garbage Collection

La collecte des ordures est une fonction utile de kubelet qui nettoiera les images non référencées et les conteneurs inutilisés. kubelet effectuera la collecte des ordures pour les conteneurs toutes les minutes et la collecte des ordures pour les images toutes les cinq minutes.

La configuration est contrôlée via ces deux paramètres kublet cli :

  --image-gc-high-threshold=90: The percent of disk usage after which image garbage collection is always run. Default: 90%
  --image-gc-low-threshold=80: The percent of disk usage before which image garbage collection is never run. Lowest disk usage to garbage collect to. Default: 80%

Les seuils haut/bas peuvent être réglés pour forcer la collecte à un intervalle qui vous convient.

12
Ryan Cox

Avec les versions récentes de kubelet, utilisez les options ci-dessous comme - image-gc-high-threshold et - image -gc-low-threshold sont dépréciés:

--eviction-hard
--eviction-soft

Plus de détails disponibles ici:

3
Costas

Vous pouvez utiliser docker-cleanup conteneurs exécutés dans un DaemonSet. Cela nettoierait toutes les images inutilisées sur chaque nœud de votre cluster.

2
wolfson109

Pour obtenir une liste de toutes les images utilisées par un cluster Kubernetes, on peut exécuter le script Shell:

for image in $(kubectl get pods --all-namespaces --output=jsonpath='{..image}')
do
    echo $image
done

Il semble cependant qu'il n'y ait aucun moyen de supprimer simplement les images d'un registre de conteneurs Google (voir Comment supprimer une image poussée dans Google Container Registry )

1
Wernight

Je ne sais pas s'il existe une approche documentée pour effectuer ce type de maintenance. Cependant, Openshift Origin tente de résoudre le problème en élaguant les images de docker et en interagissant avec le registre pour supprimer les objets blob plus anciens.

Nous l'avons implémenté dans le contexte d'Origin. Le code source pour ça sur github

0
brooding_goat