共用方式為

节点自动预配网络配置

本文介绍 Azure Kubernetes 服务(AKS)节点自动预配(NAP)的网络配置要求和建议。

支持的网络配置

对于使用节点自动预配启用的群集,建议使用以下网络配置:

建议的网络策略引擎为 Cilium。 Cilium 提供高级网络功能,并针对节点自动预配的性能进行了优化。

不支持的网络配置

节点自动预配当前 不支持 以下网络配置:

  • Calico 网络策略 - NAP 不支持
  • 动态 IP 分配 - 尚不支持
  • 无类 Inter-Domain 路由(CIDR)块的静态分配 - 尚不受支持

使用自定义 VNet 和子网设置群集

Karpenter 支持自定义网络配置,允许为节点指定不同的子网。 如果需要在特定子网中放置节点以满足合规性、安全性或网络分段要求,此方法非常有用。

创建 VNet 和子网

首先,为 AKS 群集创建包含两个子网的 VNet:

# Set variables
RESOURCE_GROUP="my-aks-rg"
LOCATION="chinanorth3"
VNET_NAME="my-aks-vnet"
CLUSTER_SUBNET="cluster-subnet"
CUSTOM_SUBNET="custom-subnet"
CLUSTER_NAME="my-aks-cluster"

# Create resource group
az group create --name $RESOURCE_GROUP --location $LOCATION

# Create VNet with address space
az network vnet create \
  --resource-group $RESOURCE_GROUP \
  --name $VNET_NAME \
  --address-prefixes 10.0.0.0/16

# Create cluster subnet for main AKS nodes
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $CLUSTER_SUBNET \
  --address-prefixes 10.0.1.0/24

# Create custom subnet for Karpenter nodes
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $CUSTOM_SUBNET \
  --address-prefixes 10.0.2.0/24

使用自定义 VNet 创建 AKS 群集

使用群集子网创建 AKS 群集:

# Get subnet ID for cluster creation
CLUSTER_SUBNET_ID=$(az network vnet subnet show \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $CLUSTER_SUBNET \
  --query id -o tsv)

# Create AKS cluster with custom VNet and Karpenter enabled
az aks create \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --node-count 1 \
  --vnet-subnet-id $CLUSTER_SUBNET_ID \
  --network-plugin azure \
  --enable-managed-identity \
  --node-provisioning-mode Auto \
  --generate-ssh-keys

节点自动预配安装

在创建群集期间使用 --node-provisioning-mode Auto 时,会自动启用节点自动预配。

先决条件

  • 已安装并经过身份验证的 Azure CLI
  • 已安装节点自动预配的 AKS 群集(从前面的步骤中)
  • VNet 中的自定义子网(在前面的步骤中)
  • 子网访问的相应 Role-Based 访问控制(RBAC)权限

VNet 子网配置

可以使用字段 vnetSubnetID 在 AKSNodeClass 中配置自定义子网标识符:

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: custom-networking
spec:
  vnetSubnetID: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-aks-rg/providers/Microsoft.Network/virtualNetworks/my-aks-vnet/subnets/custom-subnet"

默认子网行为

vnetSubnetID AKSNodeClass 中的字段是可选的。 如果未指定,Karpenter 会自动使用通过 --vnet-subnet-id CLI 参数或 VNET_SUBNET_ID 环境变量在 Karpenter 安装过程中配置的默认子网。

此默认子网通常是在 AKS 群集创建 --vnet-subnet-id 期间使用命令中的 az aks create 标志指定的子网。 此回退机制的工作原理如下:

  • 指定 vnetSubnetID:Karpenter 在指定的自定义子网中预配节点
  • 未指定 vnetSubnetID:Karpenter 在群集的默认子网(发件人 --vnet-subnet-id) 中预配节点

此方法允许混合使用 NodeClasses - 一些对特定工作负荷使用自定义子网,另一些使用群集的默认子网配置。

RBAC 配置

自定义子网配置要求 Karpenter 具有读取子网信息和将节点加入指定子网的适当权限。 有两种用于配置这些权限的建议方法。

方法 A:广泛的 VNet 权限

此方法授予群集标识权限,以读取和加入主 VNet 中的任何子网,并提供网络参与者访问权限。 这是宽松的。 在将此方法应用到生产群集之前,请调查“网络参与者”角色。

所需的权限

将以下角色分配到 VNet 范围内的群集标识:

# Get your cluster's managed identity
CLUSTER_IDENTITY=$(az aks show --resource-group <cluster-rg> --name <cluster-name> --query identity.principalId -o tsv)

# Get your VNet resource ID
VNET_ID="/subscriptions/<subscription-id>/resourceGroups/<vnet-rg>/providers/Microsoft.Network/virtualNetworks/<vnet-name>"

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

优点

  • 简化权限管理
  • 无需在添加新子网时更新权限
  • 适用于单租户环境
  • 订阅达到自定义角色的最大数目时函数

示例脚本

有关使用方法 A 权限设置自定义网络的完整示例,请参阅 此示例设置脚本

注意事项

  • 提供比严格必要的更广泛的权限
  • 可能无法满足严格的安全要求

方法 B:作用域内子网权限

此方法基于每个子网授予权限,从而更精细地控制群集可以访问的子网。

所需的权限

对于要用于 Karpenter 的每个子网,请分配以下特定权限:

# Get your cluster's managed identity
CLUSTER_IDENTITY=$(az aks show --resource-group <cluster-rg> --name <cluster-name> --query identity.principalId -o tsv)

# For each subnet, assign specific subnet permissions
SUBNET_ID="/subscriptions/<subscription-id>/resourceGroups/<vnet-rg>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>"

# Create custom role definition for subnet access
cat > subnet-access-role.json << EOF
{
  "Name": "Karpenter Subnet Access",
  "IsCustom": true,
  "Description": "Allows reading subnet information and joining VMs to subnets",
  "Actions": [
    "Microsoft.Network/virtualNetworks/subnets/read",
    "Microsoft.Network/virtualNetworks/subnets/join/action"
  ],
  "NotActions": [],
  "DataActions": [],
  "NotDataActions": [],
  "AssignableScopes": [
    "/subscriptions/<subscription-id>"
  ]
}
EOF

# Create the custom role (only needed once per subscription)
az role definition create --role-definition subnet-access-role.json

# Assign the custom role to each subnet
az role assignment create \
  --assignee $CLUSTER_IDENTITY \
  --role "Karpenter Subnet Access" \
  --scope $SUBNET_ID

替代方法:使用内置角色

如果更喜欢使用内置角色,可以单独分配这些特定权限:

# Assign Network Reader role for subnet read access
az role assignment create \
  --assignee $CLUSTER_IDENTITY \
  --role "Network Contributor" \
  --scope $SUBNET_ID \
  --condition "((!(ActionMatches{'Microsoft.Network/virtualNetworks/subnets/write'})) AND (!(ActionMatches{'Microsoft.Network/virtualNetworks/subnets/delete'})))"

注意:条件参数将网络参与者角色限制为仅对子网执行读取和加入作,不包括写入和删除权限。

优点

  • 遵循最低特权原则
  • 提供精细访问控制
  • 确保更好地符合安全策略

示例脚本

有关使用方法 B 权限设置自定义网络的完整示例,请参阅此 限定范围的子网权限脚本

AKSNodeClass 配置示例

单个自定义子网

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: dedicated-workload
spec:
  vnetSubnetID: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-aks-rg/providers/Microsoft.Network/virtualNetworks/my-aks-vnet/subnets/custom-subnet"

不同子网的多个 NodeClasses

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: frontend-nodes
spec:
  vnetSubnetID: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-aks-rg/providers/Microsoft.Network/virtualNetworks/my-aks-vnet/subnets/custom-subnet"
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: backend-nodes
spec:
  vnetSubnetID: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-aks-rg/providers/Microsoft.Network/virtualNetworks/my-aks-vnet/subnets/custom-subnet2"

子网偏移行为

Karpenter 监视子网配置更改,并在修改 AKSNodeClass 时 vnetSubnetID 检测偏移。 在管理自定义网络配置时,了解此行为至关重要。

不支持的配置路径

从一个有效子网修改 vnetSubnetID 到另一个有效子网不是受支持的作。 此字段是唯一可变的,用于在初始配置期间为更正无效或格式不正确的子网标识符(ID)提供转义槽。

支持的用例:修复无效的子网 ID

vnetSubnetID只能在以下情况下修改该字段:

  • 更正格式不正确的子网 ID,防止节点预配
  • 修复导致配置错误的无效子网引用
  • 更新指向不存在或无法访问的子网的子网标识符

如果你是高级网络用户并知道正在执行的作,则可以利用 vnetSubnetID 偏移功能从旧子网迁移到新子网。 只需了解其最大努力支持

支持策略:Microsoft不支持通过 vnetSubnetID 修改从子网迁移到子网迁移的问题。 与此类作相关的支持票证被拒绝。

了解 AKS 群集无类 Inter-Domain 路由 (CIDR) 范围

配置自定义网络 vnetSubnetID时,你负责了解和管理群集的无类 Inter-Domain 路由(CIDR)范围,以避免网络冲突。 与通过 ARM 模板创建的传统 AKS NodePools 不同,Karpenter 应用自定义资源定义(CRD),无需 ARM 提供的扩展验证即可立即预配节点。

客户职责

配置 vnetSubnetID时,必须:

  1. 验证 CIDR 兼容性:确保自定义子网与现有群集无分类 Inter-Domain 路由(CIDR)范围不冲突
  2. 规划 IP 容量:计算预期缩放所需的 IP 地址
  3. 验证连接:测试网络路由和安全组规则
  4. 监视使用情况:跟踪子网利用率并计划增长
  5. 文档配置:维护网络设计决策的记录

常见 CIDR 冲突

请注意这些潜在的冲突:

# 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

你负责为节点类配置 vnetSubnetID。 ARM 验证不验证子网是否具有足够的 IP 地址,并且不会与其他任何 CIDR 范围重叠。

自带 CNI (BYO CNI) 支持策略

适用于 Azure 的 Karpenter 允许自带容器网络接口 (CNI) 配置,遵循与 Azure Kubernetes 服务(AKS)相同的支持策略。 这意味着,使用自定义 CNI 时,与网络相关的故障排除支持不受任何服务级别协议或保修的范围。

支持范围

支持:使用自带 (BYO) CNI 配置时,特定于 Karpenter 的功能和集成问题。

不支持:使用第三方 CNI 插件时特定于 CNI 的网络问题、配置问题或故障排除。

支持策略详细信息

  • 允许将自带 (BYO) CNI 与 Karpenter 一起使用,但遵循 AKS BYO CNI 支持边界
  • 与 CNI 插件本身相关的网络问题不在 Karpenter 支持范围内
  • 无论 CNI 选择如何,都支持特定于 Karpenter 的问题(节点预配、缩放和生命周期管理)
  • CNI 配置和故障排除 应定向到相应的 CNI 供应商或社区

何时联系 BYO CNI 支持人员

请联系 Karpenter 支持人员:

  • 使用自带 (BYO) CNI 的节点预配失败
  • 使用自定义 CNI 时的 Karpenter 控制器问题
  • Karpenter 和 CNI 插件之间的集成问题
  • AKSNodeClass 配置问题

请勿联系 Karpenter 支持人员:

  • CNI 插件安装或配置问题
  • 特定于 CNI 的网络连接问题
  • CNI 插件性能或功能问题
  • CNI 特定的网络行为疑难解答

后续步骤