练习 - 在 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

    • 同时已设置 maxCount 值和 minCount 值。

    • scaleSetEvictionPolicy 属性已设置为 Delete

    • scaleSetPriority 属性设置为 Spot

    • spotMaxPrice 属性设置为 -1

    • nodeLabelsnodeTaints 应用于此节点池。 你可使用这些值来调度此节点池中节点上的工作负载。

配置命名空间

  1. 运行 kubectl create namespace 命令,为应用程序创建一个名为 costsavings 的命名空间。 你将使用此命名空间来更轻松地选择工作负载。

    kubectl create namespace costsavings
    

    下面是上述命令的输出:

    namespace/costsavings created
    

通过现成节点相关性调度 Pod

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

为现成节点池中的节点分配了一个等于 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