Partilhar via


Use o Image Cleaner para limpar imagens obsoletas vulneráveis em seu cluster do Serviço Kubernetes do Azure (AKS)

É comum usar pipelines para criar e implantar imagens em clusters do Serviço Kubernetes do Azure (AKS). Embora seja ótimo para a criação de imagens, esse processo geralmente não leva em conta as imagens obsoletas deixadas para trás e pode levar ao inchaço da imagem nos nós do cluster. Essas imagens podem conter vulnerabilidades, o que pode criar problemas de segurança. Para remover os riscos de segurança em seus clusters, você pode limpar essas imagens não referenciadas. A limpeza manual de imagens pode exigir muito tempo. O Image Cleaner realiza a identificação e remoção automática de imagens, o que reduz o risco de imagens obsoletas e reduz o tempo necessário para limpá-las.

Nota

Image Cleaner é um recurso baseado em Eraser. Em um cluster AKS, o nome do recurso e o nome da propriedade são Image Cleaner, enquanto os nomes dos pods relevantes do Image Cleaner contêm Eraser.

Pré-requisitos

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, pode criar uma conta gratuita.
  • Azure CLI versão 2.49.0 ou posterior. Execute az --version para encontrar a sua versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Limitações

O Image Cleaner ainda não suporta pools de nós do Windows ou nós virtuais AKS.

Como funciona o Image Cleaner

Depois de habilitar o Image Cleaner, haverá um pod do gerenciador de controladores chamado eraser-controller-manager implantado no cluster.

Captura de tela de um diagrama mostrando o fluxo de trabalho do ImageCleaner. Os pods do ImageCleaner em execução no cluster podem gerar uma ImageList ou a entrada manual pode ser fornecida.

Com o Image Cleaner, você pode escolher entre o modo manual e automático e as seguintes opções de configuração:

Opções de configuração

Nome Descrição Obrigatório
--enable-image-cleaner Ativar o recurso Image Cleaner para um cluster AKS Sim, a menos que a desativação seja especificada
--disable-image-cleaner Desative o recurso Image Cleaner para um cluster AKS Sim, a menos que enable seja especificado
--image-cleaner-interval-hours Este parâmetro determina o tempo de intervalo (em horas) que o Image Cleaner usa para executar. O valor padrão para a CLI do Azure é uma semana, o valor mínimo é 24 horas e o máximo é três meses. Não é necessário para a CLI do Azure, necessário para o modelo ARM ou outros clientes

Modo automático

Uma vez eraser-controller-manager implantado, as seguintes etapas serão executadas automaticamente:

  • Ele inicia imediatamente o processo de limpeza e cria eraser-aks-xxxxx pods de trabalho para cada nó.
  • Há três contêineres em cada pod de trabalhador:
    • Um colecionador, que recolhe imagens não utilizadas.
    • Um trivy-scanner, que aproveita o trivy para verificar vulnerabilidades de imagem.
    • Um removedor, que remove imagens não utilizadas com vulnerabilidades.
  • Após a conclusão do processo de limpeza, o pod de trabalho é excluído e a próxima limpeza agendada acontece de acordo com a --image-cleaner-interval-hours definição que você definir.

Modo manual

Você pode acionar manualmente a limpeza definindo um objeto CRD,ImageList. Isso aciona o eraser-contoller-manager para criar eraser-aks-xxxxx pods de trabalho para cada nó e concluir o processo de remoção manual.

Nota

Depois de desativar o Image Cleaner, a configuração antiga ainda existe. Isso significa que, se você habilitar o recurso novamente sem passar explicitamente pela configuração, o valor existente será usado em vez do padrão.

Ativar o Image Cleaner no seu cluster AKS

Ativar o Image Cleaner em um novo cluster

  • Habilite o Image Cleaner em um novo cluster AKS usando o az aks create comando com o --enable-image-cleaner parâmetro.

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

Habilitar o Image Cleaner em um cluster existente

  • Habilite o Image Cleaner em um cluster AKS existente usando o az aks update comando.

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

Atualizar o intervalo do Limpador de Imagem em um cluster novo ou existente

  • Atualize o intervalo do Image Cleaner em um cluster AKS novo ou existente usando o --image-cleaner-interval-hours parâmetro.

    # 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
    

Remover imagens manualmente usando o Image Cleaner

Importante

O cabeçalho name deve ser definido como imagelist.

  • Remova manualmente uma imagem usando o seguinte kubectl apply comando. Este exemplo remove a docker.io/library/alpine:3.7.3 imagem se ela não for usada.

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

A limpeza manual é uma operação única e só é acionada quando um novo imagelist é criado ou alterações são feitas no existente imagelist. Depois que a imagem for excluída, a imagelist imagem não será excluída automaticamente.

Se você precisar acionar outra limpeza manual, terá que criar uma nova imagelist ou fazer alterações em uma existente. Se você quiser remover a mesma imagem novamente, você precisa criar um novo imagelist.

Excluir uma ImageList existente e criar uma nova

  1. Exclua o antigo imagelist usando o kubectl delete comando.

    kubectl delete ImageList imagelist
    
  2. Crie uma nova imagelist com o mesmo nome de imagem. O exemplo a seguir usa a mesma imagem do exemplo anterior.

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

Modificar uma ImageList existente

  • Modifique o existente imagelist usando o kubectl edit comando.

    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
    

Ao usar o modo manual, o pod é excluído dentro de 10 minutos após a eraser-aks-xxxxx conclusão do trabalho.

Lista de exclusão de imagens

As imagens especificadas na lista de exclusão não são removidas do cluster. O Image Cleaner suporta listas de exclusão definidas pelo sistema e pelo utilizador. Não há suporte para editar a lista de exclusão do sistema.

Verifique a lista de exclusão do sistema

  • Verifique a lista de exclusão do sistema usando o seguinte kubectl get comando.

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

Criar uma lista de exclusão definida pelo usuário

  1. Crie um arquivo JSON de exemplo para conter imagens excluídas.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Crie um configmap usando o arquivo JSON de exemplo usando o seguinte kubectl create comando and 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
    

Desativar Image Cleaner

  • Desative o Image Cleaner no cluster usando o az aks update comando com o --disable-image-cleaner parâmetro.

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

FAQ

Como posso verificar qual versão o Image Cleaner está usando?

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

O Image Cleaner suporta outros scanners de vulnerabilidade além do trivy-scanner?

N.º

Posso especificar níveis de vulnerabilidade para as imagens limparem?

N.º As configurações padrão para os níveis de vulnerabilidade incluem:

  • LOW,
  • MEDIUM,
  • HIGH e
  • CRITICAL

Não é possível personalizar as configurações padrão.

Como rever imagens foram limpas pelo Image Cleaner?

Os logs de imagem são armazenados no pod de eraser-aks-xxxxx trabalho. Quando eraser-aks-xxxxx estiver ativo, você poderá executar os seguintes comandos para exibir os logs de exclusão:

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

O eraser-aks-xxxxx pod é excluído dentro de 10 minutos após a conclusão do trabalho. Você pode seguir estas etapas para habilitar o complemento Azure Monitor e usar a tabela de log do pod do Container Insights. Depois disso, os logs históricos serão armazenados e você pode revisá-los até eraser-aks-xxxxx mesmo é excluído.

  1. Verifique se o Monitoramento do Azure está habilitado em seu cluster. Para obter etapas detalhadas, consulte Habilitar informações de contêiner em clusters AKS.

  2. Os logs para os contêineres em execução no kube-system namespace não são coletados por padrão. Remova o kube-system namespace do exclude_namespaces configmap e aplique o config map para habilitar a coleta desses logs. Consulte Configurar a coleta de dados do Container insights para obter detalhes.

  3. Obtenha o ID do recurso do Log Analytics usando o az aks show comando.

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

    Após alguns minutos, o comando retorna informações formatadas em JSON sobre a solução, incluindo a ID do recurso do espaço de trabalho:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  4. No portal do Azure, procure a ID do recurso do espaço de trabalho e selecione Logs.

  5. Copie uma das seguintes consultas e cole na janela de consulta.

    1. Use a consulta a seguir se o cluster estiver usando o esquema ContainerLogV2. Se você ainda estiver usando ContainerLogo , atualize para ContainerlogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    2. Se quiser continuar a usar ContainerLogo , use a seguinte consulta:

      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. Selecione Executar. Todos os logs de imagem excluídos aparecem na área Resultados.