Compartir a través de


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.

Screenshot of a diagram showing ImageCleaner's workflow. The ImageCleaner pods running on the cluster can generate an ImageList, or manual input can be provided.

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

  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 mediante el archivo JSON de ejemplo mediante el siguiendo 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 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 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 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 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.

  2. 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
      }
    }
    
  3. En Azure Portal, busque el identificador de recurso del área de trabajo y seleccione Registros.

  4. Copie la siguiente consulta en la tabla y reemplace name por eraser-aks-xxxxx (nombre del pod de trabajo):

    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. Seleccione Ejecutar. Todos los registros de imágenes eliminados aparecen en el área de Resultados.

    Screenshot showing deleted image logs in the Azure portal.