Compartilhar via


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

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

Observação

O Image Cleaner é um recurso baseado no 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 Limpador de Imagens contêm Eraser.

Pré-requisitos

  • Uma assinatura do Azure. Caso não tenha uma assinatura do Azure, é possível criar uma conta gratuita.
  • 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

O Limpador de Imagens ainda não oferece suporte a pools de nós do Windows ou nós virtuais AKS.

Como funciona o Image Cleaner

Depois de habilitar o Limpador de Imagens, haverá um pod gerenciador de controlador 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 um ImageList ou pode ser fornecida a entrada manual.

Com o Limpador de Imagens, 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 Necessário
--enable-image-cleaner Habilitar o recurso Image Cleaner para um cluster do AKS Sim, a menos que desabilitar seja especificado
--disable-image-cleaner Desabilitar o recurso Image Cleaner para um cluster do AKS Sim, a menos que ativar seja especificado
--image-cleaner-interval-hours Esse parâmetro determina o tempo de intervalo (em horas) que o Limpador de Imagens usa para executar. O valor padrão da CLI do Azure é de uma semana, o valor mínimo é de 24 horas e o máximo é de três meses. Não necessário para a CLI do Azure, necessário para o modelo do ARM ou outros clientes

Modo automático

Quando eraser-controller-manager for implantado, as etapas a seguir serão automaticamente executadas:

  • 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 trabalho:
    • Um coletor, que coleta imagens não utilizadas
    • Um trivy-scanner, que utiliza o trivy para verificar vulnerabilidades de imagens.
    • 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 programada ocorrerá de acordo com o --image-cleaner-interval-hours que você definiu.

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.

Habilitar o Image Cleaner em seu cluster do AKS

Habilitar o Limpador de Imagens em um novo cluster

  • Habilite o Limpador de Imagens em um novo cluster 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
    

Habilitar o Limpador de Imagens em um cluster existente

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

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

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

  • Atualize o intervalo Limpador de Imagens em um cluster AKS novo ou existente usando o parâmetro --image-cleaner-interval-hours.

    # 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 Image Cleaner

  • Desative o Limpador de Imagens no cluster 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

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 rever imagens foram limpas pelo Limpador de Imagens?

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 o Monitoramento do Azure está habilitado em seu cluster. Para obter etapas detalhadas, consulte Habilitar Insights de Contêiner em clusters AKS.

  2. 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
      }
    }
    
  3. No portal do Azure, pesquise a ID do recurso do workspace e selecione Logs.

  4. Copie a seguinte consulta na tabela, substituindo name por eraser-aks-xxxxx (nome do pod de trabalho):

    let startTimestamp = ago(1h);
    KubePodInventory
    | where TimeGenerated > startTimestamp
    | project ContainerID, PodName=Name, Namespace
    | where PodName contains "name" and Namespace startswith "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
    
  5. Selecione Executar. Todos os logs de imagem excluídos aparecem na área Resultados

    Captura de tela mostrando os logs de imagem excluídos no portal do Azure.