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.
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 colecionador, 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 imagemdocker.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
Exclua o antigo
imagelist
usando o comandokubectl delete
.kubectl delete ImageList imagelist
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 comandokubectl 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
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 seguinte comandokubectl create
ekubectl 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
eCRITICAL
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.
Verifique se o Monitoramento do Azure está habilitado em seu cluster. Para obter etapas detalhadas, consulte Habilitar Insights de Contêiner em clusters AKS.
Os logs dos contêineres em execução no namespace
kube-system
não são coletados por padrão. Remova o namespacekube-system
deexclude_namespaces
no mapa de configurações e aplique o mapa de configurações para habilitar a coleção desses logs. Consulte Configurar a coleta de dados dos insights do Contêiner para obter detalhes.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 } }
No portal do Azure, pesquise a ID do recurso do workspace e selecione Logs.
Copie uma das consultas a seguir e cole na janela consulta.
Use a seguinte consulta se seu cluster estiver usando o esquema ContainerLogV2. Se você ainda estiver usando
ContainerLog
, você deverá atualizar 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: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