Freigeben über


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 lauten Featurename und Eigenschaftenname Image Cleaner, während die relevanten Namen von 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, „disable“ wird angegeben.
--disable-image-cleaner Deaktiviert das Image Cleaner-Feature für einen AKS-Cluster. Ja, es sei denn, „enable“ wird angegeben.
--image-cleaner-interval-hours Dieser Parameter steuert die Intervallzeit (in Stunden) für die Ausführung von Image Cleaner. 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

Automatisch

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

imagelist muss auf name festgelegt werden.

  • Entfernen Sie ein Image 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 Imageliste (imagelist) erstellt wird oder Änderungen an der vorhandenen Imageliste (imagelist) vorgenommen werden. Nach dem Löschen des Images wird imagelist nicht automatisch gelöscht.

Wenn Sie eine weitere manuelle Bereinigung auslösen müssen, müssen Sie eine neue Imageliste (imagelist) erstellen oder Änderungen an einer vorhandenen vornehmen. Wenn Sie dasselbe Image erneut entfernen möchten, müssen Sie eine neue Imageliste (imagelist) erstellen.

Löschen einer vorhandenen Imageliste (ImageList) und Erstellen einer neuen

  1. Löschen Sie die alte Imageliste (imagelist) mit dem kubectl delete-Befehl:

    kubectl delete ImageList imagelist
    
  2. Erstellen Sie eine neue Imageliste (imagelist) mit demselben Imagenamen. 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
    

Ändern einer vorhandenen Imageliste (ImageList)

  • Ändern Sie die vorhandene Imageliste (imagelist) mithilfe des kubectl edit-Befehls:

    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
    

Bei Verwendung des manuellen Modus wird der eraser-aks-xxxxx-Pod innerhalb von 10 Minuten nach Abschluss des Vorgangs gelöscht.

Imageausschlussliste

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 mit den folgenden Befehlen kubectl create und kubectl label eine configmap.

    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

  • Aktivieren 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?

Imageprotokolle werden im eraser-aks-xxxxx-Workerpod 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 des Vorgangs 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 den Namespace kube-system aus exclude_namespaces in der configmap, und wenden Sie die Konfigurationszuordnung an, um die Sammlung 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.