使用 GitHub Actions 將自動安全性升級套用至 Azure Kubernetes Service (AKS) 節點

安全性更新是維護 AKS 叢集安全性與符合基礎 OS 最新修正程式的關鍵部分。 這些更新包括 OS 安全性修正程式或核心更新。 某些更新需要重新啟動節點才能完成程式。

本文說明如何使用 GitHub Actions 和 Azure CLI 將 AKS 節點的更新程式自動化,以根據 cron 該工作自動執行來建立更新工作。

注意

您也可以使用計劃性維護自動執行節點映射升級,並排程這些升級。 如需詳細資訊,請參閱 自動升級節點映像

開始之前

  • 本文假設您有現有的 AKS 叢集。 如果您需要 AKS 叢集,請使用 Azure CLIAzure PowerShellAzure 入口網站 建立一個叢集。
  • 本文也假設您有 GitHub 帳戶配置檔存放庫 來裝載您的動作。 如果您沒有存放庫,請建立與 GitHub 使用者名稱相同的名稱。
  • 您需要安裝及設定 Azure CLI 2.0.59 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱 安裝 Azure CLI

使用更新節點 az aks upgrade

命令 az aks upgrade 可讓您以零停機的方式套用更新。 命令會執行下列動作:

  1. 將最新的更新套用至您所有叢集的節點。
  2. Cordons (讓節點無法排程新的工作負載)和清空(將現有的工作負載移至其他節點)流量移至節點。
  3. 重新啟動節點。
  4. 可讓更新的節點再次接收流量。

如果您使用不同的方法來更新節點,AKS 不會自動重新啟動您的節點。

注意

使用旗標執行az aks upgrade--node-image-only只會升級節點映像。 在沒有旗標的情況下執行 命令會同時升級節點映像和 Kubernetes 控制平面版本。 如需詳細資訊,請參閱 節點上 受控升級的檔,以及 叢集升級的檔。

所有 Kubernetes 節點都會在標準 Windows 或 Linux 型 Azure 虛擬機 (VM) 中執行。 以 Linux 為基礎的 VM 會使用 Ubuntu 映射,並將 OS 設定為每晚自動檢查更新。

當您使用 az aks upgrade 命令時,Azure CLI 會建立具有最新安全性和核心更新的新節點激增。 這些新節點一開始會受到封鎖,以防止任何應用程式排程到更新完成為止。 更新完成之後,Azure 會封鎖並清空較舊的節點,並取消記錄新的節點,將所有排程的應用程式傳送至新的節點。

此程式比手動更新以Linux為基礎的核心更好,因為安裝新的核心更新時,Linux 需要重新啟動。 如果您手動更新 OS,您也需要重新啟動 VM、手動封鎖並清空所有應用程式。

建立計時 GitHub 動作

cron 是一個公用程式,可讓您在自動化排程上執行一組命令或 作業。 若要建立作業以依自動化排程更新您的 AKS 節點,您需要存放庫來裝載您的動作。 GitHub Actions 通常會在與應用程式相同的存放庫中設定,但您可以使用任何存放庫。

  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 帳戶以執行節點升級命令。 將下列程式代碼複製到金鑰下的 on YAML:

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

在工作流程中設定 Azure CLI

  1. 在 [ 搜尋 Marketplace for Actions] 列中,搜尋 Azure 登入

  2. 選取 [Azure 登入]。

    Search results showing two lines, the first action is called 'Azure Login' and the second 'Azure Container Registry Login'

  3. 在 [安裝] 底下,選取版本,例如 v1.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 和變數>[動作>][新增存放庫密碼]。

  4. 對於名稱,輸入 AZURE_CREDENTIALS

  5. 針對 [ 秘密],複製您在建立服務主體時所收到的輸出內容。

  6. 選取新增機密

建立執行 Azure CLI 命令的步驟

  1. 使用工作流程 YAML 瀏覽至您的視窗。

  2. 在 [ 搜尋 Marketplace for Actions] 列中,搜尋 Azure CLI 動作

  3. 選取 [Azure CLI 動作]。

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

  4. 在 [安裝] 底下,選取版本,例如 v1.0.8,然後複製安裝代碼段。

  5. 將動作的內容貼到步驟下方 *Azure Login* 的 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 }}
          - 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 動作

除了排程的執行之外,您還可以新增名為 workflow_dispatch的新on觸發程式,手動執行工作流程。

注意

如果您想要升級單一節點集區,而不是叢集上的所有節點集區,請將 參數新增 --nameaz 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 修補程式和升級指引