Azure Kubernetes Service (AKS) 中節點自動布建 (NAP) 的網路設定概觀

本文提供使用節點自動布建 (NAP) 的 Azure Kubernetes Service (AKS) 叢集網路設定需求和建議的概觀。 它涵蓋支援的組態、預設子網路行為、角色型存取控制 (RBAC) 設定,以及無類別網域間路由 (CIDR) 考量。

如需 AKS 中節點自動布建的概觀,請參閱 Azure Kubernetes Service (AKS) 中的節點自動布建 (NAP) 概觀。

NAP 支援的網路設定

在評估 NAP 的網路支援時,請考慮 IP 位址管理(IPAM)模式、網路外掛程式、網路資料平面及網路政策。 下表說明了 NAP 所支援的選項:

配置層 Option NAP 支援
IPAM Azure CNI Overlay 支援
IPAM Azure CNI Node 子網 支援
IPAM Azure CNI Pod 子網與動態 IP 分配 不支援
網路外掛 Kubenet 不支援
資料平面 Azure CNI Powered by Cilium 可搭配受支援的 Azure CNI IPAM 模式
網路原則 Calico 不支援

使用 Azure CNI Overlay 搭配 Azure CNI Powered by Cilium 數據平面。 Cilium 提供進階網路功能,並針對 NAP 的效能進行了最佳化。

NAP 的子網路設定

在 vnetSubnetID 資源中設定選用的 AKSNodeClass 欄位,以設定 Karpenter 用於佈建 NAP 節點的自訂子網路。 如果你沒有指定 vnetSubnetID,Karpenter 會使用安裝時設定的預設子網路,這通常是你建立 AKS 叢集時參數所指定的 --vnet-subnet-id 子網路。

NAP 會自動部署、配置並管理 Karpenter 在你的 AKS 叢集上,並基於開源的 Karpenter 及 AKS Karpenter 供應商 專案。

AKSNodeClass 你的 AKS 叢集上的資源可以各自指定不同的 vnetSubnetID,這讓節點池間的子網路配置能夠混合。 沒有指定 vnetSubnetID 欄位的節點類別會使用叢集的預設子網路設定。

子網路漂移行為

Karpenter 會監視子網路配置變更,並在 vnetSubnetID中的AKSNodeClass被修改時檢測偏移。 在管理自訂網路設定時,了解此行為至關重要。

對於使用自訂虛擬網路的叢集,從一個有效子網切換 vnetSubnetID 到另一個子網會導致與該 AKSNodeClass 子網相關的現有節點漂移。 Karpenter 會在新的子網路中建立替換節點,並根據NodePool中斷預算平順地淘汰已漂移的節點。

在更改 vnetSubnetID之前,請確保叢集身份在新子網路上擁有所需的權限,且該子網路有足夠的可用 IP 位址作為替代節點。 Pod 中斷預算和karpenter.sh/do-not-disrupt註釋可能會延遲自願性漂移取代。

這很重要

AKS 管理的虛擬網路不支援自訂子網路。 僅可將 vnetSubnetID 與由您管理的自訂虛擬網路搭配使用。

適用於 NAP 的 AKS 叢集 CIDR 範圍

當你用 設定自訂網路 vnetSubnetID時,你需要了解並管理叢集的 CIDR 範圍,以避免網路衝突。 與傳統透過 Azure Resource Manager(ARM)範本建立的 AKS 節點池不同,Karpenter 套用自訂資源定義(CRD),能即時配置節點,無需 ARM 提供的延伸驗證。

NAP 自訂子網設定中的 CIDR 考量

設定 vnetSubnetID時,您必須:

  • 驗證 CIDR 相容性: 確保自訂子網路不會與現有的 CIDR 範圍衝突。
  • 規劃 IP 容量:計算預期擴展所需的 IP 位址。
  • 驗證連線能力:測試網路路由和安全群組規則。
  • 監控使用情況: 追蹤子網路使用率併規劃成長。
  • 文件配置:維護網路設計決策的記錄。

常見的 CIDR 衝突

搭配 NAP 使用自訂子網路時,請注意下列常見的 CIDR 衝突案例:

以下範例展示了與叢集莢艙及服務CIDR衝突的子網CIDR範圍,並搭配避免這些衝突的配置。 在設定 vnetSubnetID之前,請利用這些模式驗證你的子網範圍。

# Example conflict scenarios:
# Cluster Pod CIDR: 10.244.0.0/16  
# Custom Subnet:   10.244.1.0/24  ❌ CONFLICT

# Service CIDR:    10.0.0.0/16
# Custom Subnet:   10.0.10.0/24   ❌ CONFLICT

# Safe configuration:
# Cluster Pod CIDR: 10.244.0.0/16
# Service CIDR:     10.0.0.0/16  
# Custom Subnet:    10.1.0.0/24   ✅ NO CONFLICT

自訂子網路組態的 RBAC 設定

搭配 NAP 使用自訂子網路設定時,您需要確保 Karpenter 具有讀取子網路資訊並將節點加入指定子網路的必要權限。 這需要為叢集的受控識別設定適當的 RBAC 許可權。

執行下列命令的人員必須具備建立所需角色定義和角色指派的權限,例如 角色型存取控制管理員 角色。 除非叢集身份需要為其他情境建立角色指派,否則不要賦予叢集身份角色指派寫入權限。

取得叢集受控識別的主體識別碼。 使用對應叢集身份類型的指令:

CLUSTER_IDENTITY=$(az aks show \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --query identity.principalId \
  --output tsv)

設定這些許可權有兩種主要方法: 指派廣泛的虛擬網路 (VNet) 許可權 或 指派範圍子網路許可權。

此方法是最寬鬆的方法,可授與叢集身分識別許可權,以讀取和加入主要 VNet 內的任何子網,並提供網路參與者存取權。

這很重要

網路貢獻者角色授予 Microsoft.Network/*,允許叢集身份在指定的 VNet 範圍內建立、修改及刪除網路資源。 在使用該角色前,請先檢視此存取權限,因為 NAP 在此情境下僅需子網讀取與加入權限。

優點和考量事項

下表說明在 VNet 範圍內指派網路貢獻者角色的權衡。

廣泛 VNet 權限的好處 廣泛 VNet 權限的考量
• 簡化權限管理。
• 新增子網路時無需更新權限。
• 適用於單一租戶環境。
• 當訂用帳戶達到自訂角色數目上限時的功能。
• 提供比絕對必要的更廣泛的權限。
• 可能不符合嚴格的安全要求。

所需權限

若要指派廣泛的 VNet 許可權,請將叢集的託管識別授予下列 VNet 的許可權:

# Get your VNet resource ID
VNET_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$VNET_RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/$VNET_NAME"

# Assign Network Contributor role for subnet read/join operations
az role assignment create \
  --assignee-object-id $CLUSTER_IDENTITY \
  --assignee-principal-type ServicePrincipal \
  --role "Network Contributor" \
  --scope $VNET_ID

關於設定自訂網路及分配廣泛 VNet 權限的完整範例,請參閱 自訂 VNet 設定 - 最寬鬆的 RBAC 範例腳本。

自訂子網路組態範例

下列範例示範如何使用資源中的vnetSubnetID欄位AKSNodeClass來設定 NAP 節點的自訂子網路:

將 spec.vnetSubnetID 欄位設為目標子網路的完整 Azure 資源識別碼,並使用 /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Network/virtualNetworks/{vnetName}/subnets/{subnetName} 格式。

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: custom-networking
spec:
  vnetSubnetID: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$VNET_RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME"

下列範例顯示如何使用具有不同子網路組態的多個節點類別:

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: frontend-nodes
spec:
  vnetSubnetID: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$VNET_RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$FRONTEND_SUBNET_NAME"
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: backend-nodes
spec:
  vnetSubnetID: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$VNET_RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$BACKEND_SUBNET_NAME"

自備 CNI (BYO CNI) 支援政策

Karpenter for Azure 允許自帶容器網路介面(BYO CNI)設定,且遵循與 AKS 相同的支援政策。 BYO CNI 不會讓 NAP 列為不受支援的設定(例如 kubenet 或 Calico)變成受支援。 使用自訂 CNI 時,與網路相關的故障排除支援不屬於任何服務水準協議或保固範圍。

支援範圍詳細資料

以下概述將 BYO CNI 與 Karpenter 搭配使用時支援的內容和不支援的內容:

  • 支援: 使用自備(BYO)CNI 設定時,Karpenter 特定的功能和整合性問題。
  • 不支援: 使用第三方 CNI 外掛程式時,CNI 特定的網路問題、設定問題或疑難排解。

後續步驟

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