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

Aplica-se a: ✔️ AKS Automatic ✔️ AKS Standard

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

O AKS Automatic é a predefinição recomendada, pronta para produção, para a maioria das cargas de trabalho do AKS. O Limpador de Imagens está pré-configurado em clusters automáticos AKS para ajudar a remover imagens não utilizadas com vulnerabilidades por defeito.

Nos clusters AKS Standard, o Image Cleaner é opcional e podes ativa-o explicitamente.

Para mais informações sobre o AKS Automatic, veja O que é o Azure Kubernetes Service (AKS) Automatic?

Nota

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

Comportamento do AKS Automatic e do AKS Standard

Pré-requisitos

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

Limitações

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

Como funciona o Image Cleaner

Quando ativas o Image Cleaner no teu cluster, ele implementa um pod gestor de controladores chamado eraser-controller-manager.

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.

O Limpador de Imagens suporta modos de limpeza automática e manual.

Opções de configuração para o AKS Standard

Use estas opções ao configurar o Image Cleaner no AKS Standard com CLI do Azure.

Nome Descrição Obrigatório
--enable-image-cleaner Ativar o Limpador de Imagens para um cluster AKS Sim, a menos que especifique desativar
--disable-image-cleaner Desativar o Limpador de Imagens para um cluster AKS Sim, a menos que especifique a ativação
--image-cleaner-interval-hours Intervalo em horas para as corridas agendadas. O padrão da CLI do Azure é uma semana. O mínimo é 24 horas. O máximo são três meses. Não é obrigatório para CLI do Azure; é obrigatório para templates ARM ou outros clientes

Nota

Se desativar o Limpador de Imagens e depois o reativar sem passar explicitamente a configuração, o valor de configuração anterior é reutilizado.

Modo automático

Quando implementa eraser-controller-manager, o Image Cleaner executa automaticamente estas ações:

  • Inicia a limpeza e cria eraser-aks-xxxxx grupos de trabalhadores para cada nó.
  • Utiliza um contentor coletor para recolher imagens não utilizadas.
  • Usa um contentor trivy-scanner para analisar vulnerabilidades com trivy.
  • Utiliza um contentor de remover para remover imagens não utilizadas com vulnerabilidades.
  • Elimina o pod de trabalho após a conclusão.
  • Programa a próxima limpeza de acordo com --image-cleaner-interval-hours.

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.

Use o Limpador de Imagens no AKS Automático e no AKS Standard

AKS Automático

O Image Cleaner está pré-configurado nos clusters automáticos do AKS, que são o padrão recomendado para produção na maioria das cargas de trabalho do AKS. Não precisas de executar um comando de ativação separado.

Para criar um cluster AKS Automatic, veja Criar um cluster AKS Automatic.

Use as orientações manuais de limpeza e monitorização deste artigo quando quiser uma remediação direcionada ou verificação operacional.

Padrão AKS: ativar num novo cluster

Ative o Limpador de Imagens num novo cluster AKS Standard 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

Norma AKS: ativar num cluster existente

Ative o Limpador de Imagens num cluster AKS Standard existente usando o az aks update comando.

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

AKS Standard: intervalo de atualização num cluster novo ou existente

Atualize o intervalo Image Cleaner num cluster AKS Standard 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 precisar acionar outra limpeza manual, deverá criar uma nova imagelist ou fazer alterações numa 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 ficheiro JSON de exemplo usando o seguinte comando kubectl create e 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 o Limpador de Imagens no AKS Standard

Desative o Limpador de Imagens num cluster AKS Standard usando o az aks update comando com o --disable-image-cleaner parâmetro.

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

Perguntas mais frequentes (FAQ)

O Limpador de Imagens está ativado por defeito no AKS Automático?

Yes. O Image Cleaner está pré-configurado em clusters automáticos do AKS.

Preciso de executar comandos de ativação do Image Cleaner no AKS Automatic?

N.º Utilize os comandos enable para o AKS Standard.

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 serem limpas?

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 as imagens que foram limpas pelo Image Cleaner?

Os logs de imagem são armazenados no worker pod eraser-aks-xxxxx. 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 pode revê-los mesmo que eraser-aks-xxxxx seja excluído.

  1. Assegure que o Azure Monitor está ativado no seu cluster. Para obter etapas detalhadas, consulte Habilitar informações de contêiner em clusters AKS.

  2. Por defeito, os registos dos contentores que estão em execução no espaço de nomes kube-system não são recolhidos. Remova o kube-system namespace do exclude_namespaces mapa de configuração e aplique o mapa de configuração para permitir a recolha destes registos. 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 Azure, procure o ID do recurso do espaço de trabalho e depois selecione Logs.

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

    • Use a consulta a seguir se o cluster estiver usando o esquema ContainerLogV2. Se ainda estiveres a usar ContainerLog, atualiza para o ContainerLogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    • Se quiser continuar a usar ContainerLog, 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.