Sdílet prostřednictvím


Vyčištění ohrožených zastaralých imagí v clusteru Azure Kubernetes Service (AKS) pomocí nástroje Image Cleaner

K vytváření a nasazování image v clusterech Azure Kubernetes Service (AKS) se běžně používají pipeliny. I když je tento proces skvělý pro vytváření image, často nezohledňuje zastaralé image, které zůstaly na uzlech clusteru, a může vést k nafouknutí image. Tyto image můžou obsahovat ohrožení zabezpečení, což může způsobit problémy se zabezpečením. Pokud chcete odebrat rizika zabezpečení ve vašich clusterech, můžete tyto neodkazované image vyčistit. Ruční čištění obrázků může být časově náročné. Nástroj Image Cleaner provádí automatickou identifikaci a odebrání obrázků, což snižuje riziko zastaralých obrázků a zkracuje dobu potřebnou k jejich vyčištění.

Note

Image Cleaner je funkce založená na nástroji Eraser. V clusteru AKS je název funkce a název vlastnosti Image Cleaner, zatímco názvy příslušných podů Image Cleaner obsahují Eraser.

Prerequisites

  • Předplatné služby Azure. Pokud ještě nemáte předplatné Azure, můžete si vytvořit bezplatný účet.
  • Azure CLI verze 2.49.0 nebo novější Spuštěním az --version vyhledejte svou verzi. Pokud potřebujete instalovat nebo upgradovat, podívejte se na Install Azure CLI.

Limitations

Nástroj Image Cleaner zatím nepodporuje fondy uzlů Windows nebo virtuální uzly AKS.

Jak funguje Image Cleaner

Po povolení nástroje Image Cleaner se do vašeho clusteru nasadí pod správce kontroleru s názvem eraser-controller-manager .

Snímek obrazovky diagramu znázorňující pracovní postup ImageCleaner Pody ImageCleaner spuštěné v clusteru můžou generovat ImageList nebo je možné zadat ruční vstup.

Pomocí nástroje Image Cleaner si můžete vybrat mezi ručním a automatickým režimem a následujícími možnostmi konfigurace:

Možnosti konfigurace

Name Description Required
--enable-image-cleaner Povolení funkce Image Cleaner pro cluster AKS Ano, pokud není zadána deaktivace
--disable-image-cleaner Zakázání funkce Image Cleaner pro cluster AKS Ano, pokud není zadáno povolení
--image-cleaner-interval-hours Tento parametr určuje časový interval (v hodinách), ve kterém se spouští Image Cleaner. Výchozí hodnota azure CLI je jeden týden, minimální hodnota je 24 hodin a maximum je tři měsíce. Nevyžaduje se pro Azure CLI, vyžaduje se pro šablonu ARM nebo jiné klienty.

Automatický režim

Po nasazení eraser-controller-manager se automaticky provedou následující kroky:

  • Okamžitě spustí proces vyčištění a vytvoří eraser-aks-xxxxx pracovní pody pro každý uzel.
  • Každý pracovní pod obsahuje tři kontejnery:
    • Kolektor, který shromažďuje nepoužívané image.
    • Trivy-scanner, který využívá trivy ke skenování zranitelností obrázků.
    • Odstraňovač, který odebere nepoužívané image s ohroženími zabezpečení.
  • Po dokončení procesu čištění se pracovní pod odstraní a podle vámi definované definice --image-cleaner-interval-hours proběhne další naplánované vyčištění.

Ruční režim

Vyčištění můžete aktivovat ručně definováním objektuImageList CRD. Tím se spustí eraser-contoller-manager vytvoření pracovních podů eraser-aks-xxxxx pro každý uzel a dokončení ručního procesu odebrání.

Note

Po zakázání nástroje Image Cleaner stále existuje stará konfigurace. To znamená, že pokud funkci znovu povolíte bez explicitního předávání konfigurace, použije se stávající hodnota místo výchozí hodnoty.

Povolení funkce Image Cleaner v clusteru AKS

Povolení funkce Image Cleaner v novém clusteru

  • Povolte nástroj Image Cleaner v novém clusteru AKS pomocí příkazu az aks create s parametrem --enable-image-cleaner.

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

Povolení funkce Image Cleaner v existujícím clusteru

  • Povolte nástroj Image Cleaner v existujícím AKS clusteru pomocí příkazu az aks update.

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

Aktualizace intervalu Čištění obrázků v novém nebo existujícím clusteru

  • Pomocí parametru --image-cleaner-interval-hours aktualizujte interval nástroje Image Cleaner na novém nebo existujícím clusteru AKS.

    # 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
    

Ruční odebrání obrázků pomocí nástroje Image Cleaner

Important

name musí být nastaveno na imagelist.

  • Ručně odeberte obrázek pomocí následujícího kubectl apply příkazu. Tento příklad odebere docker.io/library/alpine:3.7.3 obraz, pokud se nepoužívá.

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

Ruční vyčištění je jednorázová operace a aktivuje se pouze tehdy, když je vytvořen nový imagelist nebo jsou provedeny změny ve stávajícím imagelist. Po odstranění obrázku se imagelist neodstraní automaticky.

Pokud potřebujete aktivovat další ruční vyčištění, musíte vytvořit nový imagelist nebo provést změny existujícího. Pokud chcete stejnou image znovu odebrat, musíte vytvořit novou imagelist.

Odstraňte existující ImageList a vytvořte nový

  1. Pomocí příkazu kubectl delete odstraňte starou imagelist.

    kubectl delete ImageList imagelist
    
  2. Vytvořte nový imagelist se stejným názvem obrazu. Následující příklad používá stejný obrázek jako předchozí příklad.

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

Úprava existujícího ImageListu

  • Upravte existující imagelist pomocí kubectl edit příkazu.

    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
    

Při použití ručního režimu se eraser-aks-xxxxx pod odstraní do 10 minut po dokončení práce.

Seznam vyloučení obrázků

Image zadané v seznamu vyloučení se z clusteru neodeberou. Image Cleaner podporuje seznamy vyloučení definované systémem a uživatelem. Není podporováno úpravu seznamu vyloučení systému.

Kontrola seznamu vyloučení systému

  • Pomocí následujícího kubectl get příkazu zkontrolujte seznam vyloučení systému.

    kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
    

Vytvoření seznamu vyloučení definovaných uživatelem

  1. Vytvořte ukázkový soubor JSON, který bude obsahovat vyloučené obrázky.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Vytvořte configmap pomocí ukázkového souboru JSON s použitím následujících příkazů kubectl create a kubectl label.

    kubectl create configmap excluded --from-file=sample.json --namespace=kube-system
    kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
    

Zakázání čističe obrázků

  • Pomocí příkazu s parametrem az aks update zakažte nástroj Image Cleaner ve vašem clusteru --disable-image-cleaner .

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

časté otázky

Jak zjistím, jakou verzi Image Cleaner používá?

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

Podporuje Image Cleaner jiné nástroje pro skenování zranitelností než trivy-scanner?

No.

Můžu určit úrovně zranitelnosti pro vyčištění obrazů?

No. Mezi výchozí nastavení úrovní ohrožení zabezpečení patří:

  • LOW,
  • MEDIUM,
  • HIGH, a
  • CRITICAL

Výchozí nastavení nemůžete přizpůsobit.

Jak zkontrolovat obrázky, které byly vyčištěny pomocí nástroje Image Cleaner?

Protokoly obrázků jsou uloženy v pracovním podu eraser-aks-xxxxx. Pokud eraser-aks-xxxxx je aktivní, můžete spuštěním následujících příkazů zobrazit protokoly odstranění:

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

Pod eraser-aks-xxxxx se odstraní do 10 minut po dokončení práce. Tímto postupem povolíte doplněk Azure Monitor a použijete tabulku protokolů podů Container Insights. Potom se uloží historické protokoly a můžete je zkontrolovat, i když je eraser-aks-xxxxx odstraněno.

  1. Ujistěte se, že je ve vašem clusteru povolené monitorování Azure. Podrobný postup najdete v tématu Povolení služby Container Insights v clusterech AKS.

  2. Protokoly pro kontejnery spuštěné v kube-system oboru názvů se ve výchozím nastavení neshromažďují. kube-system Odeberte obor názvů z exclude_namespaces objektu configmap a použijte mapu konfigurace pro povolení shromažďování těchto protokolů. Podrobnosti najdete v tématu Konfigurace shromažďování dat Container Insights .

  3. Pomocí příkazu az aks show získejte ID prostředku Log Analytics.

      az aks show --resource-group myResourceGroup --name myManagedCluster
    

    Po několika minutách příkaz vrátí informace o řešení ve formátu JSON, včetně ID prostředku pracovního prostoru:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  4. Na portálu Azure vyhledejte ID prostředku pracovního prostoru a poté vyberte Protokoly.

  5. Zkopírujte jeden z následujících dotazů a vložte ho do okna dotazu.

    1. Pokud váš cluster používá schéma ContainerLogV2, použijte následující dotaz. Pokud stále používáte ContainerLog, měli byste upgradovat na ContainerlogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    2. Pokud chcete pokračovat v používání ContainerLog, použijte místo toho následující dotaz:

      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. Vyberte Spustit. Všechny odstraněné protokoly obrázků se zobrazí v oblasti Výsledky .