Поделиться через


Используйте Image Cleaner для очистки уязвимых устаревших образов в кластере Azure Kubernetes Service (AKS).

Обычно конвейеры используются для создания и развертывания образов в кластерах Службы Azure Kubernetes (AKS). Такой процесс хорошо подходит для создания образов, но при этом часто не учитываются оставленные устаревшие образы. Это может привести к раздуванию числа образов в узлах кластера. Эти образы могут содержать уязвимости, которые могут создавать проблемы с безопасностью. Чтобы удалить риски безопасности в кластерах, вы можете очистить эти неиспользуемые образы. Очистка изображений вручную может быть времязатратной. Image Clean выполняет автоматическую идентификацию и удаление изображений, что снижает риск устаревших изображений и сокращает время, необходимое для их очистки.

Примечание.

Image Cleaner — это функция на основе ластика. В кластере AKS имя функции и имя свойства — Image Cleanerв то время как соответствующие имена модулей pod Image Cleaner содержатся Eraser.

Предварительные условия

  • Подписка Azure. Если у вас еще нет подписки Azure, вы можете создать бесплатную учетную запись.
  • Azure CLI версии 2.49.0 или более поздней. Чтобы узнать, какая версия используется, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Ограничения

Image Cleaner пока не поддерживает пулы узлов Windows или виртуальные узлы AKS.

Принцип работы Image Cleaner

После включения Image Cleaner в кластере будет развернут диспетчер eraser-controller-manager контроллеров.

Снимок экрана: схема рабочего процесса ImageCleaner. Модули pod ImageCleaner, выполняемые в кластере, могут создавать ImageList или предоставлять входные данные вручную.

С помощью Image Cleaner можно выбрать между ручным и автоматическим режимом и следующими параметрами конфигурации:

Варианты конфигурации

Имя Описание Обязательное поле
--enable-image-cleaner Включение функции "Очистка образов" для кластера AKS Да, если не указан параметр отключения
--disable-image-cleaner Отключение функции "Очистка образов" для кластера AKS Да, если не указан параметр включения
--image-cleaner-interval-hours Этот параметр определяет интервал времени (в часах), с которым запускается программа очистки изображений. Значение по умолчанию для Azure CLI — одна неделя, минимальное значение — 24 часа, а максимальное — три месяца. Не требуется для Azure CLI, требуется для шаблона ARM или других клиентов.

Автоматический режим

После eraser-controller-manager развертывания следующие действия будут выполняться автоматически.

  • Он немедленно запускает процесс очистки и создает eraser-aks-xxxxx рабочие модули pod для каждого узла.
  • В каждом рабочем модуле pod существует три контейнера:
    • Сборщик, собирающий неиспользуемые изображения.
    • Триви-сканер, который использует триви для сканирования уязвимостей образа.
    • Удалитель, который удаляет неиспользуемые образы с уязвимостями.
  • После завершения процесса очистки рабочий модуль pod удаляется, а следующая запланированная очистка происходит в соответствии с заданным вами процессом --image-cleaner-interval-hours .

Режим вручную

Очистку можно активировать вручную, определив объект CRD.ImageList Это активирует eraser-contoller-manager создание eraser-aks-xxxxx рабочих модулей pod для каждого узла и завершение процесса удаления вручную.

Примечание.

После отключения Очистки образа старая конфигурация по-прежнему существует. Это означает, что если функция снова включена без явной передачи конфигурации, существующее значение используется вместо значения по умолчанию.

Включение Очистки изображений в кластере AKS

Включение Image Cleaner в новом кластере

  • В новом кластере AKS включите Image Cleaner, используя команду az aks create с параметром --enable-image-cleaner.

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-image-cleaner \
        --generate-ssh-keys
    

Включение Очистки образов в существующем кластере

  • Включите Image Cleaner в существующем кластере az aks update AKS с помощью команды.

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

Обновите интервал очистки образов на новом или существующем кластере

  • ** Обновите интервал очистки образов в кластере AKS, будь то новый или существующий, с помощью параметра --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
    

Удаление изображений вручную с помощью Image Cleaner

Внимание

Для name должно быть установлено значение imagelist.

  • Вручную удалите изображение с помощью следующей kubectl apply команды. В этом примере изображение docker.io/library/alpine:3.7.3 удаляется, если оно не используется.

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

Очистка вручную — это одноразовая операция, которая запускается только при создании нового imagelist или изменении существующего imagelist. После удаления образа, imagelist не будет удалён автоматически.

Если необходимо активировать другую ручную очистку, необходимо создать новую imagelist или внести изменения в существующую. Если вы хотите удалить тот же образ еще раз, необходимо создать новый imagelist.

Удаление существующего объекта ImageList и создание нового

  1. Удалите старый imagelist с помощью команды kubectl delete.

    kubectl delete ImageList imagelist
    
  2. Создайте новый imagelist с тем же именем образа. В следующем примере используется тот же образ, что и в предыдущем примере.

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

Изменение существующего списка образов

  • Измените существующую imagelist с помощью 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
    

При использовании режима eraser-aks-xxxxx вручную модуль pod удаляется в течение 10 минут после завершения работы.

Список исключений изображений

Изображения, указанные в списке исключений, не удаляются из кластера. Image Cleaner поддерживает системные и пользовательские списки исключений. Не поддерживается изменение списка исключений системы.

Проверка списка исключений системы

  • Проверьте список исключений системы с помощью следующей kubectl get команды.

    kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
    

Создание определяемого пользователем списка исключений

  1. Создайте пример JSON-файла для хранения исключенных изображений.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Создайте configmap с использованием образцового JSON-файла, с помощью следующих команд kubectl create и 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
    

Отключить очиститель изображений

  • Отключите Image Cleaner в вашем кластере, используя команду az aks update с параметром --disable-image-cleaner.

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

Вопросы и ответы

Как проверить, какая версия Image Cleaner используется?

kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3

Поддерживает ли Image Cleaner другие сканеры уязвимостей помимо триви-сканера?

Можно ли указать уровни уязвимостей для очистки изображений?

№ Параметры по умолчанию для уровней уязвимостей:

  • LOW,
  • MEDIUM,
  • HIGH и
  • CRITICAL

Невозможно настроить параметры по умолчанию.

Как просмотреть изображения, которые были обработаны с помощью Image Cleaner?

Журналы образов хранятся в рабочем модуле eraser-aks-xxxxx pod. Когда eraser-aks-xxxxx он жив, можно выполнить следующие команды для просмотра журналов удаления:

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

Модуль eraser-aks-xxxxx pod удаляется в течение 10 минут после завершения работы. Эти действия можно выполнить, чтобы включить надстройку Azure Monitor add-on и использовать таблицу журналов pod Container Insights. После этого журналы будут сохранены, и их можно просмотреть, даже если eraser-aks-xxxxx будет удалён.

  1. Убедитесь, что в кластере включен мониторинг Azure. Подробные инструкции см. в разделе "Включение Аналитики контейнеров" в кластерах AKS.

  2. По умолчанию журналы контейнеров, работающих в kube-system пространстве имен, не собираются. Удалите пространство имен kube-system из exclude_namespaces в ConfigMap и примените ConfigMap, чтобы включить сбор этих журналов. Дополнительные сведения см. в статье "Настройка сбора данных аналитики контейнеров".

  3. Получите идентификатор ресурса Log Analytics с помощью az aks show команды.

      az aks show --resource-group myResourceGroup --name myManagedCluster
    

    Через несколько минут команда возвращает сведения о решении в формате JSON, включая идентификатор ресурса рабочей области:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  4. В портале Azure найдите идентификатор ресурса рабочей области, а затем выберите журналы.

  5. Скопируйте один из следующих запросов и вставьте его в окно запроса.

    1. Используйте следующий запрос, если кластер использует схему ContainerLogV2. Если вы по-прежнему используете ContainerLog, необходимо обновить до ContainerlogV2.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    2. Если вы хотите продолжить использовать ContainerLog, используйте следующий запрос:

      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. Выберите Выполнить. Все удаленные журналы изображений отображаются в области результатов .