Utilice Image Cleaner para limpiar imágenes obsoletas vulnerables en su clúster de Azure Kubernetes Service (AKS)
Es habitual usar canalizaciones para crear e implementar imágenes en clústeres de Azure Kubernetes Service (AKS). Aunque es ideal para la creación de imágenes, este proceso a menudo no tiene en cuenta las imágenes obsoletas que quedan atrás y puede provocar un sobredimensionamiento de las imágenes en los nodos del clúster. Estas imágenes podrían contener vulnerabilidades, lo que podría crear problemas de seguridad. Para quitar los riesgos de seguridad en los clústeres, puede limpiar estas imágenes sin referencia. La limpieza manual de imágenes puede tardar mucho tiempo. Image Cleaner realiza la identificación y eliminación automáticas de imágenes, lo que mitiga el riesgo de imágenes obsoletas y reduce el tiempo necesario para limpiarlas.
Nota:
Image Cleaner es una característica basada en Borrador.
En un clúster de AKS, el nombre de la característica y el nombre de la propiedad es Image Cleaner
, mientras que los nombres de los pods de Image Cleaner relevantes contienen Eraser
.
Requisitos previos
- Suscripción a Azure. Si no tiene una suscripción a Azure, puede crear una cuenta gratuita.
- CLI de Azure versión 2.49.0 o posterior. Ejecute
az --version
para buscar su versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.
Limitaciones
Image Cleaner aún no admite grupos de nodos de Windows ni nodos virtuales de AKS.
Funcionamiento de Image Cleaner
Después de habilitar Image Cleaner, habrá un pod de administrador de controladores denominado eraser-controller-manager
implementado en el clúster.
Con Image Cleaner, puede elegir entre el modo manual y automático y las siguientes opciones de configuración:
Opciones de configuración
Nombre | Descripción | Obligatorio |
---|---|---|
--enable-image-cleaner |
Habilita la característica Image Cleaner para un clúster de AKS | Sí, a menos que se especifique la deshabilitación |
--disable-image-cleaner |
Deshabilita la característica Image Cleaner para un clúster de AKS | Sí, a menos que se especifique la habilitación |
--image-cleaner-interval-hours |
Este parámetro determina el intervalo de tiempo (en horas) que utiliza Image Cleaner para ejecutarse. El valor predeterminado para la CLI de Azure es una semana, el valor mínimo es de 24 horas y el máximo es de tres meses. | No es necesario para la CLI de Azure, se requiere para la plantilla de ARM u otros clientes. |
Modo automático
Una vez implementado eraser-controller-manager
, se llevarán a cabo los pasos siguientes automáticamente:
- En ese instante se inicia el proceso de limpieza y se crean
eraser-aks-xxxxx
pods de trabajo para cada nodo. - Hay tres contenedores en cada pod de trabajo:
- Un recopilador, que recopila imágenes sin usar.
- Un trivy-scanner, que saca provecho de trivy para examinar las vulnerabilidades de imágenes.
- Un eliminador, que quita imágenes usadas con vulnerabilidades.
- Una vez completado el proceso de limpieza, se elimina el pod de trabajo y la siguiente limpieza programada se produce según la
--image-cleaner-interval-hours
que defina.
Modo manual
También puede desencadenar manualmente la limpieza definiendo un objeto CRD, ImageList
. Esto desencadena el eraser-contoller-manager
para crear pods de trabajo eraser-aks-xxxxx
para cada nodo y completar el proceso de eliminación manual.
Nota:
Después de deshabilitar Image Cleaner, la configuración anterior sigue existiendo. Esto significa que si habilita la función nuevamente sin pasar explícitamente la configuración, se usa el valor existente en lugar del predeterminado.
Habilitación de Image Cleaner en el clúster de AKS
Habilite Image Cleaner en un nuevo clúster
Habilite Image Cleaner en un nuevo clúster de AKS mediante el comando
az aks create
con el parámetro--enable-image-cleaner
.az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --generate-ssh-keys
Habilite Image Cleaner en un clúster existente
Habilite Image Cleaner en un clúster de AKS existente mediante el comando
az aks update
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner
Actualice el intervalo de Image Cleaner en un clúster nuevo o existente
Actualice el intervalo de Image Cleaner en un clúster de AKS nuevo o existente mediante el 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
Eliminar imágenes manualmente usando Image Cleaner
Importante
El elemento name
debe estar establecido en imagelist
.
Elimine manualmente una imagen usando el siguiente comando
kubectl apply
. En este ejemplo se quita la imagen dedocker.io/library/alpine:3.7.3
si no se usa.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
La limpieza manual es una operación única y solo se desencadena cuando se crea una nueva imagelist
o se realizan cambios en la imagelist
existente. Una vez eliminada la imagen, la imagelist
no se eliminará automáticamente.
Si necesita desencadenar otra limpieza manual, debe crear una nueva imagelist
o realizar cambios en una existente. Si desea quitar de nuevo la misma imagen, debe crear una nueva imagelist
.
Eliminar un ImageList existente y crear uno nuevo
Elimine el antiguo
imagelist
mediante el comandokubectl delete
.kubectl delete ImageList imagelist
Cree un nuevo
imagelist
con el mismo nombre de imagen. En el siguiente ejemplo se usa la misma imagen que en el ejemplo 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
Modificación de un ImageList existente
Modificar los
imagelist
existentes mediante el 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
Cuando se usa el modo manual, el pod de eraser-aks-xxxxx
elimina en un plazo de 10 minutos después de la finalización del trabajo.
Lista de exclusión de imágenes
Las imágenes especificadas en la lista de exclusión no se quitan del clúster. Image Cleaner admite listas de exclusión definidas por el usuario y del sistema. No se admite editar la lista de exclusión del sistema.
Consulte la lista de exclusión del sistema
Compruebe la lista de exclusión del sistema mediante el siguiente comando
kubectl get
.kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
Crear una lista de exclusión definida por el usuario
Cree un archivo JSON de ejemplo para contener imágenes excluidas.
cat > sample.json <<EOF {"excluded": ["excluded-image-name"]} EOF
Cree un
configmap
mediante el archivo JSON de ejemplo mediante el siguiendokubectl create
y el comandokubectl label
.kubectl create configmap excluded --from-file=sample.json --namespace=kube-system kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
Deshabilitar Image Cleaner
Deshabilite Image Cleaner en su clúster usando el comando
az aks update
con el parámetro--disable-image-cleaner
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --disable-image-cleaner
Preguntas más frecuentes
¿Cómo puedo comprobar qué versión está usando el eliminador de imágenes?
kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3
¿Image Cleaner admite otros escáneres de vulnerabilidades además de trivy-scanner?
No.
¿Puedo especificar niveles de vulnerabilidad para que las imágenes se limpien?
No. La configuración predeterminada para los niveles de vulnerabilidad son:
LOW
,MEDIUM
,HIGH
yCRITICAL
No puede personalizar la configuración predeterminada.
¿Cómo se pueden revisar las imágenes que fueron limpiadas por Image Cleaner?
Los registros de imágenes se almacenan en el pod de trabajo eraser-aks-xxxxx
. Cuando eraser-aks-xxxxx
está activo, puede ejecutar los siguientes comandos para ver los registros de eliminación:
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
El pod de eraser-aks-xxxxx
elimina en un plazo de 10 minutos después de la finalización del trabajo. Siga estos pasos para habilitar el complemento de Azure Monitor y usar la tabla de registro del pod de Container Insights. Después, se almacenarán los registros históricos y podrá revisarlos incluso si eraser-aks-xxxxx
se elimina.
Asegúrese de que la supervisión de Azure está habilitada en el clúster. Para conocer los pasos detallados, consulte Habilitar Container Insights en clústeres de AKS.
Los registros de los contenedores que se ejecutan en el espacio de nombres
kube-system
no se recopilan de forma predeterminada. Quite el espacio de nombreskube-system
deexclude_namespaces
en configmap y aplique el mapa de configuración para habilitar la recopilación de estos registros. Consulte Configuración de la recopilación de datos de Container Insights para obtener más información.Obtenga el identificador de recurso de Log Analytics mediante el comando
az aks show
.az aks show --resource-group myResourceGroup --name myManagedCluster
Transcurridos unos minutos, el comando devuelve información con formato JSON sobre la solución, incluido el id. de recurso del espacio de trabajo:
"addonProfiles": { "omsagent": { "config": { "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>" }, "enabled": true } }
En Azure Portal, busque el identificador de recurso del área de trabajo y seleccione Registros.
Copie una de las siguientes consultas y pegue en la ventana de consulta.
Use la consulta siguiente si el clúster usa el esquema ContainerLogV2. Si sigue usando
ContainerLog
, debe actualizar a ContainerlogV2.ContainerLogV2 | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system" | project TimeGenerated, PodName, LogMessage, LogSource
Si desea seguir usando
ContainerLog
, use la consulta siguiente en su lugar: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
Selecciona Ejecutar. Todos los registros de imágenes eliminados aparecen en el área de Resultados.
Azure Kubernetes Service