Bereinigen risikobehafteter, veralteter Images in Ihrem AKS-Cluster (Azure Kubernetes Service) mithilfe von Image Cleaner

Für die Erstellung und Bereitstellung von Images in AKS-Clustern (Azure Kubernetes Service) werden häufig Pipelines verwendet. Dieser Prozess eignet sich zwar sehr gut für die Imageerstellung, vernachlässigt aber die zurückbleibenden veralteten Images und kann zu einer Überfrachtung von Images auf Clusterknoten führen. Diese Images könnten Sicherheitsrisiken enthalten, die zu Sicherheitsproblemen führen könnten. Um Sicherheitsrisiken in Ihren Clustern zu beseitigen, können Sie diese nicht referenzierten Images bereinigen. Das manuelle Bereinigen von Images kann zeitintensiv sein. Image Cleaner führt die automatische Imageerkennung und -entfernung durch, sodass das Risiko veralteter Images verringert und die Zeit für das Bereinigen reduziert wird.

Hinweis

Image Cleaner ist ein Feature, das auf Eraser basiert. In einem AKS-Cluster sind der Name des Features und der Name der Eigenschaft Image Cleaner, während die Namen der relevanten Image Cleaner-Pods Eraser enthalten.

Voraussetzungen

  • Ein Azure-Abonnement. Falls Sie über kein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen.
  • Version 2.49.0 oder höher der Azure-Befehlszeilenschnittstelle. Führen Sie az --version aus, um Ihre Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.

Begrenzungen

Image Cleaner unterstützt noch keine Windows-Knotenpools oder virtuelle AKS-Knoten.

So funktioniert Image Cleaner

Nachdem Sie Image Cleaner aktiviert haben, wird ein Controller-Manager-Pod namens eraser-controller-manager in Ihrem Cluster bereitgestellt.

Screenshot eines Diagramms, das den Workflow von Image Cleaner zeigt. Die im Cluster ausgeführten Image Cleaner-Pods können eine Imageliste generieren. Alternativ kann eine manuelle Eingabe bereitgestellt werden.

Mit Image Cleaner können Sie zwischen dem manuellen und dem automatischen Modus und den folgenden Konfigurationsoptionen auswählen:

Konfigurationsoptionen

Name BESCHREIBUNG Erforderlich
--enable-image-cleaner Aktiviert das Image Cleaner-Feature für einen AKS-Cluster. Ja, es sei denn, „deaktivieren“ ist festgelegt.
--disable-image-cleaner Deaktiviert das Image Cleaner-Feature für einen AKS-Cluster. Ja, außer wenn „enable“ angegeben ist.
--image-cleaner-interval-hours Dieser Parameter bestimmt das Intervall (in Stunden), in dem Image Cleaner ausgeführt wird. Der Standardwert für die Azure-Befehlszeilenschnittstelle ist eine Woche, der Mindestwert beträgt 24 Stunden, und der Maximalwert ist drei Monate. Nicht erforderlich für die Azure-Befehlszeilenschnittstelle, erforderlich für ARM-Vorlagen oder andere Clients

Automatischer Modus

Sobald eraser-controller-manager bereitgestellt wurde, werden die folgenden Schritte automatisch ausgeführt:

  • Der Bereinigungsprozess wird sofort gestartet, und für jeden Knoten werden eraser-aks-xxxxx-Workerpods erstellt.
  • Jeder Workerpod enthält drei Container:
    • Collector, der nicht verwendete Images sammelt.
    • Trivy-Scanner zum Überprüfen von Images auf Sicherheitsrisiken mithilfe von trivy
    • Remover zum Entfernen von nicht verwendeten Images mit Sicherheitsrisiken
  • Nach Abschluss des Bereinigungsprozesses wird der Workerpod gelöscht, und die nächste geplante Bereinigung erfolgt entsprechend des von Ihnen definierten --image-cleaner-interval-hours-Werts.

Manueller Modus

Sie können die Bereinigung auch manuell auslösen, indem Sie ein CRD-Objekt (ImageList) definieren. Dadurch wird eraser-contoller-manager ausgelöst, um eraser-aks-xxxxx-Workerpods für jeden Knoten zu erstellen und den manuellen Entfernungsprozess abzuschließen.

Hinweis

Nach dem Deaktivieren von Image Cleaner ist die alte Konfiguration weiterhin vorhanden. Bei der erneuten Aktivierung des Features ohne explizites Übergeben einer Konfiguration wird somit der vorhandene Wert anstelle des Standardwerts verwendet.

Aktivieren von Image Cleaner für Ihren AKS-Cluster

Aktivieren von Image Cleaner in einem neuen Cluster

  • Aktivieren Sie Image Cleaner in einem neuen AKS-Cluster mithilfe des Befehls az aks create mit dem Parameter --enable-image-cleaner.

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

Aktivieren von Image Cleaner in einem vorhandenen Cluster

  • Aktivieren Sie Image Cleaner in einem vorhandenen AKS-Cluster mithilfe des Befehls az aks update.

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

Aktualisieren des Image Cleaner-Intervalls für einen neuen oder vorhandenen Cluster

  • Aktualisieren Sie das Image Cleaner-Intervall für einen neuen oder vorhandenen AKS-Cluster mithilfe des Parameters --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
    

Manuelles Entfernen von Images mithilfe von Image Cleaner

Wichtig

name muss auf imagelist festgelegt werden.

  • Entfernen Sie ein Abbild manuell mithilfe des folgenden kubectl apply-Befehls. In diesem Beispiel wird das Image docker.io/library/alpine:3.7.3 entfernt, wenn es nicht verwendet wird.

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

Die manuelle Bereinigung ist ein einmaliger Vorgang und wird nur ausgelöst, wenn eine neue imagelist erstellt wird oder an der vorhandenen imagelist Änderungen vorgenommen werden. Nach dem Löschen des Images wird imagelist nicht automatisch gelöscht.

Wenn Sie eine weitere manuelle Bereinigung auslösen möchten, müssen Sie ein neues imagelist erstellen oder ein vorhandenes imagelist ändern. Wenn Sie dasselbe Bild noch einmal entfernen möchten, müssen Sie ein neues imagelist erstellen.

Löschen Sie eine vorhandene ImageList, und erstellen Sie eine neue.

  1. Löschen Sie das alte imagelist mit dem Befehl kubectl delete.

    kubectl delete ImageList imagelist
    
  2. Erstellen Sie ein neues imagelist mit demselben Image-Namen. Im folgenden Beispiel wird das gleiche Image wie im vorherigen Beispiel verwendet:

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

Vorhandene Bildliste ändern

  • Ändern Sie die vorhandene imagelist mit dem Befehl 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
    

Im manuellen Modus wird der eraser-aks-xxxxx Pod innerhalb von 10 Minuten nach Abschluss der Arbeit gelöscht.

Liste ausgeschlossener Bilder

Images, die in der Ausschlussliste angegeben sind, werden nicht aus dem Cluster entfernt. Image Cleaner unterstützt systemseitige und benutzerdefinierte Ausschlusslisten. Das Bearbeiten der Systemausschlussliste wird nicht unterstützt.

Überprüfen der Systemausschlussliste

  • Überprüfen Sie die Systemausschlussliste mit dem folgenden kubectl get-Befehl.

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

Erstellen einer benutzerdefinierten Ausschlussliste

  1. Erstellen Sie eine JSON-Beispieldatei, die ausgeschlossene Images enthält.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Erstellen Sie mithilfe der JSON-Beispieldatei ein configmap mit dem folgenden kubectl create- und kubectl label-Befehl.

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

Deaktivieren von Image Cleaner

  • Deaktivieren Sie Image Cleaner in Ihrem Cluster mithilfe des Befehls az aks update mit dem Parameter --disable-image-cleaner.

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

Häufig gestellte Fragen

Wie kann ich überprüfen, welche Version Image Cleaner verwendet?

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

Unterstützt Image Cleaner neben dem Trivy-Scanner noch weitere Tools zum Überprüfen auf Sicherheitsrisiken?

Nein.

Kann ich Sicherheitsrisikostufen angeben, nach denen Images bereinigt werden?

Nein. Zu den Standardeinstellungen für Sicherheitsrisikostufen gehören folgende:

  • LOW,
  • MEDIUM,
  • HIGH, und
  • CRITICAL

Sie können die Standardeinstellungen nicht anpassen.

Wie überprüfe ich, ob Images von Image Cleaner bereinigt wurden?

Image-Logs werden im eraser-aks-xxxxx-Worker-Pod gespeichert. Wenn eraser-aks-xxxxx aktiv ist, können Sie die folgenden Befehle ausführen, um Löschprotokolle anzuzeigen:

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

Der eraser-aks-xxxxx-Pod wird innerhalb von 10 Minuten nach Abschluss der Arbeit gelöscht. Sie können die folgenden Schritte ausführen, um das Azure Monitor-Add-On zu aktivieren und die Podprotokolltabelle von Container Insights zu verwenden. Danach werden Verlaufsprotokolle gespeichert, und Sie können sie auch überprüfen, wenn eraser-aks-xxxxx gelöscht wird.

  1. Stellen Sie sicher, dass die Azure-Überwachung in Ihrem Cluster aktiviert ist. Eine ausführliche Anleitung finden Sie unter Aktivieren von Container Insights auf AKS-Clustern.

  2. Protokolle für die Container, die im Namespace kube-system ausgeführt werden, werden standardmäßig nicht erfasst. Entfernen Sie in der ConfigMap den Namespace kube-system aus exclude_namespaces und wenden Sie die ConfigMap an, um die Erfassung dieser Protokolle zu aktivieren. Weitere Informationen finden Sie unter Konfigurieren der Datensammlung in Container Insights.

  3. Rufen Sie die Log Analytics-Ressourcen-ID mit dem Befehl az aks show ab.

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

    Nach wenigen Minuten gibt der Befehl Informationen zur Lösung im JSON-Format, einschließlich der Ressourcen-ID des Arbeitsbereichs, zurück:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  4. Suchen Sie im Azure-Portal nach der Ressourcen-ID des Arbeitsbereichs, und wählen Sie dann Protokolle aus.

  5. Kopieren Sie eine der folgenden Abfragen, und fügen Sie sie in das Abfragefenster ein.

    1. Verwenden Sie die folgende Abfrage, wenn Ihr Cluster das ContainerLogV2-Schema verwendet. Wenn Sie ContainerLog weiterhin verwenden, sollten Sie ein Upgrade auf ContainerlogV2 durchführen.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    2. Wenn Sie ContainerLog weiterhin verwenden möchten, verwenden Sie stattdessen die folgende Abfrage:

      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. Klicken Sie auf Ausführen. Alle Protokolle zu gelöschten Images werden im Bereich Ergebnisse angezeigt.