练习 - 在 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 将调度到这些节点上。
为现成节点池中的节点分配了一个等于 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
。