共用方式為


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

安全性更新是使用底層 OS 最新修正來維護 AKS 叢集安全性與合規性的關鍵部分。 這些更新包括 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. 將流量隔離 (讓節點無法排程新的工作負載) 和清空 (將現有的工作負載移至其他節點) 至節點。
  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. 建立名為 Upgrade cluster node images 且排程觸發程序每隔 15 天在凌晨 3 點執行的 GitHub 動作。 將下列程式碼複製至 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 for Actions] 列中,搜尋 Azure Login

  2. 選取 [Azure Login]

    搜尋結果顯示兩行,第一個動作名稱為「Azure 登入」,第二個則為「Azure Container Registry 登入」

  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}* 取代為您自己的訂用帳戶識別碼。

    注意

    此範例在 Subscription 範圍建立 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. 選取 [設定] > [祕密和變數] > [動作] > [新存放庫祕密]

  4. 對於名稱,輸入 AZURE_CREDENTIALS

  5. 針對 Secret,複製您建立服務主體時收到的輸出內容。

  6. 選取新增機密

建立可執行 Azure CLI 命令的步驟

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

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

  3. 選取 [Azure CLI Action]

    「Azure CLI 動作」的搜尋結果,其中第一筆結果顯示由 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 --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 動作

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

注意

如果您想要升級單一節點集區,而不是叢集上的所有節點集區,則請將 --name 參數新增至 az aks nodepool upgrade 命令,以指定節點集區名稱。 例如:

az aks nodepool upgrade --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
  • on 下方,新增 workflow_dispatch 觸發程序:

    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 修補和升級指導