练习 - 在 AKS 群集上使用群集自动缩放程序配置现成节点池
现成用户节点池允许你以较低的价格访问未使用的 Azure 计算容量,并支持高性能计算方案。
在上一练习中,你创建了一个标准用户节点池,使用群集自动缩放程序管理节点创建,并手动缩放节点计数。
下一步是添加具有自动缩放的现成用户节点池,以减少群集的运营成本。 群集使用情况因所需资源而异,不可预测,因此设置规则以捕获峰值和下降。 部署工作负载时会启用节点相关性,以便在现成节点池中的节点上安排 Pod。
创建现成节点池
需要创建支持批处理服务的单独节点池。 此节点池是一个使用 Delete 逐出策略的现成节点池,现成最高价格为 -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
请记住,由于所选位置的容量限制,此请求可能会失败。
- 名称:
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
。nodeLabels
和nodeTaints
被应用于此节点池。 使用这些值来计划节点池中节点上的工作负荷。
配置命名空间
运行
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 清单文件的tolerations
和affinity
部分中使用此键值对中的信息。 将第二个批处理池配置为现成节点池后,现在可以创建一个部署文件来计划要在其中运行的工作负荷。
使用集成编辑器为名为
spot-node-deployment.yaml
的 Kubernetes 部署创建一个清单文件:code spot-node-deployment.yaml
小窍门
Cloud Shell 包括 集成文件编辑器。 Cloud Shell 编辑器支持语言突出显示、命令面板和文件资源管理器等功能。 对于简单的文件创建和编辑,请在 Cloud Shell 终端中运行
code .
编辑器。 该操作会通过终端中设置的活动工作目录打开编辑器。 若要直接打开清单文件以便快速编辑,请运行code spot-node-deployment.yaml
。 此命令将打开没有文件资源管理器的编辑器。将以下文本粘贴到文件中:
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"
按 Ctrl+S 保存文件,然后按 Ctrl+Q 关闭编辑器。
运行
kubectl apply
命令以应用配置,并在costsavings
命名空间中部署应用程序。kubectl apply \ --namespace costsavings \ -f spot-node-deployment.yaml
下面是上述命令的输出:
pod/nginx created
可以在运行
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
。