在 Azure Kubernetes 服务(AKS)中启用或禁用节点自动预配(NAP)

本文介绍如何使用 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
    
  1. 创建一个名为 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"
            }
          }
        }
      ]
    }
    
  2. 在新集群上使用命令 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。 此作可防止创建新节点,但不会中断当前正在运行的节点。
  1. spec.limits.cpu 字段设置为 0 来应用于每个现有的 Karpenter NodePool。 例如:

    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

  2. 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 管理的节点将继续存在。

  3. 扩展现有的固定大小ManagedClusterAgentPools 或创建新的固定大小AgentPools,以分担节点 NAP 托管节点的负载。 当这些节点被添加到集群时,节点 NAP-管理的节点被清空,工作将迁移到固定大小的节点。

  4. 使用 kubectl get nodes -l karpenter.sh/nodepool 命令删除所有 NAP 托管节点。 如果 NAP 托管节点仍然存在,群集可能缺少固定大小的容量。 在这种情况下,应添加更多节点,以便迁移剩余的工作负荷。

  1. 使用 Manual Azure CLI 命令并设置 az aks update 标志为 --node-provisioning-mode来将 NAP 模式更新为 Manual

    az aks update \
        --name $CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP \
        --node-provisioning-mode Manual
    
  1. properties.nodeProvisioningProfile.mode 字段更新到 Manual ARM 模板中,然后重新部署。

    {
      "$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 中的节点自动预配的详细信息,请参阅以下文章: