在 Azure Kubernetes Service (AKS) 中管理叢集的節點集區
在 Azure Kubernetes Service (AKS) 中,具有相同設定的節點會共同組成節點集區。 這些節點集區包含用來執行應用程式的基礎 VM。 當您建立 AKS 叢集時,您會定義節點的初始數目及其大小 (SKU)。 當應用程式需要變更時,您可能需要變更節點集區上的設定。 例如,您可能需要調整節點集區中的節點數目,或升級節點集區的 Kubernetes 版本。
本文說明如何在 AKS 叢集中管理一個或多個節點集區。
開始之前
- 請參閱 在 Azure Kubernetes Service (AKS) 中建立叢集的節點集區,以了解如何為您的 AKS 叢集建立節點集區。
- 您需要安裝和設定 Azure CLI 2.2.0 版或更新版本。 執行
az --version
以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。 - 如需規劃儲存體設定,請參閱 Azure Kubernetes Service 中應用程式適用的儲存體選項。
限制
在建立和管理支援多個節點集區的 AKS 叢集時,需遵守下列限制:
- 請參閱 Azure Kubernetes Service (AKS) 中的配額、虛擬機器大小限制及區域可用性。
- 系統集區必須包含至少一個節點,而使用者節點集區則可包含零個或多個節點。
- 建立節點集區之後,您無法變更其 VM 大小。
- 當您在叢集建立時建立多個節點集區時,節點集區所使用的所有 Kubernetes 版本都必須符合控制平面的版本集。 您可以在使用每個節點集區作業佈建叢集之後進行更新。
- 您無法同時在叢集或節點集區上執行升級和調整作業。 如果您嘗試同時執行它們,您會收到錯誤。 每個作業類型都必須在該相同資源上的下一個要求之前,於目標資源上完成。 如需詳細資訊,請參閱疑難排解指南。
升級單一節點集區
注意
節點集區 OS 映像版本會繫結至叢集的 Kubernetes 版本。 您只會在叢集升級之後取得 OS 映像升級。
在此範例中,我們會升級 mynodepool 節點集區。 由於有兩個節點集區,我們必須使用 az aks nodepool upgrade
命令來升級。
使用
az aks get-upgrades
命令檢查是否有任何可用的升級。az aks get-upgrades --resource-group myResourceGroup --name myAKSCluster
使用
az aks nodepool upgrade
命令升級 mynodepool 節點集區。az aks nodepool upgrade \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name mynodepool \ --kubernetes-version KUBERNETES_VERSION \ --no-wait
使用
az aks nodepool list
命令列出節點集區的狀態。az aks nodepool list --resource-group 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 版本相關聯的叢集資源物件:
- 叢集控制平面 Kubernetes 版本,以及
- 具有 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 範本中,宣告會回復為節點集區定義的現有版本。 如果未進行任何設定,它會使用控制平面版本來回復。
- 您無法在單一控制平面或節點集區資源上同時提交多個作業。 您可以在指定時間升級或調整控制平面或節點集區。
手動調整節點集區
隨著應用程式工作負載的需求變更,您可能需要調整節點集區中的節點數目。 節點數目可擴大或縮小。
使用
az aks node pool scale
命令調整節點集區的節點數目。az aks nodepool scale \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name mynodepool \ --node-count 5 \ --no-wait
使用
az aks node pool list
命令列出節點集區的狀態。az aks nodepool list --resource-group 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 提供個別功能,以使用稱為叢集自動調整程式的功能自動調整節點集區。 您可以使用每個節點集區的唯一最小和最大調整計數來啟用此功能。
如需詳細資訊,請參閱使用叢集自動調整程式。
拿掉現有節點集區中的特定 VM
如需詳細資訊,請參閱 移除現有節點集區中的特定 VM。
將容量保留群組與節點集區建立關聯
當您的工作負載需求變更時,您可以將現有的容量保留群組與節點集區產生關聯,以確保為節點集區配置容量。
搭配 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 \ --generate-ssh-keys
您也可以使用 update 命令,在現有的受控叢集上指派使用者受控識別。
az aks update \ --resource-group $RG_NAME \ --name $CLUSTER_NAME \ --location $LOCATION \ --node-vm-size $VM_SKU \ --node-count $NODE_COUNT \ --enable-managed-identity \ --assign-identity $IDENTITY_ID
將現有的容量保留群組與節點集區產生關聯
使用 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 \
--generate-ssh-keys
注意
刪除節點集區會在刪除該節點集區之前,隱含地將節點集區與任何相關聯的容量保留群組中斷關聯。 刪除叢集會隱含地將該叢集中的所有節點集區與其相關聯的容量保留群組解除關聯。
注意
您無法使用容量保留群組來更新現有的節點集區。 建議的方法是在節點集區建立期間建立容量保留群組。
指定節點集區的 VM 大小
您可能需要建立具有不同 VM 大小和功能的節點集區。 例如,您可以建立節點集區,其包含大量 CPU 或記憶體的節點,或提供 GPU 支援的節點集區。 在下一個區段中,您會使用 taint (污點) 和 toleration (容忍),告知 Kubernetes 排程器如何限制在這些節點上執行的 Pod 存取。
在下列範例中,我們建立使用 Standard_NC6s_v3 VM 大小的 GPU 架構節點集區。 這些 VM 是由 NVIDIA Tesla K80 卡片提供。 如需詳細資訊,請參閱 Azure 中 Linux 虛擬機器的可用大小。
使用
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
使用
az aks nodepool list
命令檢查節點集區的狀態。az aks nodepool list --resource-group 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
將污點、標籤或標記套用至節點集區中的個別節點。
設定節點集區污點
AKS 支援兩種節點污點:節點污點和節點初始化污點 (預覽)。 如需詳細資訊,請參閱在 Azure Kubernetes Service (AKS) 叢集中使用節點污點。
如需如何使用進階 Kubernetes 排程功能的詳細資訊,請參閱 AKS 中進階排程器功能的最佳做法
設定節點集區容忍
在上一個步驟中,您已在建立節點集區時套用 sku=gpu:NoSchedule 污點。 下列範例 YAML 資訊清單使用容差,以允許 Kubernetes 排程器在該節點集區的節點上執行 NGINX Pod。
建立名為
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"
使用
kubectl apply
命令來排程 Pod。kubectl apply -f nginx-toleration.yaml
排程 Pod 並提取 NGINX 映像需要幾秒鐘的時間。
使用
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 叢集的節點集區。
建立範本,例如
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" } } ] }
使用
az deployment group create
命令部署範本。az deployment group create \ --resource-group myResourceGroup \ --template-file aks-agentpools.json
提示
您可以在範本中藉由新增標記屬性,以將標記新增至節點集區,如下列範例所示:
... "resources": [ { ... "properties": { ... "tags": { "name1": "val1" }, ... } } ...
取決於您在 Resource Manager 範本中定義的節點集區設定和作業而定,可能需要幾分鐘的時間來更新 AKS 叢集。
下一步
- 如需如何跨節點集區控制 Pod 的詳細資訊,請參閱 AKS 中進階排程器功能的最佳做法。
- 使用鄰近放置群組,以減少 AKS 應用程式的延遲。
- 使用執行個體層級的公用 IP 位址,讓您的節點能夠直接服務流量。