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.
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 Imagedocker.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
Löschen Sie die alte Imageliste (
imagelist
) mit demkubectl delete
-Befehl:kubectl delete ImageList imagelist
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 deskubectl 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
Erstellen Sie eine JSON-Beispieldatei, die ausgeschlossene Images enthält.
cat > sample.json <<EOF {"excluded": ["excluded-image-name"]} EOF
Erstellen Sie mithilfe der JSON-Beispieldatei mit den folgenden Befehlen
kubectl create
undkubectl label
eineconfigmap
.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
undCRITICAL
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.
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.
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 } }
Suchen Sie im Azure-Portal nach der Ressourcen-ID des Arbeitsbereichs, und wählen Sie dann Protokolle aus.
Kopieren Sie die folgende Abfrage in die Tabelle, und ersetzen Sie
name
durcheraser-aks-xxxxx
(Name des Workerpods):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
Klicken Sie auf Run (Ausführen). Alle Protokolle zu gelöschten Images werden im Bereich Ergebnisse angezeigt.
Azure Kubernetes Service