Применение автоматического обновления безопасности к узлам Служба 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 2.0.

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

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

  1. Применяет последние обновления ко всем узлам кластера.
  2. Cordons (делает узел недоступным для планирования новых рабочих нагрузок) и сливов (перемещает существующие рабочие нагрузки на другой узел) трафик на узлы.
  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 с триггером расписания для выполнения каждые 15 дней в 3 утра. Скопируйте следующий код в 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.

  2. Выберите "Имя входа Azure".

    Search results showing two lines, the first action is called 'Azure Login' and the second 'Azure Container Registry 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/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    

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

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

    Примечание.

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

    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. Выберите Параметры> Secrets и переменные>Actions>New репозиторий secret.

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

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

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

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

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

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

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

    Search result for 'Azure CLI Action' with first result being shown as made by Azure

  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/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
          - name: Upgrade node images
            uses: Azure/cli@v1.0.8
            with:
              inlineScript: az aks upgrade -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
    

    Совет

    Вы можете разделить -g параметры и -n параметры из команды, создав новые секреты репозитория, как и для 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 -g {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/login@v1.4.6
                with:
                  creds: ${{ secrets.AZURE_CREDENTIALS }}
              - name: Upgrade node images
                uses: Azure/cli@v1.0.8
                with:
                  inlineScript: az aks upgrade -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
              # Code for upgrading one or more node pools
    

Следующие шаги

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

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