本文介绍如何将辅助现成节点池添加到现有 Azure Kubernetes 服务 (AKS) 群集中。
现成节点池是由 Azure 现成虚拟机规模集支持的节点池。 借助 AKS 群集中的现成 VM,可以充分利用未使用的 Azure 容量,并大幅节省成本。 可用的未用容量因多个因素而异,如节点大小、区域、时间等。
部署现成节点池时,如果存在可用容量,Azure 会分配现成节点,并在单个默认域中部署支持现成节点池的现成规模集。 现成节点没有 SLA。 不提供高可用性保证。 如果 Azure 需要恢复容量,Azure 基础结构会逐出现场节点。
现成节点非常适用于可处理中断、提前终止或逐出的工作负载。 例如,批处理作业、开发、测试环境和大型计算工作负载等工作负载可能非常适合在现成节点池上进行计划。
开始之前
- 本文假设读者基本了解 Kubernetes 和 Azure 负载均衡器的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念。
- 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。
- 当创建群集以使用现成节点池时,该群集还必须将虚拟机规模集用于节点池和标准 SKU 负载均衡器。 创建群集后,还必须添加另一个节点池,本教程将介绍具体操作。
- 本文要求运行 Azure CLI 2.14 或更高版本。 运行
az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
限制
创建和管理具有现成节点池的 AKS 群集时存在以下限制:
- 现成节点池不能是默认节点池,只能用作辅助池。
- 不能同时升级控制平面和节点池。 两者必须单独升级,或者删除现成节点池以同时升级控制平面和剩余节点池。
- 现成节点池必须使用虚拟机规模集。
-
ScaleSetPriority
或SpotMaxPrice
一经创建便无法更改。 - 设置
SpotMaxPrice
时,值必须为 -1,或者为小数点后最多五位的正值。 - 现成节点池具有
kubernetes.azure.com/scalesetpriority:spot
标签、排斥kubernetes.azure.com/scalesetpriority=spot:NoSchedule
,且系统 pod 具有反亲和性。 - 必须添加相应容许和亲和性以在现成节点池中计划工作负载。
将现成节点池添加到 AKS 群集
将现成节点池添加到现有群集时,它必须是启用了多个节点池的群集。 创建启用了多个节点池的 AKS 群集时,默认情况下会创建一个 priority
为 Regular
的节点池。 若要添加现成节点池,必须将 Spot
指定为 priority
的值。 有关创建包含多个节点池的 AKS 群集的更多详细信息,请参阅使用多个节点池。
- 使用
priority
命令创建具有Spot
的az aks nodepool add
的节点池。
export SPOT_NODEPOOL="spotnodepool"
az aks nodepool add \
--resource-group $RESOURCE_GROUP \
--cluster-name $AKS_CLUSTER \
--name $SPOT_NODEPOOL \
--priority Spot \
--eviction-policy Delete \
--spot-max-price -1 \
--enable-cluster-autoscaler \
--min-count 1 \
--max-count 3 \
--no-wait
在上一个命令中,priority
为 Spot
使节点池成为现成节点池。 参数 eviction-policy
设置为 Delete
,这是默认值。 将逐出策略设置为 Delete
时,节点池的底层规模集中的节点会在被逐出时删除。
也可以将逐出策略设置为 Deallocate
,这意味着底层规模集中的节点会在逐出时设置为 stopped-deallocated 状态。 处于 stopped-deallocated 状态的节点会根据计算配额进行计数,可能会导致群集缩放或升级问题。
priority
和 eviction-policy
值只能在创建节点池时设置。 以后不能更新这些值。
上一条命令还将启用群集自动缩放程序,建议将此程序用于现成节点池。 根据群集中运行的工作负载,群集自动缩放程序将纵向扩展和缩减节点数。 对于现成节点池,如果仍需要更多节点,则群集自动缩放程序将在逐出之后纵向扩展节点数。 如果更改节点池可以具有的最大节点数,还需要调整与群集自动缩放程序关联的 maxCount
值。 如果不使用群集自动缩放程序,则在逐出时,现成池最终将递减为 0,且需要手动操作才能接收任何额外的现成节点。
重要
仅在可处理中断的现成节点池上计划工作负载,如批处理作业和测试环境。 建议在现成节点池上设置排斥和容许,确保仅在现成节点池上计划可处理节点逐出的工作负载。 例如,上述命令会添加排斥 kubernetes.azure.com/scalesetpriority=spot:NoSchedule
,因此在此节点上仅计划具有相应容许的 pod。
验证现成节点池
- 通过使用
az aks nodepool show
命令并确认scaleSetPriority
为Spot
来验证已添加节点池。
az aks nodepool show --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER --name $SPOT_NODEPOOL
结果:
{
"artifactStreamingProfile": null,
"availabilityZones": null,
"capacityReservationGroupId": null,
"count": 3,
"creationData": null,
"currentOrchestratorVersion": "1.30.10",
"eTag": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"enableAutoScaling": true,
"enableCustomCaTrust": false,
"enableEncryptionAtHost": false,
"enableFips": false,
"enableNodePublicIp": false,
"enableUltraSsd": false,
"gatewayProfile": null,
"gpuInstanceProfile": null,
"gpuProfile": null,
"hostGroupId": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/xxxxxxxxxxxxxxxx/providers/Microsoft.ContainerService/managedClusters/xxxxxxxxxxxxxxxx/agentPools/xxxxxxxxxxxx",
"kubeletConfig": null,
"kubeletDiskType": "OS",
"linuxOsConfig": null,
"maxCount": 3,
"maxPods": 30,
"messageOfTheDay": null,
"minCount": 1,
"mode": "User",
"name": "xxxxxxxxxxxx",
"networkProfile": {
"allowedHostPorts": null,
"applicationSecurityGroups": null,
"nodePublicIpTags": null
},
"nodeImageVersion": "AKSUbuntu-2204gen2containerd-xxxxxxxx.xx.x",
"nodeInitializationTaints": null,
"nodeLabels": {
"kubernetes.azure.com/scalesetpriority": "spot"
},
"nodePublicIpPrefixId": null,
"nodeTaints": [
"kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
],
"orchestratorVersion": "x.xx.xx",
"osDiskSizeGb": 128,
"osDiskType": "Managed",
"osSku": "Ubuntu",
"osType": "Linux",
"podIpAllocationMode": null,
"podSubnetId": null,
"powerState": {
"code": "Running"
},
"provisioningState": "Creating",
"proximityPlacementGroupId": null,
"resourceGroup": "xxxxxxxxxxxxxxxx",
"scaleDownMode": "Delete",
"scaleSetEvictionPolicy": "Delete",
"scaleSetPriority": "Spot",
"securityProfile": {
"enableSecureBoot": false,
"enableVtpm": false,
"sshAccess": "LocalUser"
},
"spotMaxPrice": -1.0,
"status": null,
"tags": null,
"type": "Microsoft.ContainerService/managedClusters/agentPools",
"typePropertiesType": "VirtualMachineScaleSets",
"upgradeSettings": {
"drainTimeoutInMinutes": null,
"maxSurge": null,
"maxUnavailable": null,
"nodeSoakDurationInMinutes": null,
"undrainableNodeBehavior": null
},
"virtualMachineNodesStatus": null,
"virtualMachinesProfile": null,
"vmSize": "Standard_DS2_v2",
"vnetSubnetId": null,
"windowsProfile": null,
"workloadRuntime": "OCIContainer"
}
计划 Pod 在现成节点上运行
若要计划 pod 在现成节点上运行,可添加与应用到现成节点的排斥相对应的容许和节点相关性。
以下示例显示了 YAML 文件的一部分,该文件定义了与kubernetes.azure.com/scalesetpriority=spot:NoSchedule
排斥相对应的容忍度以及与kubernetes.azure.com/scalesetpriority=spot
标签相对应的节点亲和性(通过requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
节点相关性规则在上一步中使用):
spec:
containers:
- name: spot-example
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"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
部署具有此容许和节点亲和性的 pod 后,Kubernetes 可以成功地在应用了排斥和标签的节点上计划 pod。 在此示例中,以下规则适用:
- 节点必须具有包含键
kubernetes.azure.com/scalesetpriority
的标签,并且该标签的值必须为spot
。 - 节点最好具有包含键
another-node-label-key
的标签,并且该标签的值必须为another-node-label-value
。
有关详细信息,请参阅向节点分配 pod。
升级现成节点池
升级现成节点池时,AKS 会在内部发出隔离和逐出通知,但不应用清空。 没有激增节点可用于现成节点池升级。 在这些更改之外,升级现成节点池时的行为与其他节点池类型一致。
有关升级的详细信息,请参阅升级 AKS 群集。
后续步骤
本文介绍了如何将现成节点池添加到 AKS 群集。 有关如何跨节点池控制 pod 的详细信息,请参阅有关 AKS 中的高级计划程序功能的最佳做法。