Usar o Limpador de Imagens para limpar imagens obsoletas vulneráveis no cluster do AKS (Serviço de Kubernetes do Azure)

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

É comum usar pipelines para criar e implantar imagens em clusters do 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 a sobrecarga de imagem nos nós do cluster. Essas imagens podem conter vulnerabilidades, o que pode criar problemas de segurança. Para remover riscos de segurança em seus clusters, você pode limpar essas imagens não referenciadas. A limpeza manual de imagens pode consumir muito tempo. O Limpador de Imagens 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 é o padrão pronto para produção recomendado para a maioria das cargas de trabalho do AKS. O Limpador de Imagens é pré-configurado em clusters automáticos do AKS para ajudar a remover imagens não utilizados com vulnerabilidades por padrão.

Em clusters padrão do AKS, o Limpador de Imagens é opcional e você o habilita explicitamente.

Para obter mais informações sobre o AKS Automatic, consulte O que é AKS (Serviço de Kubernetes do Azure) Automático?

Observação

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

Comportamento automático do AKS e do AKS Standard

Pré-requisitos

  • Uma assinatura do Azure. Caso não tenha uma assinatura do Azure, é possível criar uma conta gratuita.
  • Para configuração do AKS Standard por meio de CLI do Azure, CLI do Azure versão 2.49.0 ou posterior. Execute az --version para localizar a sua versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

Limitações

A Limpeza de Imagens ainda não oferece suporte a pools de nós do Windows nem a nós virtuais do AKS.

Como funciona o Image Cleaner

Quando você ativa o Limpador de Imagens em seu cluster, ele implanta um pod do gerenciador 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 um ImageList ou pode ser fornecida a entrada manual.

O Image Cleaner dá suporte a modos de limpeza automáticos e manuais.

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

Use essas opções ao configurar o Limpador de Imagens no AKS Standard com CLI do Azure.

Nome Descrição Necessário
--enable-image-cleaner Habilitar o Limpador de Imagens para um cluster do AKS Sim, a menos que você especifique a desativação
--disable-image-cleaner Desabilitar o Limpador de Imagens para um cluster do AKS Sim, a menos que você especifique habilitar
--image-cleaner-interval-hours Intervalo em horas para execuções agendadas. O padrão da CLI do Azure é de uma semana. O mínimo é de 24 horas. O máximo é de três meses. Não é necessário para CLI do Azure; necessário para o modelo do ARM ou outros clientes

Observação

Se você desabilitar o Image Cleaner e depois reenabilitá-lo sem passar explicitamente a configuração, o valor de configuração anterior será reutilizado.

Modo automático

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

  • Inicia a limpeza e cria pods de trabalho eraser-aks-xxxxx para cada nó.
  • Usa um contêiner collector para coletar imagens não utilizadas.
  • Usa um contêiner trivy-scanner para verificar vulnerabilidades com trivy.
  • Usa um contêiner de removedor para remover imagens não utilizadas com vulnerabilidades.
  • Exclui 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 disparar manualmente a limpeza definindo um objeto CRD,ImageList. Isso dispara o eraser-contoller-manager para criar eraser-aks-xxxxx pods de trabalho para cada nó e concluir o processo de remoção manual.

Observação

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

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

AKS Automático

O Limpador de Imagens é pré-configurado em clusters automáticos do AKS, que são o padrão pronto para produção recomendado para a maioria das cargas de trabalho do AKS. Você não precisa executar um comando de habilitação separado.

Para criar um cluster automático do AKS, consulte Criar um cluster automático do AKS.

Use as diretrizes manuais de limpeza e monitoramento neste artigo quando desejar a correção direcionada ou a verificação operacional.

AKS Standard: habilitar em um novo cluster

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

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

AKS Standard: habilitar em um cluster existente

Habilite o Limpador de Imagens em um cluster padrão do AKS existente usando o az aks update comando.

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

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

Atualize o intervalo do Limpador de Imagens em um cluster novo ou existente do AKS Standard 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 Limpador de Imagens

Importante

O name deve ser definido como imagelist.

Remova manualmente uma imagem usando o seguinte comando kubectl apply. Este exemplo remove a imagem docker.io/library/alpine:3.7.3 se ela não estiver sendo 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ó é disparada quando um novo imagelist é criado ou quando são feitas alterações no imagelist existente. Depois que a imagem for excluída, o imagelist não será excluído automaticamente.

Se precisar disparar outra limpeza manual, você deverá criar um novo imagelist ou fazer alterações em um já existente. Se quiser remover a mesma imagem novamente, você precisará criar um imagelist.

Excluir uma ImageList existente e criar outra

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

    kubectl delete ImageList imagelist
    
  2. Crie um novo imagelist com o mesmo nome da 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 um ImageList existente

Modifique o imagelist existente usando o comando 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

Ao usar o modo manual, o pod eraser-aks-xxxxx será excluído em 10 minutos após a 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 Limpador de Imagens oferece suporte a listas de exclusão definidas pelo sistema e pelo usuário. 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 comando kubectl get.

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

Desabilitar o Limpador de Imagens no AKS Standard

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

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

Perguntas frequentes (FAQs)

O Limpador de Imagens está habilitado por padrão no AKS Automatic?

Sim. O Limpador de Imagens é pré-configurado em clusters automáticos do AKS.

Preciso executar comandos de habilitação para o Limpador de Imagens no AKS Automatic?

Não. Use os comandos de habilitação 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 Limpador de Imagens suporta outros scanners de vulnerabilidade além do trivy-scanner?

Não.

Posso especificar níveis de vulnerabilidade para imagens a serem limpas?

Não. 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 revisar as imagens que foram limpas pelo Image Cleaner?

Os registros de imagem são armazenados no pod de trabalho eraser-aks-xxxxx. Quando eraser-aks-xxxxx estiver ativo, você poderá executar os seguintes comandos para exibir os registros 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 pod eraser-aks-xxxxx é excluído em 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 registro de pods do Container Insights. Depois disso, os registros históricos serão armazenados e você poderá revisá-los mesmo que eraser-aks-xxxxx seja excluído.

  1. Verifique se Azure Monitor está habilitado no cluster. Para ver as etapas detalhadas, consulte Habilitar o Container Insights nos clusters do AKS.

  2. Por padrão, os logs dos contêineres em execução no kube-system namespace não são coletados. Remova o namespace kube-system de exclude_namespaces no mapa de configurações e aplique o mapa de configurações para habilitar a coleta desses logs. Consulte Configurar a coleta de dados dos insights do Contêiner para obter detalhes.

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

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

    Após alguns minutos, o comando retornará informações no formato JSON sobre a solução, incluindo a ID do recurso do workspace:

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

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

    • Use a seguinte consulta se seu cluster estiver usando o esquema ContainerLogV2. Se você ainda estiver usando ContainerLog, atualize para ContainerLogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    • Se você quiser continuar usando ContainerLog, use a seguinte consulta em vez disso:

      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