Utilice Image Cleaner para limpiar imágenes obsoletas vulnerables en su clúster de Azure Kubernetes Service (AKS)

Se aplica a: ✔️ AKS Automatic ✔️ AKS Standard

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 eliminar los riesgos de seguridad de sus clústeres, puede eliminar estas imágenes no referenciadas. 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.

AKS Automatic es la opción predeterminada recomendada para producción para la mayoría de las cargas de trabajo de AKS. Image Cleaner está preconfigurado en clústeres automáticos de AKS para ayudar a quitar imágenes sin usar con vulnerabilidades de forma predeterminada.

En los clústeres estándar de AKS, Image Cleaner es opcional y se habilita explícitamente.

Para obtener más información sobre AKS Automatic, consulte ¿Qué es Azure Kubernetes Service (AKS) automático?

Nota:

Image Cleaner es una función basada en Eraser. En AKS, el nombre de la funcionalidad y el nombre de la propiedad son Image Cleaner, mientras que los nombres de los pods pertinentes de Image Cleaner contienen Eraser.

Comportamiento de AKS Automatic y AKS Standard

Requisitos previos

  • Suscripción a Azure. Si no tiene una suscripción a Azure, puede crear una cuenta gratuita.
  • Para la configuración estándar de AKS a través de CLI de Azure, 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

Al activar Image Cleaner en el clúster, implementa un pod del administrador de controladores denominado eraser-controller-manager.

Captura de pantalla de un diagrama que muestra el flujo de trabajo de ImageCleaner. Los pods de ImageCleaner que se ejecutan en el clúster pueden generar una ImageList, o se puede proporcionar mediante una entrada manual.

Image Cleaner admite modos de limpieza automático y manual.

Opciones de configuración para AKS Standard

Use estas opciones al configurar Image Cleaner en AKS Standard con CLI de Azure.

Nombre Descripción Obligatorio
--enable-image-cleaner Habilitación de Image Cleaner para un clúster de AKS Sí, a menos que especifique disable
--disable-image-cleaner Deshabilitación de Image Cleaner para un clúster de AKS Sí, a menos que especifique habilitar
--image-cleaner-interval-hours Intervalo en horas para las ejecuciones programadas. El valor predeterminado de CLI de Azure es una semana. El mínimo es de 24 horas. El máximo es de tres meses. No es necesario para CLI de Azure; es necesario para la plantilla de ARM u otros clientes

Nota:

Si deshabilita Image Cleaner y lo vuelve a habilitar más adelante sin pasar explícitamente la configuración, se reutiliza el valor de configuración anterior.

Modo automático

Al implementar eraser-controller-manager, Image Cleaner realiza automáticamente estas acciones:

  • Inicia la limpieza y crea eraser-aks-xxxxx pods de trabajo para cada nodo.
  • Usa un contenedor recopilador para recopilar imágenes no utilizadas.
  • Usa un contenedor trivy-scanner para examinar vulnerabilidades con trivy.
  • Usa un contenedor removedor para eliminar imágenes sin usar con vulnerabilidades.
  • Elimina el pod de trabajo una vez finalizada la tarea.
  • Programa la siguiente limpieza según --image-cleaner-interval-hours.

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.

Uso de Image Cleaner en AKS Automatic y AKS Standard

AKS Automatic

Image Cleaner viene preconfigurado en los clústeres AKS Automatic, que son la opción predeterminada recomendada y preparada para producción para la mayoría de las cargas de trabajo de AKS. No es necesario ejecutar un comando enable independiente.

Para crear un clúster automático de AKS, consulte Creación de un clúster automático de AKS.

Use las instrucciones de limpieza y supervisión manuales de este artículo cuando desee la corrección dirigida o la comprobación operativa.

AKS Standard: habilitar en un nuevo clúster

Habilite Image Cleaner en un nuevo clúster AKS Estándar 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

AKS Standard: habilitar en un clúster existente

Habilite Image Cleaner en un clúster estándar de AKS existente mediante el az aks update comando .

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

AKS Standard: intervalo de actualización en un clúster nuevo o existente

Actualice el intervalo de Image Cleaner en un clúster estándar de AKS nuevo o existente mediante el --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

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 de docker.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

  1. Elimine el antiguo imagelist mediante el comando kubectl delete.

    kubectl delete ImageList imagelist
    
  2. 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 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

Cuando se utiliza el modo manual, el pod eraser-aks-xxxxx se elimina en un plazo de 10 minutos tras 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

  1. Cree un archivo JSON de ejemplo para contener imágenes excluidas.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Cree un configmap con el archivo JSON de ejemplo usando el siguiente kubectl create y el comando 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
    

Deshabilitar el limpiador de imágenes en AKS estándar

Deshabilite Image Cleaner en un clúster AKS Standard mediante 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 (FAQ)

¿Image Cleaner está habilitado de forma predeterminada en AKS Automatic?

Yes. Image Cleaner está preconfigurado en clústeres automáticos de AKS.

¿Es necesario ejecutar comandos de habilitación para Image Cleaner en AKS Automatic?

No. Use los comandos enable para AKS Standard.

¿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, y
  • CRITICAL

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

  1. Asegúrese de que Azure Monitor está habilitado en el clúster. Para conocer los pasos detallados, consulte Habilitar Container Insights en clústeres de AKS.

  2. De forma predeterminada, no se recopilan los registros de los contenedores que se ejecutan en el kube-system espacio de nombres. Elimine el espacio de nombres kube-system de exclude_namespaces en el mapa de configuración 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.

  3. 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
      }
    }
    
  4. En el portal de Azure, busque el identificador de recurso del área de trabajo y, a continuación, seleccione Registros.

  5. Copie una de las siguientes consultas y péguela en la ventana de consulta.

    • Use la consulta siguiente si el clúster usa el esquema ContainerLogV2. Si sigue usando ContainerLog, actualice 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
       ```
      
      
  6. Selecciona Ejecutar. Todos los registros de imágenes eliminados aparecen en el área de Resultados.