練習 - 在 AKS 叢集上設定多個節點並啟用調整為零的能力

已完成

Azure Kubernetes Service 可讓您建立不同的節點集區,將特定工作負載與每個節點集區中正在執行的節點進行比對。

回想一下無人機追蹤範例,您的小組開發了新的預測模型服務,可處理極端天氣條件下的飛行路徑資訊,並建立最佳的飛行路線。 此服務需要 GPU 型虛擬機器 (VM) 支援,而且僅會在一週內的特定日期執行。 小組想要確保服務未執行時不會使用任何 VMS。

您將在此處建立 Azure Kubernetes Service (AKS) 受控 Kubernetes 叢集。 接下來,您將設定叢集以支援多個節點集區,並允許叢集調整節點集區中的節點。 然後,您將新增第二個節點集區,以支援具有動態節點計數的使用者工作負載。 最後,您將將節點計數調整為零,以降低 AKS 叢集中所用節點的成本。

建立新的資源群組

  1. 使用 Azure 帳戶登入 Azure Cloud Shell。 選取 Cloud Shell 的 Bash 版本。

  2. 您將在此課程模組的所有練習中重複使用您在這裡建立的值。 儲存輸出以供日後使用。

  3. 選擇要裝載資源群組的區域。 來自後續練習的功能在所有區域中都無法使用。 基於這個理由,我們建議您使用 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

  4. 請記下您 AKS_CLUSTER_NAME 的名稱。 在整個練習中,您稍後會使用此值來清除叢集的組態設定。

    echo $AKS_CLUSTER_NAME
    
  5. 建立名為 rg-akscostsaving 的新資源群組。 您將在此資源群組的這些練習中部署您建立的所有資源。 當您完成此課程模組後,單一資源群組可讓您更輕鬆地清除資源。

    az group create \
        --name $RESOURCE_GROUP \
        --location $REGION_NAME
    

建立 AKS 叢集

建立資源群組之後,您可以在群組內建立 AKS 叢集。 您的第一個步驟是取得所選區域中的 Kubernetes 版本。 此版本設定為設定您的叢集。

  1. 若要取得 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
    
  2. 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,以在叢集作業時提供可靠性。 在本練習中,我們將只會在此針對成本考量使用兩個節點。

  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 會自動指派 。

新增節點集區

  1. 您的叢集具有單一節點集區。 執行 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
    
  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,而且 namebatchprocpl

將節點集區節點數量調整為零

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 命令來確認叢集中的可用節點。

  1. 執行 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
    
  2. 列出節點集區中的節點。

    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 式使用者節點集區調整為零。

讓我們看看您需要調整節點,但不直接控制需求的策略。