Comment nettoyer les anciens conteneurs et images dans votre cluster Kubernetes –
Un cluster Kubernetes actif peut accumuler d’anciens conteneurs et images. S’assurer que les ressources ignorées sont supprimées lorsqu’elles sont redondantes permet de libérer des ressources sur les nœuds de votre cluster. Voici comment aborder le garbage collection dans Kubernetes.
Sommaire
Images de conteneurs
Kubernetes dispose d’un système de collecte de garabages intégré qui peut nettoyer les images inutilisées. Il est géré par Kubelet, le processus de travail Kubernetes qui s’exécute sur chaque nœud.
Kubelet surveille automatiquement les images inutilisées et les supprimera périodiquement. Les décisions de suppression sont prises en évaluant l’utilisation du disque de l’image et l’heure à laquelle elle a été utilisée pour la dernière fois. Une grande image qui n’a pas été utilisée pendant une semaine sera généralement nettoyée avant une petite image qui a été utilisée hier.
Vous pouvez personnaliser le moment où le garbage collection s’exécute en spécifiant des seuils haut et bas pour l’utilisation du disque. L’utilisation du disque au-dessus du seuil «élevé» déclenchera le garbage collection. La procédure tentera de réduire l’utilisation du disque jusqu’au seuil «bas».
Les seuils sont définis à l’aide de deux indicateurs Kubelet:
image-gc-high-threshold
– Règle le seuil haut; par défaut à 85%.image-gc-low-threshold
– Règle le seuil bas; par défaut à 80%.
Ces paramètres doivent déjà être actifs dans votre cluster. Kubelet essaiera de réduire l’utilisation du disque à 80% après qu’il soit plein à 85%.
Vous pouvez définir des indicateurs Kubectl dans /var/lib/kubelet/kubeadm-flags.env
:
KUBELET_KUBEADM_ARGS="--image-gc-high-threshold=60 --image-gc-low-threshold=50"
Après avoir édité le fichier, redémarrez Kubectl:
systemctl daemon-reload systemctl restart kubelet
Effacer les vieux conteneurs
Kubelet gère également le nettoyage des conteneurs redondants. Tous les conteneurs arrêtés ou non identifiés seront candidats au retrait.
Vous pouvez accorder aux anciens conteneurs une période de grâce avant la suppression en définissant un âge minimum du conteneur. Des indicateurs supplémentaires vous permettent de contrôler le nombre total de conteneurs morts autorisés à exister dans un seul pod et sur le nœud:
maximum-dead-containers
– Nombre maximum d’anciens conteneurs à conserver. Lorsqu’il est réglé sur-1
(valeur par défaut), aucune limite ne s’applique.maximum-dead-containers-per-container
– Définissez le nombre d’instances plus anciennes à conserver par conteneur. Si un conteneur est remplacé par une instance plus récente, ces nombreuses versions plus anciennes seront autorisées à rester.minimum-container-ttl-duration
– Période de grâce de collecte des ordures pour les conteneurs morts. Une fois qu’un conteneur a atteint l’âge de plusieurs minutes, il devient éligible pour le ramasse-miettes. La valeur par défaut de0
signifie qu’aucune période de grâce ne s’applique.
Vous pouvez configurer ces paramètres avec les indicateurs Kubelet en utilisant la même procédure que celle décrite ci-dessus.
Dois-je intervenir manuellement?
Vous ne devez pas faire d’efforts manuels pour supprimer les conteneurs ou les images morts. Si l’espace disque se remplit ou si le garbage collection ne semble pas fonctionner, essayez d’ajuster vos indicateurs Kubelet vers des paramètres plus agressifs.
Kubernetes met en garde contre l’exécution d’un garbage collection externe. Ne supprimez pas manuellement les ressources, que ce soit à l’aide d’API de gestion de cluster ou d’outils tiers. Cela risque de créer un état incohérent qui pourrait avoir un impact sur le fonctionnement de Kubelet.
Kubelet est responsable de la gestion des conteneurs alloués à chaque nœud. Lorsqu’un nouveau conteneur est programmé, Kubelet téléchargera son image. Le succès de l’opération de cluster dépend de la satisfaction des attentes de Kubelet. Une image ou un conteneur manquant peut entraîner des problèmes avec Kubelet.
L’avenir: les expulsions
Les paramètres décrits ci-dessus sont pris en charge dans les versions actuelles de Kubernetes. Cependant, ils sont désapprouvés au profit d’un système «d’expulsions» plus robuste. Les expulsions sont un moyen unifié de nettoyer les ressources Kubernetes; ils finiront par remplacer le ramasse-miettes.
Une expulsion peut avoir lieu pour plusieurs raisons. Kubelet surveillera plusieurs facteurs, y compris les ressources matérielles disponibles et la configuration utilisateur pour les périodes de rétention.
Ce nouveau système facilite la suppression du ramasse-miettes en tant que mécanisme dédié. Le même processus qui met fin aux pods en raison d’un scénario de mémoire insuffisante supprimera les images redondantes lorsque l’espace disque devient restreint.
Deux types d’expulsion sont définis: difficile et mou, tendre. Une expulsion matérielle prendra des mesures immédiates pour supprimer la ressource cible. Il n’y a pas de période de grâce. Une expulsion logicielle a une période de grâce configurée par l’utilisateur; la ressource sera ciblée une fois la période de grâce expirée. Si la cause de l’expulsion est résolue pendant la période de grâce, par exemple si plus d’espace disque devient disponible, la suppression peut être interrompue.
Le système d’expulsions n’est pas encore entièrement pris en charge pour le nettoyage des conteneurs. le dead-containers
les indicateurs sont déjà obsolètes, prêts pour l’avenir. Vous pouvez déjà l’utiliser avec des images de conteneur – set --eviction-hard
ou alors --eviction-soft
à la place du threshold
drapeaux.
--eviction-hard=imagefs.available<1Gi
Cet exemple indique à Kubelet de supprimer toutes les images de conteneur inutilisées si l’espace disque disponible pour le stockage d’images tombe en dessous de 1 Go.
--eviction-soft=imagefs.available<1Gi --eviction-soft-grace-period=imagefs.available=5m
Ce deuxième exemple montre comment une expulsion «douce» peut être utilisée à la place. Dans ce cas, les images ne seront supprimées que si l’espace disque disponible est inférieur à 1 Go pendant au moins cinq minutes.
Résumé
Kubernetes a activé le garbage collection par défaut. Les conteneurs morts et les images redondantes seront nettoyés périodiquement. La planification par défaut cible une utilisation du disque de 80% ou moins; les conteneurs sont nettoyés de manière assez agressive une fois arrêtés. Vous pouvez utiliser les indicateurs Kubelet pour ajuster les seuils dans le processus.
Le ramassage des ordures en tant que concept sera finalement supprimé au profit des expulsions. Les expulsions ont une configuration simplifiée qui s’aligne mieux avec d’autres formes de suppression de ressources. Vous pouvez configurer des expulsions dans votre cluster dès aujourd’hui. N’oubliez pas que les indicateurs de récupération de place ne correspondent pas directement à leurs homologues d’expulsion.