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


Использование Image Clean для очистки уязвимых устаревших образов в кластере Служба Azure Kubernetes (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 в новом кластере

  • Включите Image Cleaner в новом кластере az aks create AKS с помощью команды с параметром --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
    

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

  • Обновите интервал Очистки изображений в новом или существующем кластере --image-cleaner-interval-hours AKS с помощью параметра.

    # 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 Clean?

Журналы образов хранятся в рабочем модуле 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 и использовать таблицу журналов pod Container Insights. После этого журналы будут сохранены, и их можно просмотреть даже eraser-aks-xxxxx .

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

  2. Получите идентификатор ресурса 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
      }
    }
    
  3. В портал Azure найдите идентификатор ресурса рабочей области, а затем выберите журналы.

  4. Скопируйте следующий запрос в таблицу, заменив name на eraser-aks-xxxxx (имя рабочего модуля pod):

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