本文介绍如何使用 Azure CLI 或 Azure 资源管理器 (ARM) 模板在 Azure Kubernetes 服务(AKS)中启用或禁用节点自动预配(NAP)。
如果要使用自定义虚拟网络(VNet)和子网创建启用了 NAP 的 AKS 群集,请参阅 在自定义虚拟网络中创建节点自动预配(NAP)群集。
在您开始之前
在开始之前,请查看 AKS 文章中的节点自动预配(NAP)概述 ,其中详细介绍 了 NAP 的工作原理、 先决条件 和 限制。
在 AKS 群集上启用节点自动预配(NAP)
以下部分介绍如何在新的或现有的 AKS 群集上启用 NAP:
在新群集上启用 NAP
在新群集上,使用
az aks create命令并设置--node-provisioning-mode标志为Auto以启用节点自动配置。 以下命令还会将--network-plugin设置为azure、--network-plugin-mode设置为overlay,以及--network-dataplane设置为cilium。az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --node-provisioning-mode Auto \ --network-plugin azure \ --network-plugin-mode overlay \ --network-dataplane cilium \ --generate-ssh-keys
创建一个名为
nap.json的文件,并在其中添加以下 ARM 模板配置,将properties.nodeProvisioningProfile.mode字段设置为Auto,从而启用 NAP。 (默认设置为Manual.){ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "metadata": {}, "parameters": {}, "resources": [ { "type": "Microsoft.ContainerService/managedClusters", "apiVersion": "2025-05-01", "sku": { "name": "Base", "tier": "Standard" }, "name": "napcluster", "location": "chinanorth3", "identity": { "type": "SystemAssigned" }, "properties": { "networkProfile": { "networkPlugin": "azure", "networkPluginMode": "overlay", "networkPolicy": "cilium", "networkDataplane":"cilium", "loadBalancerSku": "Standard" }, "dnsPrefix": "napcluster", "agentPoolProfiles": [ { "name": "agentpool", "count": 3, "vmSize": "standard_d2s_v3", "osType": "Linux", "mode": "System" } ], "nodeProvisioningProfile": { "mode": "Auto" } } } ] }在新集群上使用命令
az deployment group create并将标志--template-file设置为 ARM 模板文件路径,以启用节点自动预配。az deployment group create --resource-group $RESOURCE_GROUP --template-file ./nap.json
在现有群集上启用 NAP
在现有集群上使用命令
az aks update并将标记--node-provisioning-mode设置为Auto启用节点自动预配。az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --node-provisioning-mode Auto
在 AKS 集群上禁用节点自动预配(NAP)
重要
只有满足以下条件,才能在群集上禁用 NAP:
- 没有现有的 NAP 节点。 可以使用
kubectl get nodes -l karpenter.sh/nodepool命令检查现有的 NAP 托管节点。 - 所有现有的卡彭特
NodePools都将其spec.limits.cpu字段设置为0。 此作可防止创建新节点,但不会中断当前正在运行的节点。
将
spec.limits.cpu字段设置为0来应用于每个现有的 KarpenterNodePool。 例如:apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: default spec: limits: cpu: 0重要
如果不想确保以前在 NAP 节点上运行的每个 Pod 在禁用 NAP 之前安全迁移到非 NAP 节点,则可以跳过步骤 2 和步骤 3,而是对每个 NAP 托管节点使用
kubectl delete node该命令。 但是,我们不建议跳过这些步骤,因为这可能会导致一些 Pod 处于挂起状态,而且不遵循 Pod Disruption Budgets(PDB)。使用
kubectl delete node此命令时,请注意仅删除 NAP 托管节点。 可以使用命令标识 NAP 托管节点kubectl get nodes -l karpenter.sh/nodepool。将
karpenter.azure.com/disable:NoSchedule污点添加到每个卡彭特NodePool。 例如:apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: default spec: template: spec: ... taints: - key: karpenter.azure.com/disable effect: NoSchedule该操作将启动将工作负载从 NAP 托管节点迁移到非 NAP 节点的过程,并遵循 PDB 和中断限制。 Pod 如果可以容纳,则迁移到非 NAP 节点。 如果固定大小的容量不足,某些 NAP 管理的节点将继续存在。
扩展现有的固定大小
ManagedClusterAgentPools或创建新的固定大小AgentPools,以分担节点 NAP 托管节点的负载。 当这些节点被添加到集群时,节点 NAP-管理的节点被清空,工作将迁移到固定大小的节点。使用
kubectl get nodes -l karpenter.sh/nodepool命令删除所有 NAP 托管节点。 如果 NAP 托管节点仍然存在,群集可能缺少固定大小的容量。 在这种情况下,应添加更多节点,以便迁移剩余的工作负荷。
使用
ManualAzure CLI 命令并设置az aks update标志为--node-provisioning-mode来将 NAP 模式更新为Manual。az aks update \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --node-provisioning-mode Manual
将
properties.nodeProvisioningProfile.mode字段更新到ManualARM 模板中,然后重新部署。{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "metadata": {}, "parameters": {}, "resources": [ { "type": "Microsoft.ContainerService/managedClusters", "apiVersion": "2025-05-01", "sku": { "name": "Base", "tier": "Standard" }, "name": "napcluster", "location": "chinanorth3", "identity": { "type": "SystemAssigned" }, "properties": { "networkProfile": { "networkPlugin": "azure", "networkPluginMode": "overlay", "networkPolicy": "cilium", "networkDataplane":"cilium", "loadBalancerSku": "Standard" }, "dnsPrefix": "napcluster", "agentPoolProfiles": [ { "name": "agentpool", "count": 3, "vmSize": "standard_d2s_v3", "osType": "Linux", "mode": "System" } ], "nodeProvisioningProfile": { "mode": "Manual" } } } ] }
后续步骤
有关 AKS 中的节点自动预配的详细信息,请参阅以下文章: