練習 - 在 AKS 叢集上設定多個節點並啟用調整為零的能力
Azure Kubernetes Service 可讓您建立不同的節點集區,將特定工作負載與每個節點集區中正在執行的節點進行比對。
回想一下無人機追蹤範例,您的小組開發了新的預測模型服務,可處理極端天氣條件下的飛行路徑資訊,並建立最佳的飛行路線。 此服務需要 GPU 型虛擬機器 (VM) 支援,而且僅會在一週內的特定日期執行。 小組想要確保服務未執行時不會使用任何 VMS。
您將在此處建立 Azure Kubernetes Service (AKS) 受控 Kubernetes 叢集。 接下來,您將設定叢集以支援多個節點集區,並允許叢集調整節點集區中的節點。 然後,您將新增第二個節點集區,以支援具有動態節點計數的使用者工作負載。 最後,您將將節點計數調整為零,以降低 AKS 叢集中所用節點的成本。
建立新的資源群組
使用 Azure 帳戶登入 Azure Cloud Shell。 選取 Cloud Shell 的 Bash 版本。
您將在此課程模組的所有練習中重複使用您在這裡建立的值。 儲存輸出以供日後使用。
選擇要裝載資源群組的區域。 來自後續練習的功能在所有區域中都無法使用。 基於這個理由,我們建議您使用 eastus 作為您的區域。 如果您選擇使用不同的值,請變更
REGION_NAME
的值。執行下列命令來註冊變數:
REGION_NAME=eastus RESOURCE_GROUP=rg-akscostsaving AKS_CLUSTER_NAME=akscostsaving-$RANDOM
提示
您可以使用 [複製] 按鈕將命令複製到剪貼簿。 要貼上命令,請在 Cloud Shell 終端中,以滑鼠右鍵按一下新行,然後選取 [貼上],或使用 Shift+Insert 鍵盤快速鍵 (在 macOS 上為 ⌘+V)。
您可以執行
echo
命令來檢查每個值,例如echo $REGION_NAME
。請記下您
AKS_CLUSTER_NAME
的名稱。 在整個練習中,您稍後會使用此值來清除叢集的組態設定。echo $AKS_CLUSTER_NAME
建立名為 rg-akscostsaving 的新資源群組。 您將在此資源群組的這些練習中部署您建立的所有資源。 當您完成此課程模組後,單一資源群組可讓您更輕鬆地清除資源。
az group create \ --name $RESOURCE_GROUP \ --location $REGION_NAME
建立 AKS 叢集
建立資源群組之後,您可以在群組內建立 AKS 叢集。 您的第一個步驟是取得所選區域中的 Kubernetes 版本。 此版本設定為設定您的叢集。
若要取得 Kubernetes 版本,請執行
az aks get-versions
命令。 下列查詢會傳回非預覽 Kubernetes 版本。 將該值儲存在名為VERSION
的 Bash 變數中。 若要擷取並儲存版本編號,請執行下列命令:VERSION=$(az aks get-versions \ --location $REGION_NAME \ --query "values[?isPreview==null].version | [-1]" \ --output tsv) echo $VERSION
az aks create
執行 命令以建立 AKS 叢集。 叢集會以系統節點集區中的兩個節點執行。 此命令可能需要幾分鐘才能完成。az aks create \ --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME \ --location $REGION_NAME \ --kubernetes-version $VERSION \ --node-count 2 \ --load-balancer-sku standard \ --vm-set-type VirtualMachineScaleSets \ --generate-ssh-keys
az aks create
命令有數個參數,可讓您精確設定 Kubernetes 叢集。 在您的叢集中設定正確的支援以調整與多次啟用節點集區時,有兩個重要參數:參數和值 描述 --load-balancer-sku standard
AKS 中的預設負載平衡器支援為 basic
。 當您使用多個節點集區時,不支援basic
負載平衡器。 將值設定為standard
。--vm-set-type VirtualMachineScaleSets
若要在 AKS 中使用調整功能,則需要虛擬機器擴展集。 此參數會啟用對擴展集的支援。 請注意,使用
--node-count 2
參數會在預設節點集區中設定兩個節點。 請回想一下之前的說明,其中提到基本系統服務會跨此系統節點集區執行。 重要的是,生產叢集會使用至少--node-count 3
,以在叢集作業時提供可靠性。 在本練習中,我們將只會在此針對成本考量使用兩個節點。執行
az aks nodepool list
命令,以列出新叢集中的節點集區:az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
以下是命令輸出範例:
[ { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1", "mode": "System", "name": "nodepool1", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": null, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null } ]
請注意,節點集區的
mode
設定System
為 ,且name
會自動指派 。
新增節點集區
您的叢集具有單一節點集區。 執行
az aks nodepool add
命令以新增第二個節點集區。 執行此步驟中的令以建立具備三個節點且名稱為batchprocpl
的使用者節點集區。 請記住,節點集區名稱必須以小寫字母開頭,而且只包含英數字元。 適用於 Linux 節點集區的節點集區名稱限制為 12 個字元,而適用於 Windows 節點集區的節點集區名稱限制則為 6 個字元。執行以下命令:
az aks nodepool add \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl \ --node-count 2
執行
az aks nodepool list
命令,以列出新叢集中的新節點集區:az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
以下是命令輸出範例:
[ { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl", "mode": "User", "name": "batchprocpl", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": { "maxSurge": null }, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null }, { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1", "mode": "System", "name": "nodepool1", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": null, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null } ]
請注意,新節點集區的
mode
已設定為User
,而且name
為batchprocpl
。
將節點集區節點數量調整為零
az aks nodepool scale
執行 命令以手動調整節點集區中的節點。
執行 az aks nodepool scale
命令,並使用 --node-count
參數來將節點數量值設定為 0。
以下是命令範例:
az aks nodepool scale \
--resource-group $RESOURCE_GROUP \
--cluster-name $AKS_CLUSTER_NAME \
--name batchprocpl \
--node-count 0
以下是命令輸出範例:
{
"agentPoolType": "VirtualMachineScaleSets",
"availabilityZones": null,
"count": 0,
"enableAutoScaling": null,
"enableNodePublicIp": false,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
"maxCount": null,
"maxPods": 110,
"minCount": null,
"mode": "User",
"name": "batchprocpl",
"nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
"nodeLabels": null,
"nodeTaints": null,
"orchestratorVersion": "1.17.9",
"osDiskSizeGb": 128,
"osType": "Linux",
"provisioningState": "Succeeded",
"proximityPlacementGroupId": null,
"resourceGroup": "rg-akscostsaving",
"scaleSetEvictionPolicy": null,
"scaleSetPriority": null,
"spotMaxPrice": null,
"tags": null,
"type": "Microsoft.ContainerService/managedClusters/agentPools",
"upgradeSettings": {
"maxSurge": null
},
"vmSize": "Standard_DS2_v2",
"vnetSubnetId": null
}
請注意,節點集區 count
參數值設為 0,且 enableAutoScaling
值已設定為 null
。 為了排程工作負載,您必須手動增加此節點集區的節點數量,因為根據預設,節點建立作業不會自動進行。
設定 Kubernetes 內容
在上一個命令的輸出中,已將節點集區數量設為 0。 您可以執行 kubectl get nodes
命令來確認叢集中的可用節點。
執行
kubectl
以與叢集的 API 伺服器互動。 您必須設定 Kubernetes 叢集內容,以允許kubectl
連線。 內容包含叢集的位址、使用者與命名空間。 執行az aks get-credentials
命令以設定 Cloud Shell 中的 Kubernetes 內容。執行下列命令來擷取叢集認證:
az aks get-credentials \ --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME
以下是命令輸出範例。
Merged "akscostsaving-17835" as current context in /home/user/.kube/config
列出節點集區中的節點。
kubectl get nodes
以下是命令輸出範例:
NAME STATUS ROLES AGE VERSION aks-nodepool1-37990379-vmss000000 Ready agent 32m v1.17.9 aks-nodepool1-37990379-vmss000001 Ready agent 32m v1.17.9
請注意,雖然
az aks nodepool list
命令會列出兩個節點集區,但叢集中只有兩個可用節點,而且這兩者均來自nodepool1
。
若要在直接管理工作負載需求時將 AKS 的成本最佳化,最好的策略是:
- 手動調整節點集區中的節點數量。
- 將昂貴的 NV 式使用者節點集區調整為零。
讓我們看看您需要調整節點,但不直接控制需求的策略。