Använd Image Cleaner för att rensa sårbara inaktuella avbildningar i ditt AKS-kluster (Azure Kubernetes Service)

Gäller för: ✔️ AKS Automatic ✔️ AKS Standard

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

AKS Automatic är den rekommenderade produktionsklara standardinställningen för de flesta AKS-arbetsbelastningar. Image Cleaner är förkonfigurerat i AKS Automatiska kluster för att ta bort oanvända bilder med sårbarheter som standard.

I AKS Standard-kluster är Image Cleaner valfritt och du aktiverar det uttryckligen.

Mer information om AKS Automatic finns i Vad är Azure Kubernetes Service (AKS) Automatisk?

Anteckning

Image Cleaner är en funktion baserad på Eraser. På AKS är funktionsnamnet och egenskapsnamnet Image Cleaner, medan de relevanta Image Cleaner-poddarnas namn innehåller Eraser.

AKS Automatic- och AKS Standard-beteende

Förutsättningar

  • Ett Azure-abonnemang. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto.
  • För AKS Standard-konfiguration via Azure CLI 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 aktiverar Image Cleaner i klustret distribueras en controller manager-podd med namnet eraser-controller-manager.

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.

Image Cleaner stöder automatiska och manuella rensningslägen.

Konfigurationsalternativ för AKS Standard

Använd de här alternativen när du konfigurerar Image Cleaner på AKS Standard med Azure CLI.

Name beskrivning Obligatoriskt
--enable-image-cleaner Aktivera Image Cleaner för ett AKS-kluster Ja, såvida du inte anger inaktivera
--disable-image-cleaner Inaktivera Image Cleaner för ett AKS-kluster Ja, om du inte anger ”enable”.
--image-cleaner-interval-hours Intervall i timmar för schemalagda körningar. Azure CLI standardvärdet är en vecka. Minst 24 timmar. Max är tre månader. Krävs inte för Azure CLI; krävs för ARM-mall eller andra klienter

Anteckning

Om du inaktiverar Image Cleaner och senare kan återanvända det utan att uttryckligen skicka konfigurationen återanvänds det tidigare konfigurationsvärdet.

Automatiskt läge

När du distribuerar eraser-controller-managerutför Image Cleaner automatiskt följande åtgärder:

  • Startar rensningen och skapar eraser-aks-xxxxx worker-poddar för varje nod.
  • Använder en uppsamlingsbehållare för att samla upp oanvända images.
  • Använder en trivy-scanner-container för att genomsöka sårbarheter med trivy.
  • Använder en remover-container för att ta bort oanvända avbildningar med sårbarheter.
  • Raderar worker-podden när den är slutförd.
  • Schemalägger nästa rensning enligt --image-cleaner-interval-hours.

Manuellt läge

Du kan utlösa rensningen manuellt genom att definiera ett CRD-objektImageList. Detta aktiverar eraser-contoller-manager så att eraser-aks-xxxxx skapar arbetspoddar för varje nod och slutför 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.

Använda Image Cleaner på AKS Automatic och AKS Standard

AKS Automatisk

Image Cleaner är förkonfigurerat i AKS Automatiska kluster, vilket är den rekommenderade produktionsklara standardinställningen för de flesta AKS-arbetsbelastningar. Du behöver inte köra ett separat aktiveringskommando.

Information om hur du skapar ett AKS-automatiskt kluster finns i Skapa ett AKS-automatiskt kluster.

Använd vägledningen för manuell rensning och övervakning i den här artikeln när du vill ha riktad reparation eller driftsverifiering.

AKS Standard: aktivera i ett nytt kluster

Aktivera Image Cleaner i ett nytt AKS Standard-kluster med hjälp av az aks create kommandot med parametern --enable-image-cleaner .

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

AKS Standard: aktivera i ett befintligt kluster

Aktivera Image Cleaner i ett befintligt AKS Standard-kluster med kommandot az aks update .

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

AKS Standard: uppdateringsintervall för ett nytt eller befintligt kluster

Uppdatera intervallet Image Cleaner i ett nytt eller befintligt AKS Standard-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 docker.io/library/alpine:3.7.3 om den 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 bilden har raderats kommer imagelist inte att tas 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 bildnamn. 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.

Lista över undantagna bilder

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 Image Cleaner på AKS Standard

Inaktivera Image Cleaner i ett AKS Standard-kluster med kommandot az aks update med parametern --disable-image-cleaner .

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

Vanliga frågor (FAQ)

Är Image Cleaner aktiverat som standard på AKS Automatic?

Ja. Image Cleaner är förkonfigurerat i AKS Automatiska kluster.

Behöver jag köra kommandon för att aktivera Image Cleaner på AKS Automatic?

Nej. Använd aktivera-kommandona för AKS Standard.

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 worker-podden. 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 Monitor är aktiverat i klustret. Detaljerade steg finns i Aktivera Container Insights i AKS-kluster.

  2. Som standard samlas inte loggar för containrar som körs i kube-system namnområdet in. kube-system Ta bort namnområdet från exclude_namespaces i konfigurationskartan och använd konfigurationskartan för att aktivera insamling av dessa loggar. Mer information finns i Konfigurera datainsamling för Container Insights.

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

  5. Kopiera en av följande frågor och klistra in den i frågefönstret.

    • Använd följande fråga om klustret använder ContainerLogV2-schemat. Om du fortfarande använder ContainerLoguppgraderar du till ContainerLogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    • Om du vill fortsätta använda ContainerLoganvänder du följande fråga i stället:

      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. Markera Kör. Alla borttagna bildloggar visas i området Resultat .