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


Применение автоматического обновления безопасности к узлам Службы Azure Kubernetes (AKS) с помощью GitHub Actions

Обновления системы безопасности — это ключевая часть поддержания безопасности кластера AKS и соответствия последним исправлениям базовой ОС. К этим обновлениям относятся исправления безопасности ОС или обновления ядра. Для завершения процесса некоторые обновления требуют перезагрузки узла.

В этой статье показано, как автоматизировать процесс обновления узлов AKS с помощью GitHub Actions и Azure CLI для создания задачи обновления, которая автоматически запускается на основе cron.

Замечание

Вы также можете выполнять автоматическое обновление образа узла и планировать эти обновления с помощью планового обслуживания. Дополнительные сведения см. в разделе "Автоматическое обновление образов узлов".

Перед тем как начать

  • В данной статье предполагается, что у вас уже есть существующий кластер AKS. Если вам нужен кластер AKS, создайте его с помощью Azure CLI, Azure PowerShell или портала Azure.
  • В этой статье также предполагается, что у вас есть учетная запись GitHub и репозиторий профилей для размещения действий. Если у вас нет репозитория, создайте его с тем же именем, что и имя пользователя GitHub.
  • Вам понадобится установленный и настроенный Azure CLI версии 2.0.59 или новее. Чтобы узнать версию, выполните команду az --version. Если вам нужно установить или обновить, см. статью "Установка Azure CLI".

Обновление узлов с помощью az aks upgrade

Команда az aks upgrade позволяет вам применять обновления без простоев. Команда выполняет следующие действия:

  1. Применяет последние обновления ко всем узлам кластера.
  2. Кордоны (делает узел недоступным для размещения новых рабочих нагрузок) и слив (перемещает существующие рабочие нагрузки на другой узел) перенаправляют трафик на узлы.
  3. Перезапускает узлы.
  4. Позволяет обновленным узлам снова получать трафик.

AKS не перезапускает узлы автоматически при обновлении узлов с помощью другого метода.

Замечание

Выполнение az aks upgrade с флагом --node-image-only обновляет только изображения узлов. Выполнение команды без использования флага обновляет как образы узлов, так и версию контрольной плоскости Kubernetes. Дополнительные сведения см. в документации по управляемым обновлениям на узлах и документации по обновлению кластера.

Все узлы Kubernetes выполняются в стандартной виртуальной машине Azure на основе Windows или Linux. Виртуальные машины под управлением Linux используют образ Ubuntu с ОС, настроенной для автоматической проверки обновлений каждую ночь.

При использовании az aks upgrade команды Azure CLI создает всплеск новых узлов с последними обновлениями системы безопасности и ядра. Эти новые узлы изначально заблокированы, чтобы предотвратить планирование приложений до завершения обновления. После завершения обновления Azure изолирует и освобождает старые узлы и разблокирует новые узлы, передавая все запланированные приложения на новые узлы.

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

Создание действия GitHub с таймером

cron — это программа, которая позволяет выполнять набор команд или заданий в автоматизированном расписании. Чтобы создать задание для обновления узлов AKS по автоматизированному расписанию, вам потребуется репозиторий для размещения ваших действий. Действия GitHub обычно настраиваются в том же репозитории, что и приложение, но вы можете использовать любой репозиторий.

  1. Перейдите в репозиторий на GitHub.

  2. Выберите Действия.

  3. Выберите новый рабочий процесс>Настройте рабочий процесс самостоятельно.

  4. Создайте GitHub Action с именем Upgrade cluster node images с триггером расписания для запуска каждые 15 дней в 03:00. Скопируйте следующий код в YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. Создайте задание с именем upgrade-node , которое выполняется в агенте Ubuntu и подключается к учетной записи Azure CLI, чтобы выполнить команду обновления узла. Скопируйте следующий код в YAML под ключом on :

    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
    

Настройка Azure CLI в рабочем процессе

  1. В строке поиска Marketplace для действий найдите Azure Login.

  2. Выберите Azure Login.

    Результаты поиска, содержащие две строки: первое действие —

  3. В разделе "Установка" выберите версию, например версию 1.4.6, и скопируйте фрагмент кода установки.

  4. steps Добавьте ключ и следующие сведения из фрагмента кода установки в YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/[email protected]
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    

Создание учетных данных для Azure CLI

  1. В новом окне браузера создайте новую учетную запись-службу с помощью команды az ad sp create-for-rbac. Убедитесь, что вы замените *{subscriptionID}* на собственный идентификатор подписки.

    Замечание

    В этом примере создается Contributor роль в области Подписки. Вы можете предоставить роль и область, соответствующие вашим потребностям. Дополнительные сведения см. в статье о встроенных ролях Azure и уровнях областей RBAC Azure.

    az ad sp create-for-rbac --role Contributor --scopes /subscriptions/{subscriptionID} -o json
    

    Выходные данные должны совпадать со следующим примером выходных данных:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Скопируйте выходные данные и перейдите в репозиторий GitHub.

  3. Выберите Настройки>Секреты и переменные>Действия>Новый секрет репозитория.

  4. Для параметра Имя введите AZURE_CREDENTIALS.

  5. Для Секрета скопируйте содержимое выходных данных, полученных при создании учетной записи службы.

  6. Выберите "Добавить секрет".

Создание шагов для выполнения команд Azure CLI

  1. Перейдите в окно с помощью YAML рабочего процесса.

  2. На панели "Поиск Marketplace для действий " найдите действие Azure CLI.

  3. Выберите действие Azure CLI.

    Результат поиска

  4. В разделе "Установка" выберите версию, например версию 1.0.8, и скопируйте фрагмент кода установки.

  5. Вставьте содержимое действия в YAML под *Azure Login* шагом, как показано в следующем примере:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/[email protected]
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
          - name: Upgrade node images
            uses: Azure/[email protected]
            with:
              inlineScript: az aks upgrade --resource-group <resourceGroupName> --name <aksClusterName> --node-image-only --yes
    

    Подсказка

    Вы можете разделить --resource-group параметры и --name параметры из команды, создав новые секреты репозитория, как и для AZURE_CREDENTIALSэтого.

    Если вы создаете секреты для этих параметров, необходимо заменить <resourceGroupName>, <aksClusterName> заместители на их секретные эквиваленты. Например, ${{secrets.RESOURCE_GROUP_NAME}} и ${{secrets.AKS_CLUSTER_NAME}}

  6. Переименуйте YAML в upgrade-node-images.yml.

  7. Выберите "Зафиксировать изменения...", добавьте сообщение фиксации и нажмите кнопку "Зафиксировать изменения".

Запуск действия GitHub вручную

Вы можете вручную запустить рабочий процесс в дополнение к запланированному запуску, добавив новый on триггер workflow_dispatch.

Замечание

Если вы хотите обновить один пул узлов вместо всех пулов узлов в кластере, добавьте --name параметр в az aks nodepool upgrade команду, чтобы указать имя пула узлов. Рассмотрим пример.

az aks nodepool upgrade --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
  • workflow_dispatch Добавьте триггер под ключомon:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
      workflow_dispatch:
    

    YamL должен выглядеть примерно так:

        name: Upgrade cluster node images
        on:
          schedule:
            - cron: '0 3 */15 * *'
          workflow_dispatch:
        jobs:
          upgrade-node:
            runs-on: ubuntu-latest
            steps:
              - name: Azure Login
                uses: Azure/[email protected]
                with:
                  creds: ${{ secrets.AZURE_CREDENTIALS }}
              - name: Upgrade node images
                uses: Azure/[email protected]
                with:
                  inlineScript: az aks upgrade -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
              # Code for upgrading one or more node pools
    

Дальнейшие шаги

Дополнительные сведения об обновлениях AKS см. в следующих статьях и ресурсах:

Подробное обсуждение лучших практик обновления и других аспектов смотрите в руководстве по исправлению и обновлению AKS.