练习 - 在 AKS 群集上使用群集自动缩放程序配置现成节点池

已完成

现成用户节点池允许你以较低的价格访问未使用的 Azure 计算容量,并支持高性能计算方案。

在上一练习中,你创建了一个标准用户节点池,使用群集自动缩放程序管理节点创建,并手动缩放节点计数。

下一步是添加具有自动缩放的现成用户节点池,以减少群集的运营成本。 群集使用情况因所需资源而异,不可预测,因此设置规则以捕获峰值和下降。 部署工作负载时会启用节点相关性,以便在现成节点池中的节点上安排 Pod。

创建现成节点池

需要创建支持批处理服务的单独节点池。 此节点池是一个使用 Delete 逐出策略的现成节点池,现成最高价格为 -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

可通过将容忍度和相关性添加到 Pod 的部署清单文件来调度要在现成节点上运行的 Pod。 当容忍和节点相关性与应用到现成节点的污点和标签相对应时,Pod 将调度到这些节点上。

为 spot 节点池中的节点分配一个等于 kubernetes.azure.com/scalesetpriority=spot:NoSchedule 的污点和一个等于 kubernetes.azure.com/scalesetpriority=spot 的标签。 在您的工作负载 YAML 清单文件的tolerationsaffinity部分中使用此键值对中的信息。 将第二个批处理池配置为现成节点池后,现在可以创建一个部署文件来计划要在其中运行的工作负荷。

  1. 使用集成编辑器为名为 spot-node-deployment.yaml 的 Kubernetes 部署创建一个清单文件:

    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