Partager via


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.

Un diagramme affichant le workflow d’ImageCleaner. Les pods Image Cleaner s’exécutant sur le cluster peuvent générer une ImageList ou une entrée manuelle peut être utilisée.

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’image docker.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

  1. Supprimez l’ancienne imagelist en utilisant la commande kubectl delete.

    kubectl delete ImageList imagelist
    
  2. 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 commande kubectl 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

  1. Créez un exemple de fichier JSON pour contenir des images exclues.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Créez une configmap à l’aide de l’exemple de fichier JSON avec les commandes kubectl create et kubectl 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. Et
  • CRITICAL

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é.

  1. 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.

  2. Les journaux des conteneurs s’exécutant dans l’espace de noms kube-system ne sont pas collectés par défaut. Supprimez l’espace de noms kube-system de exclude_namespaces dans la carte de configuration et appliquez la carte de configuration pour activer la collecte de ces journaux. Consultez Configurer la collecte des données d'observation des conteneurs pour plus de détails.

  3. 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
      }
    }
    
  4. Dans le Portail Azure, recherchez l’ID de ressource de l’espace de travail, puis sélectionnez Journaux.

  5. Copiez l’une des requêtes suivantes et collez-la dans la fenêtre de requête.

    1. Utilisez la requête suivante si votre cluster utilise le schéma ContainerLogV2. Si vous utilisez toujours ContainerLog, vous devez effectuer une mise à niveau vers ContainerlogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    2. Si vous souhaitez continuer à utiliser ContainerLog, utilisez plutôt la requête suivante :

      let startTimestamp = ago(1h);
      KubePodInventory
      | where TimeGenerated > startTimestamp
      | project ContainerID, PodName=Name, Namespace
      | where PodName startswith "eraser-aks-" and Namespace == "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
      
  6. Sélectionnez Exécuter. Tous les journaux d'activité d’image supprimés s’affichent dans la zone Résultats.