在 Azure Kubernetes Service (AKS) 中啟用或停用節點自動配置(NAP)

本文說明如何使用 Azure CLI 或 Azure Resource Manager (ARM) 範本,在 Azure Kubernetes Service (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-modeoverlay--network-dataplanecilium為 。

    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.modeAuto,以啟用 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": "uksouth",
          "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 管理節點。
  • 現有的 Karpenter NodePools,其spec.limits.cpu欄位設定為 0。 此動作可防止建立新的節點,但不會中斷目前正在執行的節點。
  1. 將每個現有的 Karpenter spec.limits.cpu0 欄位設定為 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 中斷預算(PDB)的規範。

    使用命令 kubectl delete node 時,請小心只刪除 NAP 管理的節點。 您可以使用命令 kubectl get nodes -l karpenter.sh/nodepool 來識別 NAP 管理的節點。

  2. karpenter.azure.com/disable:NoSchedule 污點新增至每個 Karpenter 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. 更新您在ARM範本中的properties.nodeProvisioningProfile.mode欄位至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": "uksouth",
          "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"
            }
          }
        }
      ]
    }
    

從自行託管的開放原始碼 Karpenter 遷移至受管式節點自動佈建(NAP)

如果 Karpenter 是從 開放原始碼 Helm chart 安裝的,你仍然可以在叢集上啟用 NAP。 這些步驟假設已安裝 Karpenter Helm 圖表。

這很重要

在開始遷移前,請確保你正在執行 Karpenter 的 最新版。 NAP 一直都在運行最新版本。

這很重要

執行遷移時,請小心不要移除 Karpenter CRD。 如果 CRD 被刪除,會刪除底層的 NodeClaim,這可能會干擾你的工作負載。

  1. 為確保 Karpenter CRD 不會在步驟 2 中被卸載,請移除 managed-by=Helm 標籤與註解。

    kubectl get crds -l app.kubernetes.io/managed-by=Helm -o name | grep karpenter.azure.com | xargs -I{} kubectl patch {} --type=json -p '
    [
      {"op":"remove","path":"/metadata/annotations/meta.helm.sh~1release-name"},
      {"op":"remove","path":"/metadata/annotations/meta.helm.sh~1release-namespace"},
      {"op":"remove","path":"/metadata/labels/app.kubernetes.io~1managed-by"}
    ]'
    
  2. 解除安裝 Helm 圖表以移除開放原始碼 Karpenter 使用的部署、服務、角色及其他資源。 此時,Karpenter 已不再對擴展事件做出反應,但現有節點仍能正常運作。

    helm uninstall karpenter -n kube-system  # If you installed Karpenter into a different namespace than kube-system, specify that here instead of kube-system
    
  3. 在您的叢集上啟用 NAP:

    az aks update --name ${CLUSTER_NAME} --resource-group ${RESOURCE_GROUP} --node-provisioning-mode Auto --node-provisioning-default-pools None
    

    這個指令會停用預設的 NodePools,因為你已有 NodePool,想繼續使用它們。 如果您想啟用節點自動佈建預設集區,可以從 az aks update 指令中省略 --node-provisioning-default-pools None

  4. 確認遷移完成:當 az aks update 第三步成功完成後,遷移即告完成。 你也可以透過查看 Karpenter CRD 上的註解來確認遷移是否完成。 您應該看到:

        meta.helm.sh/release-name: aks-managed-karpenter-overlay-base
        meta.helm.sh/release-namespace: kube-system
    

    此時 NAP 已啟用,自動縮放應會恢復。

監視節點自動佈建

取得 Karpenter 日誌與狀態

你可以從 Karpenter 取得日誌和狀態更新,以協助診斷和除錯 NAP 相關事件。 AKS 會代表你管理節點自動配置,並在管理控制平面中執行。 您可以啟用控制平面記錄,以查看節點自動佈建的 Karpenter 記錄與作業。 欲了解更多控制平面日誌,請參閱 AKS 控制平面日誌文件

  1. 依照此處的指示設定資源記錄規則,將節點自動佈建記錄推送至 Log Analytics。 請務必在選取 [記錄]node-auto-provisioning 選項時,勾選 的核取方塊。

  2. 選取叢集上的 [記錄] 區段。

  3. 請將以下範例查詢輸入 Log Analytics:

    AKSControlPlane
    | where Category == "karpenter-events"
    
  4. 在 CLI 上查看節點自動配置事件:

    kubectl get events --field-selector source=karpenter-events
    

節點自動配置指標

你可以啟用控制平面指標(預覽版),透過Azure 監視器 管理服務 for Prometheus 附加元件來查看節點自動配置的特定 Karpenter 指標和操作。

後續步驟

如需 AKS 中節點自動布建的詳細資訊,請參閱下列文章: