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

Ke sestavování a nasazování imagí v clusterech Azure Kubernetes Service (AKS) se běžně používají kanály. I když je tento proces skvělý pro vytváření imagí, často nezohlední zastaralé image, které zůstaly na uzlech clusteru, 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í.

Poznámka:

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

Požadavky

  • Předplatné 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 instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.

Omezení

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

Název Popis Povinní účastníci
--enable-image-cleaner Povolení funkce Image Cleaner pro cluster AKS Ano, pokud není zadán zákaz
--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 dobu intervalu (v hodinách) Nástroj Image Cleaner, který se používá ke spuštění. 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 eraser-controller-manager nasazení se automaticky provede 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 kontrole ohrožení zabezpečení 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 aktivuje eraser-contoller-manager vytvoření eraser-aks-xxxxx pracovních podů pro každý uzel a dokončení ručního procesu odebrání.

Poznámka:

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í az aks create příkazu 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

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

    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

Důležité

Možnost name musí být nastavená 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 image, 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 v okamžiku, kdy se v existujícím imagelistprostředí vytvoří nový imagelist nebo se změní . Po odstranění imagelist obrázku se 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.

Odstranění existujícího imageListu a vytvoření nového

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

    kubectl delete ImageList imagelist
    
  2. Vytvořte nový imagelist se stejným názvem image. 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. Pomocí následujícího kubectl create příkazu kubectl label vytvořte configmap ukázkový soubor JSON.

    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
    

Často kladené dotazy

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é kontroly ohrožení zabezpečení než trivy-scanner?

Ne.

Můžu určit úrovně ohrožení zabezpečení pro vyčištění imagí?

Ne. 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 byly vyčištěny nástrojem Image Cleaner?

Protokoly obrázků se ukládají do pracovního 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 eraser-aks-xxxxx vy.

  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 získejte ID az aks show 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 webu Azure Portal vyhledejte ID prostředku pracovního prostoru a pak 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 .