练习 - 在 AKS 群集上配置多个节点并使缩放为零
借助 Azure Kubernetes 服务,你可创建不同的节点池,从而将特定工作负载与每个节点池中运行的节点进行匹配。
回顾无人机追踪的示例,你的团队开发了一项新的预测建模服务,它可在极端天气条件下处理飞行路线信息并创建最佳飞行路线。 此服务需要基于 GPU 的虚拟机 (VM) 支持,并且仅在一周中的特定日期运行。 团队希望确保在服务未运行时不使用 VMS。
在这里,你将创建一个 Azure Kubernetes 服务 (AKS) 托管的 Kubernetes 群集。 下一步,配置该群集,使其支持多个节点池,并允许群集缩放节点池中的节点。 然后,添加第二个节点池以支持具有动态节点计数的用户工作负载。 最后,将节点计数缩减为零,以减少 AKS 群集中使用的节点的成本。
创建新的资源组
使用 Azure 帐户登录 Azure Cloud Shell。 选择 Cloud Shell 的 Bash 版本。
在本模块中的所有练习中,你将重复使用你在这里创建的值。 保存输出以供将来使用。
选择要托管资源组的区域。 后续练习中的功能在所有区域中都不可用。 为此,建议使用 eastus 区域。 如果选择使用其他值,请更改
REGION_NAME
的值。运行以下命令来注册变量:
REGION_NAME=eastus RESOURCE_GROUP=rg-akscostsaving AKS_CLUSTER_NAME=akscostsaving-$RANDOM
提示
可以使用“复制”按钮将命令复制到剪贴板。 要粘贴,请右键单击 Cloud Shell 终端中的新行,然后选择“粘贴”,或使用 Shift+Insert 键盘快捷方式(在 macOS 上为 ⌘+V)。
可通过运行
echo
命令检查每个值;例如echo $REGION_NAME
。记下你的
AKS_CLUSTER_NAME
。 在整个练习中,此值稍后用于群集的清理和配置设置。echo $AKS_CLUSTER_NAME
新建一个名为“rg-akscostsaving”的资源组。 在此资源组中部署在这些练习中创建的所有资源。 完成本模块后,使用单个资源组可以更轻松地清理资源。
az group create \ --name $RESOURCE_GROUP \ --location $REGION_NAME
创建 AKS 群集
创建资源组后,可以在该组中创建 AKS 群集。 第一步是在所选区域中获取 Kubernetes 的版本。 此版本设置为配置群集。
若要获取 Kubernetes 版本,请运行
az aks get-versions
命令。 下面的查询返回非预览版 Kubernetes。 将该值存储在名为VERSION
的 Bash 变量中。 若要检索并存储版本号,请运行以下命令:VERSION=$(az aks get-versions \ --location $REGION_NAME \ --query "values[?isPreview==null].version | [-1]" \ --output tsv) echo $VERSION
运行
az aks create
命令以创建 AKS 群集。 群集使用系统节点池中的两个节点。 此命令可能需要几分钟时间才能完成。az aks create \ --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME \ --location $REGION_NAME \ --kubernetes-version $VERSION \ --node-count 2 \ --load-balancer-sku standard \ --vm-set-type VirtualMachineScaleSets \ --generate-ssh-keys
az aks create
命令具有多个参数,这些参数可用于精确配置 Kubernetes 群集。 在群集中为缩放和多个节点池配置正确的支持时,有两个重要的参数:参数和值 描述 --load-balancer-sku standard
AKS 中支持的默认负载均衡器为 basic
。 使用多个节点池时不支持basic
负载均衡器。 将值设置为standard
。--vm-set-type VirtualMachineScaleSets
若要使用 AKS 中的缩放功能,需要虚拟机规模集。 此参数会启用对规模集的支持。 请注意,使用
--node-count 2
参数在默认节点池中配置了两个节点。 回想一下之前描述的内容:基本系统服务跨此系统节点池运行。 很重要的一点是,生产群集至少要使用--node-count 3
才能确保群集运行的可靠性。 在本练习中,为了成本考虑,我们在这里只使用两个节点。运行
az aks nodepool list
命令,列出新群集中的节点池:az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
下面是该命令输出的示例:
[ { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1", "mode": "System", "name": "nodepool1", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": null, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null } ]
请注意,节点池的
mode
设置为System
,name
将自动进行分配。
添加节点池
你的群集只有一个节点池。 运行
az aks nodepool add
命令,以添加第二个节点池。 运行此步骤中的命令,以创建一个包含 3 个节点且名为batchprocpl
的用户节点池。 请记住,节点池名称必须以小写字母开头,并且仅包含字母数字字符。 对于 Linux 节点池,节点池名称限制为 12 个字符;对于 Windows 节点池,则限制为 6 个字符。运行以下命令:
az aks nodepool add \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl \ --node-count 2
运行
az aks nodepool list
命令,列出新群集中的新节点池:az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
下面是该命令输出的示例:
[ { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl", "mode": "User", "name": "batchprocpl", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": { "maxSurge": null }, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null }, { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1", "mode": "System", "name": "nodepool1", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": null, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null } ]
请注意,新节点池的
mode
设置为User
,name
设置为batchprocpl
。
将节点池节点计数缩放到零
运行 az aks nodepool scale
命令,以手动缩放节点池中的节点。
运行 az aks nodepool scale
命令,并使用 --node-count
参数将节点计数值设置为 0。
下面是该命令的示例:
az aks nodepool scale \
--resource-group $RESOURCE_GROUP \
--cluster-name $AKS_CLUSTER_NAME \
--name batchprocpl \
--node-count 0
下面是该命令输出的示例:
{
"agentPoolType": "VirtualMachineScaleSets",
"availabilityZones": null,
"count": 0,
"enableAutoScaling": null,
"enableNodePublicIp": false,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
"maxCount": null,
"maxPods": 110,
"minCount": null,
"mode": "User",
"name": "batchprocpl",
"nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
"nodeLabels": null,
"nodeTaints": null,
"orchestratorVersion": "1.17.9",
"osDiskSizeGb": 128,
"osType": "Linux",
"provisioningState": "Succeeded",
"proximityPlacementGroupId": null,
"resourceGroup": "rg-akscostsaving",
"scaleSetEvictionPolicy": null,
"scaleSetPriority": null,
"spotMaxPrice": null,
"tags": null,
"type": "Microsoft.ContainerService/managedClusters/agentPools",
"upgradeSettings": {
"maxSurge": null
},
"vmSize": "Standard_DS2_v2",
"vnetSubnetId": null
}
请注意,节点池 count
参数值设置为 0,而 enableAutoScaling
值设置为 null
。 若要计划工作负载,必须手动增加此节点池的节点计数,因为默认情况下不会自动创建节点。
配置 Kubernetes 上下文
在上一个命令的输出结果中,节点池计数设置为 0。 可运行 kubectl get nodes
命令来确认群集中的可用节点。
运行
kubectl
,以与群集的 API 服务器进行交互。 你必须配置 Kubernetes 群集上下文,以允许kubectl
进行连接。 上下文包含群集的地址、用户和命名空间。 运行az aks get-credentials
命令,以在 Cloud Shell 中配置 Kubernetes 上下文。运行以下命令来检索群集凭据:
az aks get-credentials \ --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME
下面是该命令输出的示例。
Merged "akscostsaving-17835" as current context in /home/user/.kube/config
列出节点池中的节点。
kubectl get nodes
下面是该命令输出的示例:
NAME STATUS ROLES AGE VERSION aks-nodepool1-37990379-vmss000000 Ready agent 32m v1.17.9 aks-nodepool1-37990379-vmss000001 Ready agent 32m v1.17.9
请注意,尽管
az aks nodepool list
命令列出了两个节点池,但群集中只有两个可用节点,并且这两个节点都来自nodepool1
。
若要在直接管理工作负载需求时优化 AKS 的成本,一个好的策略是:
- 手动缩放节点池中的节点计数。
- 将基于 NV 的成本较高的用户节点池缩放到零。
让我们看一下需要缩放节点的策略,但不直接控制需求。