在 Azure Kubernetes Service (AKS) 中管理叢集的節點集區

在 Azure Kubernetes Service (AKS) 中,具有相同設定的節點會共同組成節點集區。 這些節點集區包含用來執行應用程式的基礎 VM。 當您建立 AKS 叢集時,您會定義節點的初始數目及其大小 (SKU)。 當應用程式需要變更時,您可能需要變更節點集區上的設定。 例如,您可能需要調整節點集區中的節點數目,或升級節點集區的 Kubernetes 版本。

本文說明如何在 AKS 叢集中管理一個或多個節點集區。

開始之前

限制

在建立和管理支援多個節點集區的 AKS 叢集時,需遵守下列限制:

  • 請參閱 Azure Kubernetes Service (AKS) 中的配額、虛擬機器大小限制及區域可用性
  • 系統集區必須包含至少一個節點,而使用者節點集區則可包含零個或多個節點。
  • 建立節點集區之後,您無法變更其 VM 大小。
  • 當您在叢集建立時建立多個節點集區時,節點集區所使用的所有 Kubernetes 版本都必須符合控制平面的版本集。 您可以在使用每個節點集區作業佈建叢集之後進行更新。
  • 您無法同時在叢集或節點集區上執行升級和調整作業。 如果您嘗試同時執行它們,您會收到錯誤。 每個作業類型都必須在該相同資源上的下一個要求之前,於目標資源上完成。 如需詳細資訊,請參閱疑難排解指南

升級單一節點集區

注意

節點集區 OS 映像版本會繫結至叢集的 Kubernetes 版本。 您只會在叢集升級之後取得 OS 映像升級。

在此範例中,我們會升級 mynodepool 節點集區。 由於有兩個節點集區,我們必須使用 az aks nodepool upgrade 命令來升級。

  1. 使用 az aks get-upgrades 命令檢查是否有任何可用的升級。

    az aks get-upgrades --resource-group myResourceGroup --name myAKSCluster
    
  2. 使用 az aks nodepool upgrade 命令升級 mynodepool 節點集區。

    az aks nodepool upgrade \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --kubernetes-version KUBERNETES_VERSION \
        --no-wait
    
  3. 使用 az aks nodepool list 命令列出節點集區的狀態。

    az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
    

    下列範例輸出顯示 mynodepool 處於升級中狀態:

    [
      {
        ...
        "count": 3,
        ...
        "name": "mynodepool",
        "orchestratorVersion": "KUBERNETES_VERSION",
        ...
        "provisioningState": "Upgrading",
        ...
        "vmSize": "Standard_DS2_v2",
        ...
      },
      {
        ...
        "count": 2,
        ...
        "name": "nodepool1",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Succeeded",
        ...
        "vmSize": "Standard_DS2_v2",
        ...
      }
    ]
    

    將節點升級至指定版本需要幾分鐘的時間。

最佳做法是,您應該將 AKS 叢集中的所有節點集區升級為相同的 Kubernetes 版本。 az aks upgrade 的預設行為是透過控制平面一起升級所有節點集區,以達成一致。 升級個別節點集區的能力可讓您在節點集區之間,執行輪流升級和排程 Pod,以在上述條件約束內,保持應用程式的正常運作。

使用多個節點集區升級叢集控制平面

注意

Kubernetes 使用標準語意化版本控制系統的版本設定配置。 版本號碼會表示為 x.y.z,其中 x 為主要版本,y 為次要版本,z 為修補版本。 例如,在 1.12.6 版本中,1 是主要版本,12 是次要版本,6 是修補版本。 建立叢集期間,會設定控制平面的 Kubernetes 版本和初始節點集區。 新增至叢集時,其他節點集區會設定其 Kubernetes 版本。 Kubernetes 版本在節點集區之間,以及節點集區和控制平面之間,可能會有所不同。

AKS 叢集有兩個與 Kubernetes 版本相關聯的叢集資源物件:

  1. 叢集控制平面 Kubernetes 版本,以及
  2. 具有 Kubernetes 版本的節點集區。

對應至一或多個節點集區的控制平面。 升級作業的行為取決於您使用哪個 Azure CLI 命令。

  • az aks upgrade 將叢集中的控制平面和所有節點集區升級為相同的 Kubernetes 版本。
  • 具有 --control-plane-only 旗標的 az aks upgrade 只會升級叢集控制平面,並將所有節點集區維持不變。
  • az aks nodepool upgrade 只使用指定的 Kubernetes 版本升級目標節點集區。

升級的驗證規則

叢集控制平面和節點集區的 Kubernetes 升級是由下列規則集驗證:

  • 升級節點集區之有效版本的規則

    • 節點集區版本必須與控制平面具有相同的「主要」版本。
    • 節點集區「次要」版本必須在控制平面版本的兩個「次要」版本內。
    • 節點集區版本不可大於控制 major.minor.patch 版本。
  • 提交升級作業的規則

    • 您無法降級控制平面或節點集區 Kubernetes 版本。
    • 如果未指定節點集區 Kubernetes 版本,則行為取決於用戶端。 在 Resource Manager 範本中,宣告會回復為節點集區定義的現有版本。 如果未進行任何設定,它會使用控制平面版本來回復。
    • 您無法在單一控制平面或節點集區資源上同時提交多個作業。 您可以在指定時間升級或調整控制平面或節點集區。

手動調整節點集區

隨著應用程式工作負載的需求變更,您可能需要調整節點集區中的節點數目。 節點數目可擴大或縮小。

  1. 使用 az aks node pool scale 命令調整節點集區的節點數目。

    az aks nodepool scale \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 5 \
        --no-wait
    
  2. 使用 az aks node pool list 命令列出節點集區的狀態。

    az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
    

    下列範例輸出顯示 mynodepool 處於調整中狀態,且有五個節點的新計數:

    [
      {
        ...
        "count": 5,
        ...
        "name": "mynodepool",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Scaling",
        ...
        "vmSize": "Standard_DS2_v2",
        ...
      },
      {
        ...
        "count": 2,
        ...
        "name": "nodepool1",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Succeeded",
        ...
        "vmSize": "Standard_DS2_v2",
        ...
      }
    ]
    

    需要幾分鐘的時間才能完成調整作業。

使用叢集自動調整程式以自動調整特定節點集區

AKS 提供個別功能,以使用稱為叢集自動調整程式的功能自動調整節點集區。 您可以使用每個節點集區的唯一最小和最大調整計數來啟用此功能。

如需詳細資訊,請參閱使用叢集自動調整程式

將容量保留群組與節點集區建立關聯

當您的工作負載需求變更時,您可以將現有的容量保留群組與節點集區產生關聯,以確保為節點集區配置容量。

搭配 AKS 使用容量保留群組的必要條件

  • 使用 CLI 2.56 版或更新版本和 API 2023-10-01 版或更高版本。

  • 容量保留群組應該已存在,且應該包含至少一個容量保留,否則節點集區會新增至叢集,並出現警告,且沒有任何容量保留群組相關聯。 如需詳細資訊,請參閱容量保留群組

  • 您必須為包含容量保留群組的資源群組建立使用者指派的受控識別 (CRG)。 系統指派的受控識別不適用於此功能。 在下列範例中,將環境變數取代為您自己的值。

    IDENTITY_NAME=myID
    RG_NAME=myResourceGroup
    CLUSTER_NAME=myAKSCluster
    VM_SKU=Standard_D4s_v3
    NODE_COUNT=2
    LOCATION=westus2
    az identity create --name $IDENTITY_NAME --resource-group $RG_NAME  
    IDENTITY_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RG_NAME --query identity.id -o tsv)
    
  • 您必須將 Contributor 角色指派給上面建立的使用者指派身分識別。 如需詳細資訊,請參閱指派 Azure 角色的步驟

  • 建立新的叢集,並指派新建立的身分識別。

      az aks create --resource-group $RG_NAME --name $CLUSTER_NAME --location $LOCATION \
          --node-vm-size $VM_SKU --node-count $NODE_COUNT \
          --assign-identity $IDENTITY_ID --enable-managed-identity         
    
  • 您也可以使用 update 命令,在現有的受控叢集上指派使用者受控識別。

      az aks update --resource-group $RG_NAME --name $CLUSTER_NAME --location $LOCATION \
              --node-vm-size $VM_SKU --node-count $NODE_COUNT \
              --assign-identity $IDENTITY_ID --enable-managed-identity         
    

將現有的容量保留群組與節點集區產生關聯

使用 az aks nodepool add 命令將現有的容量保留群組與節點集區產生關聯,並使用 --crg-id 旗標指定容量保留群組。 下列範例假設您有名為「myCRG」的 CRG。

RG_NAME=myResourceGroup
CLUSTER_NAME=myAKSCluster
NODEPOOL_NAME=myNodepool
CRG_NAME=myCRG
CRG_ID=$(az capacity reservation group show --capacity-reservation-group $CRG_NAME --resource-group $RG_NAME --query id -o tsv)
az aks nodepool add --resource-group $RG_NAME --cluster-name $CLUSTER_NAME --name $NODEPOOL_NAME --crg-id $CRG_ID

將現有的容量保留群組與系統節點集區產生關聯

若要將現有的容量保留群組與系統節點集區產生關聯,請在叢集建立期間,將叢集與使用者指派的身分識別與 CRG 上的參與者角色建立關聯。 搭配和 --crg-id 旗標使用 az aks create 命令 --assign-identity

IDENTITY_NAME=myID
RG_NAME=myResourceGroup
CLUSTER_NAME=myAKSCluster
NODEPOOL_NAME=myNodepool
CRG_NAME=myCRG
CRG_ID=$(az capacity reservation group show --capacity-reservation-group $CRG_NAME --resource-group $RG_NAME --query id -o tsv)
IDENTITY_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RG_NAME --query identity.id -o tsv)
az aks create --resource-group $RG_NAME --cluster-name $CLUSTER_NAME --crg-id $CRG_ID --assign-identity $IDENTITY_ID --enable-managed-identity

注意

刪除節點集區會在刪除該節點集區之前,隱含地將節點集區與任何相關聯的容量保留群組中斷關聯。 刪除叢集會隱含地將該叢集中的所有節點集區與其相關聯的容量保留群組解除關聯。

注意

您無法使用容量保留群組來更新現有的節點集區。 建議的方法是在節點集區建立期間建立容量保留群組。

指定節點集區的 VM 大小

您可能需要建立具有不同 VM 大小和功能的節點集區。 例如,您可以建立節點集區,其包含大量 CPU 或記憶體的節點,或提供 GPU 支援的節點集區。 在下一個區段中,您會使用 taint (污點) 和 toleration (容忍),告知 Kubernetes 排程器如何限制在這些節點上執行的 Pod 存取。

在下列範例中,我們建立使用 Standard_NC6s_v3 VM 大小的 GPU 架構節點集區。 這些 VM 是由 NVIDIA Tesla K80 卡片提供。 如需詳細資訊,請參閱 Azure 中 Linux 虛擬機器的可用大小

  1. 使用 az aks node pool add 命令建立節點集區。 請指定名稱 gpunodepool,並使用 --node-vm-size 參數以指定 Standard_NC6 大小。

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunodepool \
        --node-count 1 \
        --node-vm-size Standard_NC6s_v3 \
        --no-wait
    
  2. 使用 az aks nodepool list 命令檢查節點集區的狀態。

    az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
    

    下列範例輸出顯示 gpunodepool 節點集區是使用指定的 VmSize建立節點:

    [
      {
        ...
        "count": 1,
        ...
        "name": "gpunodepool",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "vmSize": "Standard_NC6s_v3",
        ...
      },
      {
        ...
        "count": 2,
        ...
        "name": "nodepool1",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Succeeded",
        ...
        "vmSize": "Standard_DS2_v2",
        ...
      }
    ]
    

    成功建立 gpunodepool 需要幾分鐘的時間。

指定節點集區的污點、標籤或標記

建立節點集區時,您可以將污點、標籤或標記新增至該集區。 當您新增污點、標籤或標記時,該節點集區的所有節點也會感染該污點、標籤或標記。

重要

針對整個節點集區將污點、標籤或標記新增至節點,應該使用 az aks nodepool。 我們不建議使用 kubectl 將污點、標籤或標記套用至節點集區中的個別節點。

設定節點集區污點

  1. 使用 az aks nodepool add 命令建立具有污點的節點集區。 指定名稱 taintnp,並使用 --node-taints 參數,為污點指定 sku=gpu:NoSchedule

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name taintnp \
        --node-count 1 \
        --node-taints sku=gpu:NoSchedule \
        --no-wait
    
  2. 使用 az aks nodepool list 命令檢查節點集區的狀態。

    az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
    

    下列範例輸出顯示 taintnp 節點集區是使用指定的 nodeTaints建立節點:

    [
      {
        ...
        "count": 1,
        ...
        "name": "taintnp",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

在 Kubernetes 中會顯示污點資訊,以處理節點的排程規則。 Kubernetes 排程器可以使用污點和容差來限制可以在節點上執行的工作負載。

  • 污點會套用至節點,該節點指示僅可以在其上排程特定的 pod。
  • 然後容差會套用至容器,允許它們容許節點的污點。

如需如何使用進階 Kubernetes 排程功能的詳細資訊,請參閱 AKS 中進階排程器功能的最佳做法

設定節點集區容忍

在上一個步驟中,您已在建立節點集區時套用 sku=gpu:NoSchedule 污點。 下列範例 YAML 資訊清單使用容差,以允許 Kubernetes 排程器在該節點集區的節點上執行 NGINX Pod。

  1. 建立名為 nginx-toleration.yaml 的檔案,並複製到下列範例 YAML 中。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
     - image: mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine
        name: mypod
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 1
            memory: 2G
      tolerations:
     - key: "sku"
        operator: "Equal"
        value: "gpu"
        effect: "NoSchedule"
    
  2. 使用 kubectl apply 命令來排程 Pod。

    kubectl apply -f nginx-toleration.yaml
    

    排程 Pod 並提取 NGINX 映像需要幾秒鐘的時間。

  3. 使用 kubectl describe pod 命令檢查狀態。

    kubectl describe pod mypod
    

    下列簡要範例輸出顯示已套用 sku=gpu:NoSchedule 容忍。 在事件區段中,排程器已將 Pod 指派給 aks-taintnp-28993262-vmss000000 節點:

    [...]
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
                     sku=gpu:NoSchedule
    Events:
      Type    Reason     Age    From                Message
      ----    ------     ----   ----                -------
      Normal  Scheduled  4m48s  default-scheduler   Successfully assigned default/mypod to aks-taintnp-28993262-vmss000000
      Normal  Pulling    4m47s  kubelet             pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
      Normal  Pulled     4m43s  kubelet             Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
      Normal  Created    4m40s  kubelet             Created container
      Normal  Started    4m40s  kubelet             Started container
    

    只有套用此容忍的 Pod 可以在 taintnp 中的節點上排程。 任何其他 Pod 會排程在 nodepool1 節點集區中。 如果您建立其他節點集區,您可以使用額外的污點和容忍來限制這些節點資源上可排程的 Pod。

設定節點集區標籤

如需詳細資訊,請參閱在 Azure Kubernetes Service (AKS) 叢集中使用標籤

設定節點集區 Azure 標籤

如需詳細資訊,請參閱在 Azure Kubernetes Service (AKS) 中使用 Azure 標記

使用 Resource Manager 範本來管理節點集區

當您使用 Azure Resource Manager 範本來建立和管理資源時,您可以變更範本中的設定,並重新部署以更新資源。 使用 AKS 節點集區,建立 AKS 叢集之後,就無法更新初始節點集區配置檔。 此行為表示您無法更新現有的 Resource Manager 範本、變更節點集區,然後重新部署範本。 相反地,您必須建立個別 Resource Manager 範本,該範本會更新現有 AKS 叢集的節點集區。

  1. 建立範本,例如 aks-agentpools.json,並貼在下列範例資訊清單中。 請務必視需要編輯值。 此範例範本會設定下列設定:

    • 更新名為 myagentpool 的 Linux 節點集區,以執行三個節點。
    • 在節點集區中設定節點,以執行 Kubernetes 版本 1.15.7
    • 將節點大小定義為 Standard_DS2_v2
    {
        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "clusterName": {
                "type": "string",
                "metadata": {
                    "description": "The name of your existing AKS cluster."
                }
            },
            "location": {
                "type": "string",
                "metadata": {
                    "description": "The location of your existing AKS cluster."
                }
            },
            "agentPoolName": {
                "type": "string",
                "defaultValue": "myagentpool",
                "metadata": {
                    "description": "The name of the agent pool to create or update."
                }
            },
            "vnetSubnetId": {
                "type": "string",
                "defaultValue": "",
                "metadata": {
                    "description": "The Vnet subnet resource ID for your existing AKS cluster."
                }
            }
        },
        "variables": {
            "apiVersion": {
                "aks": "2020-01-01"
            },
            "agentPoolProfiles": {
                "maxPods": 30,
                "osDiskSizeGB": 0,
                "agentCount": 3,
                "agentVmSize": "Standard_DS2_v2",
                "osType": "Linux",
                "vnetSubnetId": "[parameters('vnetSubnetId')]"
            }
        },
        "resources": [
            {
                "apiVersion": "2020-01-01",
                "type": "Microsoft.ContainerService/managedClusters/agentPools",
                "name": "[concat(parameters('clusterName'),'/', parameters('agentPoolName'))]",
                "location": "[parameters('location')]",
                "properties": {
                    "maxPods": "[variables('agentPoolProfiles').maxPods]",
                    "osDiskSizeGB": "[variables('agentPoolProfiles').osDiskSizeGB]",
                    "count": "[variables('agentPoolProfiles').agentCount]",
                    "vmSize": "[variables('agentPoolProfiles').agentVmSize]",
                    "osType": "[variables('agentPoolProfiles').osType]",
                    "type": "VirtualMachineScaleSets",
                    "vnetSubnetID": "[variables('agentPoolProfiles').vnetSubnetId]",
                    "orchestratorVersion": "1.15.7"
                }
            }
        ]
    }
    
  2. 使用 az deployment group create 命令部署範本。

    az deployment group create \
        --resource-group myResourceGroup \
        --template-file aks-agentpools.json
    

    提示

    您可以在範本中藉由新增標記屬性,以將標記新增至節點集區,如下列範例所示:

    ...
    "resources": [
    {
      ...
      "properties": {
        ...
        "tags": {
          "name1": "val1"
        },
        ...
      }
    }
    ...
    

    取決於您在 Resource Manager 範本中定義的節點集區設定和作業而定,可能需要幾分鐘的時間來更新 AKS 叢集。

下一步