Usare Image Cleaner per pulire le immagini non aggiornate vulnerabili nel cluster del servizio Azure Kubernetes

Si applica a: ✔️ AKS Automatic ✔️ AKS Standard

È comune usare le pipeline per compilare e distribuire immagini nei cluster del servizio Azure Kubernetes. Sebbene sia ottimo per la creazione di immagini, questo processo spesso non tiene conto delle immagini obsolete residue e può causare un accumulo eccessivo di immagini nei nodi del cluster. Queste immagini potrebbero contenere vulnerabilità che potrebbero creare problemi di sicurezza. Per rimuovere i rischi di sicurezza nei cluster, è possibile pulire queste immagini senza riferimenti. La pulizia manuale delle immagini può richiedere molto tempo. Image Cleaner esegue l'identificazione e la rimozione automatica delle immagini, riducendo il rischio di immagini non aggiornate e il tempo necessario per pulirle.

AKS Automatic è l’opzione predefinita consigliata per gli ambienti di produzione per la maggior parte dei carichi di lavoro di AKS. Image Cleaner è preconfigurato nei cluster AKS Automatic per facilitare la rimozione, per impostazione predefinita, delle immagini inutilizzate che presentano vulnerabilità.

Nei cluster AKS Standard, Image Cleaner è facoltativo e lo si abilita in modo esplicito.

Per altre informazioni sul servizio Azure Kubernetes automatico, vedere Che cos'è Servizio Azure Kubernetes (AKS) Automatico?

Nota

Pulizia immagini è una funzionalità basata su Eraser. In AKS, il nome della funzionalità e quello della proprietà sono Image Cleaner, mentre i nomi dei pod relativi a Image Cleaner contengono Eraser.

Comportamento di AKS Automatic e AKS Standard

Prerequisiti

  • Una sottoscrizione di Azure. Se non hai una sottoscrizione Azure, crea un account gratuito.
  • Per la configurazione standard di AKS tramite interfaccia della riga di comando di Azure, è necessaria interfaccia della riga di comando di Azure versione 2.49.0 o successiva. Eseguire az --version per trovare la versione in uso. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.

Limiti

Image Cleaner non supporta ancora i pool di nodi di Windows o i nodi virtuali di AKS.

Funzionamento di Image Cleaner

Quando si attiva Image Cleaner nel cluster, viene distribuito un pod di gestione controller denominato eraser-controller-manager.

Screenshot di un diagramma che mostra il flusso di lavoro di ImageCleaner. I pod ImageCleaner in esecuzione nel cluster possono generare un oggetto ImageList, oppure è possibile specificare un input manuale.

Image Cleaner supporta le modalità di pulizia automatica e manuale.

Opzioni di configurazione per AKS Standard

Usare queste opzioni quando si configura Image Cleaner in AKS Standard con interfaccia della riga di comando di Azure.

Nome Descrizione Richiesto
--enable-image-cleaner Abilitare Image Cleaner per un cluster AKS Sì, a meno che non si specifichi di disabilitare
--disable-image-cleaner Disabilitare Image Cleaner per un cluster del servizio Azure Kubernetes Sì, a meno che non si specifichi l'abilitazione
--image-cleaner-interval-hours Intervallo in ore per le esecuzioni programmate. Il valore predefinito di interfaccia della riga di comando di Azure è una settimana. Il valore minimo è 24 ore. Il valore massimo è di tre mesi. Non è richiesto per interfaccia della riga di comando di Azure; è obbligatorio per il modello ARM o altri client

Nota

Se si disabilita Image Cleaner e successivamente lo si riabilita senza passare in modo esplicito la configurazione, viene riutilizzato il valore di configurazione precedente.

Modalità automatica

Quando si distribuisce eraser-controller-manager, Image Cleaner esegue automaticamente queste azioni:

  • Avvia la pulizia e crea eraser-aks-xxxxx pod di lavoro per ogni nodo.
  • Usa un contenitore collector per raccogliere immagini non utilizzate.
  • Usa un contenitore con scanner trivy per analizzare le vulnerabilità con trivy.
  • Usa un contenitore remover per rimuovere le immagini inutilizzate con vulnerabilità.
  • Elimina il pod worker al completamento.
  • Pianifica la pulizia successiva in base a --image-cleaner-interval-hours.

Modalità manuale

È possibile attivare manualmente la pulizia definendo un oggetto CRDImageList. Questo attiva il eraser-contoller-managerper creareeraser-aks-xxxxx pod worker per ciascun nodo e completare il processo di rimozione manuale.

Nota

La disabilitazione di Image Cleaner non rimuove la configurazione precedente. Ciò significa che se si abilita nuovamente la funzionalità senza passare in modo esplicito la configurazione, viene usato il valore esistente anziché il valore predefinito.

Usare Image Cleaner nel servizio Azure Kubernetes automatico e standard del servizio Azure Kubernetes

AKS Automatico

Image Cleaner è preconfigurato nei cluster automatici del servizio Azure Kubernetes, che rappresentano l'impostazione predefinita di produzione consigliata per la maggior parte dei carichi di lavoro del servizio Azure Kubernetes. Non è necessario eseguire un comando di abilitazione separato.

Per creare un cluster automatico del servizio Azure Kubernetes, vedere Creare un cluster automatico del servizio Azure Kubernetes.

Utilizzare le indicazioni per la pulizia manuale e il monitoraggio contenute in questo articolo quando si desidera un intervento correttivo mirato o una verifica operativa.

AKS Standard: abilitare in un nuovo cluster

Abilita Image Cleaner in un nuovo cluster AKS Standard tramite il comando az aks create con il parametro --enable-image-cleaner.

az aks create \
    --resource-group myResourceGroup \
    --name myManagedCluster \
    --enable-image-cleaner \
    --generate-ssh-keys

AKS Standard: abilitare su un cluster esistente

Abilita Image Cleaner in un cluster AKS Standard esistente usando il comando az aks update.

az aks update \
  --resource-group myResourceGroup \
  --name myManagedCluster \
  --enable-image-cleaner

AKS Standard: intervallo di aggiornamento per un cluster nuovo o esistente

Aggiornare l'intervallo di Image Cleaner in un cluster AKS Standard nuovo o esistente usando il parametro --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

Rimuovere manualmente le immagini con Image Cleaner

Importante

Il name deve essere impostato su imagelist.

Rimuovere manualmente un'immagine usando il comando kubectl apply seguente. In questo esempio viene rimossa l'immagine docker.io/library/alpine:3.7.3 se non in uso.

cat <<EOF | kubectl apply -f -
apiVersion: eraser.sh/v1
kind: ImageList
metadata:
  name: imagelist
spec:
  images:
    - docker.io/library/alpine:3.7.3
EOF

La pulizia manuale è un'operazione eseguita una sola volta e viene attivata solo quando viene creato un nuovo oggetto imagelist o vengono apportate modifiche all'oggetto imagelist esistente. Dopo l'eliminazione dell'immagine, l'oggetto imagelist non verrà eliminato automaticamente.

Se è necessario attivare un'altra pulizia manuale, è necessario creare un nuovo oggetto imagelist o apportare modifiche a uno esistente. Se si vuole rimuovere di nuovo la stessa immagine, è necessario creare un nuovo oggetto imagelist.

Eliminare un oggetto ImageList esistente e crearne uno nuovo

  1. Eliminare l’oggetto imagelist esistente usando il comando kubectl delete.

    kubectl delete ImageList imagelist
    
  2. Creare un nuovo oggetto imagelist con lo stesso nome di immagine. Nell'esempio seguente viene usata la stessa immagine dell'esempio precedente.

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

Modificare un oggetto ImageList esistente

Modificare l'oggetto imagelist esistente usando il comando 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

Quando si utilizza la modalità manuale, il pod eraser-aks-xxxxx viene eliminato entro 10 minuti dal completamento del lavoro.

Elenco di esclusione delle immagini

Le immagini specificate nell'elenco di esclusione non vengono rimosse dal cluster. Image Cleaner supporta elenchi di esclusione definiti dall'utente e di sistema. La modifica dell'elenco di esclusione di sistema non è supportata.

Verificare l'elenco di esclusione del sistema

Controllare l'elenco di esclusione di sistema usando il comando kubectl get seguente.

kubectl get -n kube-system configmap eraser-system-exclusion -o yaml

Creare un elenco di esclusione definito dall'utente

  1. Creare un file JSON di esempio che includa le immagini escluse.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Creare un oggetto configmap usando il file JSON di esempio e il comando kubectl create e kubectl label seguente.

    kubectl create configmap excluded --from-file=sample.json --namespace=kube-system
    kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
    

Disabilitare Image Cleaner in AKS Standard

Disabilita Image Cleaner in un cluster AKS Standard usando il comando az aks update con il parametro --disable-image-cleaner.

az aks update \
  --resource-group myResourceGroup \
  --name myManagedCluster \
  --disable-image-cleaner

Domande frequenti

Image Cleaner è abilitato per impostazione predefinita su AKS Automatic?

Yes. Image Cleaner è preconfigurato nei cluster AKS Automatic.

Devo eseguire comandi per abilitare Image Cleaner in AKS Automatic?

No. Usare i comandi di abilitazione per AKS Standard.

Come è possibile controllare la versione usata da Image Cleaner?

kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3

Image Cleaner supporta altri strumenti di analisi delle vulnerabilità oltre a trivy-scanner?

No.

È possibile specificare i livelli di vulnerabilità per le immagini da pulire?

No. Le impostazioni predefinite per i livelli di vulnerabilità includono:

  • LOW,
  • MEDIUM,
  • HIGH e
  • CRITICAL

Non è possibile personalizzare le impostazioni predefinite.

Come esaminare le immagini che sono state pulite da Image Cleaner?

I log delle immagini vengono archiviati nel pod eraser-aks-xxxxx worker. Quando eraser-aks-xxxxx è attivo, è possibile eseguire i comandi seguenti per visualizzare i log di eliminazione:

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

Il pod eraser-aks-xxxxx viene eliminato entro 10 minuti dal completamento del lavoro. È possibile seguire questi passaggi per abilitare il componente aggiuntivo di Monitoraggio di Azure e usare la tabella dei log dei pod di Container Insights. Successivamente, i log cronologici verranno archiviati e sarà possibile esaminarli anche quando viene eliminato eraser-aks-xxxxx.

  1. Verificare che Monitoraggio di Azure sia abilitato nel cluster. Per istruzioni dettagliate, vedi Abilitare Container Insights nei cluster di AKS.

  2. Per impostazione predefinita, i log per i contenitori in esecuzione nello kube-system spazio dei nomi non vengono raccolti. Rimuovere lo kube-system spazio dei nomi da exclude_namespaces nella mappa di configurazione e applicare la mappa di configurazione per abilitare la raccolta di questi log. Per informazioni dettagliate, vedere Configurare la raccolta dati di Container Insights.

  3. Ottenere l'ID risorsa di Log Analytics usando il comando az aks show.

      az aks show --resource-group myResourceGroup --name myManagedCluster
    

    Dopo alcuni minuti, il comando restituisce informazioni in formato JSON sulla soluzione, incluso l'ID risorsa dell'area di lavoro:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  4. Nel portale di Azure cercare l'ID risorsa dell'area di lavoro e quindi selezionare Log.

  5. Copiare una delle query seguenti e incollarla nella finestra di query.

    • Usare la query seguente se il cluster utilizza lo schema ContainerLogV2. Se usi ancora ContainerLog, passa a ContainerLogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    • Se si vuole continuare a usare ContainerLog, usare invece la query seguente:

      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. Selezionare Esegui. Tutti i log delle immagini eliminati vengono visualizzati nell'area Risultati.