Dela via


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.

Kommentar

Image Cleaner är en funktion baserad på Eraser. I ett AKS-kluster är Image Cleanerfunktionsnamnet och egenskapsnamnet , medan de relevanta image cleaner-poddnamnen innehåller Eraser.

Förutsättningar

  • 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.

Begränsningar

Image Cleaner har ännu inte stöd för Windows-nodpooler eller virtuella AKS-noder.

Så här fungerar Image Cleaner

När du har aktiverat Image Cleaner kommer det att finnas en controller manager-podd med namnet eraser-controller-manager distribuerad till klustret.

Skärmbild av ett diagram som visar ImageCleaner-arbetsflödet. ImageCleaner-poddar som körs i klustret kan generera en ImageList, eller så kan manuella indata anges.

Med Image Cleaner kan du välja mellan manuellt och automatiskt läge och följande konfigurationsalternativ:

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

Automatiskt läge

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.

Manuellt läge

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.

Kommentar

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 DITT AKS-kluster

Aktivera Image Cleaner i ett nytt kluster

  • 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 kluster

  • 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 avbildningsrengöringsintervallet i ett nytt eller befintligt kluster

  • 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
    

Ta bort bilder manuellt med Hjälp av Image Cleaner

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 den docker.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 en befintlig imagelist och skapa en ny

  1. Ta bort det gamla imagelist med kommandot kubectl delete .

    kubectl delete ImageList imagelist
    
  2. 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 en befintlig imagelist

  • Ändra den befintliga imagelist med kommandot 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
    

När du använder manuellt läge eraser-aks-xxxxx tas podden bort inom 10 minuter efter att arbetet har slutförts.

Bildundantagslista

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

  • 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 användardefinierad undantagslista

  1. Skapa en JSON-exempelfil som ska innehålla exkluderade bilder.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Skapa en configmap med JSON-exempelfilen med hjälp av följande kubectl create och kubectl 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 avbildningsrengöringsmedel

  • 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
    

Vanliga frågor

Hur kan jag kontrollera vilken version Image Cleaner använder?

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

Har Image Cleaner stöd för andra sårbarhetsskannrar förutom trivy-scanner?

Nej.

Kan jag ange sårbarhetsnivåer för bilder som ska rensas?

Nej. Standardinställningarna för sårbarhetsnivåer är:

  • LOW,
  • MEDIUM,
  • HIGH och
  • CRITICAL

Du kan inte anpassa standardinställningarna.

Hur granskar man bilder har rensats upp av Image Cleaner?

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.

  1. Kontrollera att Azure Monitoring är aktiverat i klustret. Detaljerade steg finns i Aktivera Container Insights i AKS-kluster.

  2. 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
      }
    }
    
  3. I Azure Portal söker du efter arbetsytans resurs-ID och väljer sedan Loggar.

  4. Kopiera följande fråga till tabellen och ersätt name med eraser-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
    
  5. Markera Kör. Alla borttagna bildloggar visas i området Resultat .