Utiliser Image Cleaner pour nettoyer les images obsolètes vulnérables sur votre cluster Azure Kubernetes Service (AKS)
Il est courant d’utiliser des pipelines pour générer et déployer des images sur des clusters Azure Kubernetes Service (AKS). Bien qu’il soit idéal pour la création d’images, ce processus ne tient souvent pas compte des images obsolètes laissées derrière elles et peut entraîner des ballonnements d’images sur les nœuds de cluster. Ces images peuvent contenir des vulnérabilités, ce qui peut créer des problèmes de sécurité. Pour supprimer les risques de sécurité dans vos clusters, vous pouvez nettoyer ces images non référencées. Le nettoyage manuel des images peut s’avérer fastidieux. Image Cleaner effectue l’identification et la suppression automatiques des images, ce qui atténue le risque d’images obsolètes et réduit le temps nécessaire pour les nettoyer.
Remarque
Image Cleaner est une fonctionnalité basée sur Eraser.
Sur un cluster AKS, le nom de la fonctionnalité et le nom de la propriété est Image Cleaner
alors que les noms des pods Image Cleaner pertinents contiennent Eraser
.
Prérequis
- Un abonnement Azure. Si vous n’avez pas d’abonnement Azure, vous pouvez créer un compte gratuit.
- Azure CLI version 2.49.0 ou ultérieure. Exécutez
az --version
pour rechercher votre version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.
Limites
Image Cleaner ne prend pas encore en charge les pools de nœuds Windows ou les nœuds virtuels AKS.
Fonctionnement d’Image Cleaner
Une fois que vous avez activé Image Cleaner, un pod de gestionnaire de contrôleurs nommé eraser-controller-manager
est déployé sur votre cluster.
Avec Image Cleaner, vous pouvez choisir entre le mode manuel et le mode automatique et les options de configuration suivantes :
Options de configuration
Nom | Description | Obligatoire |
---|---|---|
--enable-image-cleaner |
Activer la fonctionnalité Image Cleaner pour un cluster AKS | Oui, sauf si Désactiver est spécifié |
--disable-image-cleaner |
Désactiver la fonctionnalité Image Cleaner pour un cluster AKS | Oui, sauf si Activer est spécifié |
--image-cleaner-interval-hours |
Ce paramètre détermine l’intervalle de temps (en heures) qu’Image Cleaner utilise pour s’exécuter. La valeur par défaut pour Azure CLI est d’une semaine, la valeur minimale de 24 heures et la valeur maximale de trois mois. | Non requis pour Azure CLI, requis pour le modèle ARM et d’autres clients |
Mode automatique
Une fois que eraser-controller-manager
est déployé, les étapes suivantes sont effectuées automatiquement :
- Il démarre immédiatement le processus de nettoyage et crée des pods worker
eraser-aks-xxxxx
pour chaque nœud. - Il existe trois conteneurs dans chaque pod worker :
- Un collecteur qui collecte les images inutilisées.
- Un trivy-scanner qui tire parti de trivy pour analyser les vulnérabilités des images.
- Un dissolvant qui supprime les images inutilisées présentant des vulnérabilités.
- Une fois le processus de nettoyage terminé, le pod worker est supprimé et le prochain nettoyage planifié se produit en fonction de l’intervalle
--image-cleaner-interval-hours
que vous définissez.
Mode manuel
Vous pouvez déclencher le nettoyage manuellement en définissant un objet CRD, ImageList
. Cela déclenche l’eraser-contoller-manager
afin de créer des pods worker eraser-aks-xxxxx
pour chaque nœud et d’effectuer le processus de suppression manuelle.
Remarque
Après avoir désactivé Image Cleaner, l’ancienne configuration existe toujours. Cela signifie que si vous activez à nouveau la fonctionnalité sans passer explicitement la configuration, la valeur existante est utilisée au lieu de la valeur par défaut.
Activer Image Cleaner sur votre cluster AKS
Activer Image Cleaner sur un nouveau cluster
Activez Image Cleaner sur un nouveau cluster AKS à l’aide de la commande
az aks create
avec le paramètre--enable-image-cleaner
.az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --generate-ssh-keys
Activer Image Cleaner sur un cluster existant
Activez Image Cleaner sur un cluster AKS existant à l’aide de la commande
az aks update
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner
Mettre à jour l’intervalle Image Cleaner sur un nouveau cluster ou un cluster existant
Mettez à jour l’intervalle Image Cleaner sur un nouveau cluster AKS ou un existant à l’aide du paramètre
--image-cleaner-interval-hours
.# Create a new cluster with specifying the interval az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --image-cleaner-interval-hours 48 \ --generate-ssh-keys # Update the interval on an existing cluster az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --image-cleaner-interval-hours 48
Supprimer manuellement des images à l’aide d’Image Cleaner
Important
name
doit être défini sur imagelist
.
Supprimez une image manuellement avec la commande
kubectl apply
suivante. Cet exemple montre comment supprimer l’imagedocker.io/library/alpine:3.7.3
si elle n’est pas utilisée.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
Le nettoyage manuel est une opération ponctuelle qui est déclenchée seulement si une nouvelle imagelist
est créée ou si des modifications sont apportées à l’imagelist
existante. Une fois l’image supprimée, l’imagelist
n’est pas supprimée automatiquement.
Si vous avez besoin de déclencher un autre nettoyage manuel, vous devez créer une nouvelle imagelist
ou apporter des modifications à une liste qui existe déjà. Si vous souhaitez supprimer la même image une nouvelle fois, vous devez créer une nouvelle imagelist
.
Supprimer une ImageList existante et en créer une nouvelle
Supprimez l’ancienne
imagelist
en utilisant la commandekubectl delete
.kubectl delete ImageList imagelist
Créez une nouvelle
imagelist
avec le même nom d’image. L’exemple suivant utilise la même image que l’exemple précédent.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
Modifier une ImageList existante
Modifiez l’
imagelist
existante en utilisant la commandekubectl edit
.kubectl edit ImageList imagelist # Add a new image to the list apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: docker.io/library/python:alpine3.18
Lorsque vous utilisez le mode manuel, le pod eraser-aks-xxxxx
effectue la suppression dans les 10 minutes qui suivent la fin du travail.
Liste d’exclusions d’images
Les images spécifiées dans la liste d’exclusion ne sont pas supprimées du cluster. Image Cleaner prend en charge les listes d’exclusions définies par le système et l’utilisateur. La modification de la liste d’exclusions système n’est pas prise en charge.
Vérifier la liste d’exclusions système
Vérifiez la liste d’exclusions système à l’aide de la commande
kubectl get
suivante.kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
Créer une liste d’exclusions définie par l’utilisateur
Créez un exemple de fichier JSON pour contenir des images exclues.
cat > sample.json <<EOF {"excluded": ["excluded-image-name"]} EOF
Créez une
configmap
à l’aide de l’exemple de fichier JSON avec les commandeskubectl create
etkubectl label
suivantes.kubectl create configmap excluded --from-file=sample.json --namespace=kube-system kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
Désactiver Image Cleaner
Désactivez Image Cleaner sur votre cluster à l’aide de la commande
az aks update
avec le paramètre--disable-image-cleaner
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --disable-image-cleaner
FAQ
Comment savoir quelle version d’Image Cleaner j’utilise ?
kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3
Image Cleaner prend-il en charge d’autres analyseurs de vulnérabilité en plus de trivy-scanner ?
Nombre
Puis-je spécifier des niveaux de vulnérabilité pour les images à nettoyer ?
Non. Les paramètres par défaut des niveaux de vulnérabilité comprennent :
LOW
,MEDIUM
,HIGH
. EtCRITICAL
Vous ne pouvez pas personnaliser les paramètres par défaut.
Comment passer en revue les images qui ont été nettoyées par Image Cleaner ?
Les journaux d’image sont stockés dans le pod worker eraser-aks-xxxxx
. Quand eraser-aks-xxxxx
est actif, vous pouvez exécuter les commandes suivantes pour afficher les journaux de suppression :
kubectl logs -n kube-system <worker-pod-name> -c collector
kubectl logs -n kube-system <worker-pod-name> -c trivy-scanner
kubectl logs -n kube-system <worker-pod-name> -c remover
Le pod eraser-aks-xxxxx
effectue la suppression dans les 10 minutes qui suivent la fin du travail. Vous pouvez suivre ces étapes pour activer le module complémentaire Azure Monitor et utiliser le tableau de journal de pod Container Insights. Après, les journaux historiques seront stockés et vous pourrez les consulter même si eraser-aks-xxxxx
est supprimé.
Vérifiez qu’Azure Monitoring est activé sur votre cluster. Pour obtenir des instructions détaillées, consultez Activer Container Insights sur le cluster AKS.
Obtenez l’ID de ressource Log Analytics à l’aide de la commande
az aks show
.az aks show --resource-group myResourceGroup --name myManagedCluster
Au bout de quelques minutes, la commande renvoie des informations au format JSON au sujet de la solution, y compris l’ID de ressource de l’espace de travail :
"addonProfiles": { "omsagent": { "config": { "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>" }, "enabled": true } }
Dans le Portail Azure, recherchez l’ID de ressource de l’espace de travail, puis sélectionnez Journaux.
Copiez la requête suivante dans le tableau, en remplaçant
name
pareraser-aks-xxxxx
(nom du pod worker) :let startTimestamp = ago(1h); KubePodInventory | where TimeGenerated > startTimestamp | project ContainerID, PodName=Name, Namespace | where PodName contains "name" and Namespace startswith "kube-system" | distinct ContainerID, PodName | join ( ContainerLog | where TimeGenerated > startTimestamp ) on ContainerID // at this point before the next pipe, columns from both tables are available to be "projected". Due to both // tables having a "Name" column, we assign an alias as PodName to one column which we actually want | project TimeGenerated, PodName, LogEntry, LogEntrySource | summarize by TimeGenerated, LogEntry | order by TimeGenerated desc
Sélectionnez Exécuter. Tous les journaux d'activité d’image supprimés s’affichent dans la zone Résultats.
Azure Kubernetes Service