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.
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 adocker.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
Exclua o antigo
imagelist
usando okubectl delete
comando.kubectl delete ImageList imagelist
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 okubectl 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
Crie um arquivo JSON de exemplo para conter imagens excluídas.
cat > sample.json <<EOF {"excluded": ["excluded-image-name"]} EOF
Crie um
configmap
usando o arquivo JSON de exemplo usando o seguintekubectl create
comando andkubectl 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
eCRITICAL
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.
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.
Os logs para os contêineres em execução no
kube-system
namespace não são coletados por padrão. Remova okube-system
namespace doexclude_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.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 } }
No portal do Azure, procure a ID do recurso do espaço de trabalho e selecione Logs.
Copie uma das seguintes consultas e cole na janela de consulta.
Use a consulta a seguir se o cluster estiver usando o esquema ContainerLogV2. Se você ainda estiver usando
ContainerLog
o , atualize para ContainerlogV2.ContainerLogV2 | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system" | project TimeGenerated, PodName, LogMessage, LogSource
Se quiser continuar a usar
ContainerLog
o , 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
Selecione Executar. Todos os logs de imagem excluídos aparecem na área Resultados.
Azure Kubernetes Service