練習 - 在 AKS 叢集上使用叢集自動調整程式設定現成節點集區

已完成

現成使用者節點集區可讓您以更低的價格來存取未使用的 Azure 計算容量,並支援高效能運算案例。

在上一個練習中,您已建立標準使用者節點集區、使用叢集自動調整程式來管理節點建立,並手動調整節點計數。

下一個步驟是新增具有自動調整功能的現成使用者節點集區,以降低叢集的營運成本。 叢集使用量會根據所需的資源而有所不同,且無法預測,因此您可以設定規則來擷取尖峰和下降。 工作負載會以已啟用節點親和性來部署,以便在現成節點集區的節點上排程 Pod。

建立現成節點集區

您必須建立個別的節點集區來支援批次處理服務。 此節點集區是現成節點集區,其會使用「刪除」收回原則和 -1 的現成最高價格。

  1. 執行與上一個練習相同的 az aks nodepool add 命令,將新的現成節點集區新增至您的叢集。 您必須變更節點集區名稱,然後再新增幾個參數,以將此節點集區識別為現成節點集區。

    輸入下列值以設定節點集區的參數:

    • 名稱:batchprocpl2
    • 優先順序:Spot
    • 收回原則:Delete
    • 現成最高價格:-1

    執行下列命令來建立現成節點集區:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2 \
        --enable-cluster-autoscaler \
        --max-count 3 \
        --min-count 1 \
        --priority Spot \
        --eviction-policy Delete \
        --spot-max-price -1 \
        --node-vm-size Standard_DS2_v2 \
        --no-wait
    

    請記住,此要求可能因為您所選位置中的容量限制而失敗。

  2. 執行 az aks nodepool show 命令,以顯示用於批次處理服務之新現成節點集區的詳細資料:

    az aks nodepool show \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2
    

    以下是命令輸出範例。

    {
    "agentPoolType": "VirtualMachineScaleSets",
    "availabilityZones": null,
    "count": 3,
    "enableAutoScaling": true,
    "enableNodePublicIp": false,
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl2",
    "maxCount": 3,
    "maxPods": 110,
    "minCount": 1,
    "mode": "User",
    "name": "batchprocpl2",
    "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
    "nodeLabels": {
        "kubernetes.azure.com/scalesetpriority": "spot"
    },
    "nodeTaints": [
        "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
    ],
    "orchestratorVersion": "1.17.9",
    "osDiskSizeGb": 128,
    "osType": "Linux",
    "provisioningState": "Creating",
    "proximityPlacementGroupId": null,
    "resourceGroup": "akscostsavinggrp",
    "scaleSetEvictionPolicy": "Delete",
    "scaleSetPriority": "Spot",
    "spotMaxPrice": -1.0,
    "tags": null,
    "type": "Microsoft.ContainerService/managedClusters/agentPools",
    "upgradeSettings": {
        "maxSurge": null
    },
    "vmSize": "Standard_DS2_v2",
    "vnetSubnetId": null
    }
    

    此結果中有數個值與您在先前節點集區中見到的值截然不同。 讓我們檢閱一下這些項目:

    • enableAutoScaling 屬性值會設定為 true

    • maxCountminCount 值皆已設定。

    • scaleSetEvictionPolicy 屬性會設定為 Delete

    • scaleSetPriority 屬性會設定為 Spot

    • spotMaxPrice 屬性會設定為 -1

    • nodeLabelsnodeTaints 都會套用到此節點集區。 您可以在節點集區中,使用這些值來排程節點上的工作負載。

設定命名空間

  1. 執行 kubectl create namespace 命令,以針對應用程式建立稱為 costsavings 的命名空間。 您將使用此命名空間,更輕鬆地選取工作負載。

    kubectl create namespace costsavings
    

    以下是上述命令的輸出:

    namespace/costsavings created
    

使用現成節點親和性排程 Pod

您可以藉由將 Toleration 和親和性新增至 Pod 的部署資訊清單檔,在現成節點上排程要執行的 Pod。 當 Toleration 和與 Taint 相對應的節點親和性,以及標籤,套用到您現成節點時,即會在這些節點上排程 Pod。

系統會為現成節點集區中的節點指派等於 kubernetes.azure.com/scalesetpriority=spot:NoSchedule 的 Taint 和等於 kubernetes.azure.com/scalesetpriority=spot 的標籤。 在工作負載 YAML 資訊清單檔的 tolerationsaffinity 區段中,使用此機碼值組中的資訊。 藉由將第二個批次處理集區設定為現成節點集區,您現在可以建立部署檔案,以排程要在其上執行的工作負載。

  1. 使用整合式編輯器,為 Kubernetes 部署建立稱為 spot-node-deployment.yaml 的資訊清單檔:

    code spot-node-deployment.yaml
    

    提示

    Cloud Shell 包含整合式檔案編輯器 \(部分機器翻譯\)。 Cloud Shell 編輯器支援語言醒目提示、命令選擇區,以及檔案總管等功能。 針對簡易的檔案建立和編輯,在 Cloud Shell 終端機中執行 code . 來啟動編輯器。 這項動作會開啟編輯器,並在終端機中設為您目前正在使用的工作目錄。 若要直接開啟您的資訊清單檔以進行快速編輯,請執行 code spot-node-deployment.yaml。 此命令會在沒有檔案總管的情況下開啟編輯器。

  2. 將下列文字貼入檔案:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      tolerations:
      - key: "kubernetes.azure.com/scalesetpriority"
        operator: "Equal"
        value: "spot"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "kubernetes.azure.com/scalesetpriority"
                operator: In
                values:
                - "spot"
    
  3. Ctrl+S 儲存檔案,然後按 Ctrl+Q 以關閉編輯器。

  4. 執行 kubectl apply 命令以套用設定,並在 costsavings 命名空間中部署應用程式:

    kubectl apply \
    --namespace costsavings \
    -f spot-node-deployment.yaml
    

    以下是上述命令的輸出:

    pod/nginx created
    
  5. 您可以在執行 kubectl get pods 命令時使用 -o wide 旗標,以擷取有關執行中 Pod 的詳細資訊。 在此案例中,您想要查看 Pod 是在哪個節點上進行排程。 請務必在 costsavings 命名空間中查詢 Pod。

    kubectl get pods --namespace costsavings -o wide
    

    輸出應該如下所示:

    NAME    READY   STATUS    RESTARTS   AGE   IP           NODE                                   NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0          43s   10.244.3.3   aks-batchprocpl2-25254417-vmss000000   <none>           <none>
    

    請注意節點的名稱 aks-batchprocpl2-25254417-vmss000000。 此節點是您稍早所建立之 batchprocpl2 現成節點集區的一部分。