Använd Image Cleaner för att rensa sårbara inaktuella avbildningar i ditt AKS-kluster (Azure Kubernetes Service)
Det är vanligt att använda pipelines för att skapa och distribuera avbildningar i AKS-kluster (Azure Kubernetes Service). Även om det är bra för att skapa avbildningar tar den här processen ofta inte hänsyn till de inaktuella avbildningar som lämnas kvar och kan leda till att bilden blir uppsvälld på klusternoder. Dessa avbildningar kan innehålla säkerhetsrisker, vilket kan skapa säkerhetsproblem. Om du vill ta bort säkerhetsrisker i dina kluster kan du rensa dessa orefererade avbildningar. Manuellt rensning av bilder kan vara tidsintensivt. Image Cleaner utför automatisk bildidentifiering och borttagning, vilket minskar risken för inaktuella bilder och minskar den tid som krävs för att rensa upp dem.
Anteckning
Image Cleaner är en funktion baserad på Eraser.
I ett AKS-kluster är Image Cleaner
funktionsnamnet och egenskapsnamnet , medan de relevanta image cleaner-poddnamnen innehåller Eraser
.
- En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto.
- Azure CLI version 2.49.0 eller senare. Kör
az --version
för att hitta din version. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.
Image Cleaner har ännu inte stöd för Windows-nodpooler eller virtuella AKS-noder.
När du har aktiverat Image Cleaner kommer det att finnas en controller manager-podd med namnet eraser-controller-manager
distribuerad till klustret.
Med Image Cleaner kan du välja mellan manuellt och automatiskt läge och följande konfigurationsalternativ:
Name | beskrivning | Obligatoriskt |
---|---|---|
--enable-image-cleaner |
Aktivera funktionen Image Cleaner för ett AKS-kluster | Ja, såvida inte inaktivera har angetts |
--disable-image-cleaner |
Inaktivera funktionen Image Cleaner för ett AKS-kluster | Ja, såvida inte aktivering har angetts |
--image-cleaner-interval-hours |
Den här parametern bestämmer intervalltiden (i timmar) som Image Cleaner använder för att köra. Standardvärdet för Azure CLI är en vecka, minimivärdet är 24 timmar och maxvärdet är tre månader. | Krävs inte för Azure CLI, krävs för ARM-mallen eller andra klienter |
När eraser-controller-manager
har distribuerats utförs följande steg automatiskt:
- Den startar omedelbart rensningsprocessen och skapar
eraser-aks-xxxxx
arbetspoddar för varje nod. - Det finns tre containrar i varje arbetspodd:
- En insamlare som samlar in oanvända bilder.
- En trivy-skanner, som utnyttjar trivy för att skanna sårbarheter i bilder.
- En remover som tar bort oanvända bilder med sårbarheter.
- När rensningsprocessen är klar tas arbetspodden bort och nästa schemalagda rensning sker enligt den
--image-cleaner-interval-hours
du definierar.
Du kan utlösa rensningen manuellt genom att definiera ett CRD-objektImageList
. Detta utlöser eraser-contoller-manager
för att skapa eraser-aks-xxxxx
arbetspoddar för varje nod och slutföra den manuella borttagningsprocessen.
Anteckning
När du har inaktiverat Image Cleaner finns den gamla konfigurationen fortfarande. Det innebär att om du aktiverar funktionen igen utan att uttryckligen skicka konfigurationen används det befintliga värdet i stället för standardvärdet.
Aktivera Image Cleaner i ett nytt AKS-kluster med kommandot
az aks create
med parametern--enable-image-cleaner
.az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --generate-ssh-keys
Aktivera Image Cleaner i ett befintligt AKS-kluster med kommandot
az aks update
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner
Uppdatera intervallet Image Cleaner i ett nytt eller befintligt AKS-kluster med hjälp av parametern
--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
Viktigt
name
måste anges till imagelist
.
Ta bort en avbildning manuellt med hjälp av följande
kubectl apply
kommando. Det här exemplet tar bort avbildningen om dendocker.io/library/alpine:3.7.3
inte används.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
Den manuella rensningen är en engångsåtgärd och utlöses bara när en ny imagelist
skapas eller ändringar görs i den befintliga imagelist
. När avbildningen har tagits imagelist
bort tas den inte bort automatiskt.
Om du behöver utlösa en annan manuell rensning måste du skapa en ny imagelist
eller göra ändringar i en befintlig. Om du vill ta bort samma avbildning igen måste du skapa en ny imagelist
.
Ta bort det gamla
imagelist
med kommandotkubectl delete
.kubectl delete ImageList imagelist
Skapa en ny
imagelist
med samma avbildningsnamn. I följande exempel används samma bild som i föregående exempel.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
Ändra den befintliga
imagelist
med kommandotkubectl 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
När du använder manuellt läge eraser-aks-xxxxx
tas podden bort inom 10 minuter efter att arbetet har slutförts.
Bilder som anges i undantagslistan tas inte bort från klustret. Image Cleaner stöder system- och användardefinierade undantagslistor. Det går inte att redigera listan över systemundantag.
Kontrollera listan över systemundantag med hjälp av följande
kubectl get
kommando.kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
Skapa en JSON-exempelfil som ska innehålla exkluderade bilder.
cat > sample.json <<EOF {"excluded": ["excluded-image-name"]} EOF
Skapa en
configmap
med JSON-exempelfilen med hjälp av följandekubectl create
ochkubectl label
kommando.kubectl create configmap excluded --from-file=sample.json --namespace=kube-system kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
Inaktivera Image Cleaner i klustret med kommandot
az aks update
med parametern--disable-image-cleaner
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --disable-image-cleaner
kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3
Nej.
Nej. Standardinställningarna för sårbarhetsnivåer är:
LOW
,MEDIUM
,HIGH
ochCRITICAL
Du kan inte anpassa standardinställningarna.
Bildloggar lagras i eraser-aks-xxxxx
arbetspodden. När eraser-aks-xxxxx
är vid liv kan du köra följande kommandon för att visa borttagningsloggar:
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
Podden eraser-aks-xxxxx
tas bort inom 10 minuter efter att arbetet har slutförts. Du kan följa de här stegen för att aktivera Azure Monitor-tillägget och använda loggtabellen för Container Insights-podden. Därefter lagras historiska loggar och du kan granska dem även eraser-aks-xxxxx
tas bort.
Kontrollera att Azure Monitoring är aktiverat i klustret. Detaljerade steg finns i Aktivera Container Insights i AKS-kluster.
Hämta Log Analytics-resurs-ID:t med hjälp av
az aks show
kommandot .az aks show --resource-group myResourceGroup --name myManagedCluster
Efter några minuter returnerar kommandot JSON-formaterad information om lösningen, inklusive arbetsytans resurs-ID:
"addonProfiles": { "omsagent": { "config": { "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>" }, "enabled": true } }
I Azure Portal söker du efter arbetsytans resurs-ID och väljer sedan Loggar.
Kopiera följande fråga till tabellen och ersätt
name
mederaser-aks-xxxxx
(arbetspoddens namn):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
Markera Kör. Alla borttagna bildloggar visas i området Resultat .
Feedback om Azure Kubernetes Service
Azure Kubernetes Service är ett öppen källkod projekt. Välj en länk för att ge feedback: