本文介绍 Azure Kubernetes 服务(AKS)节点自动预配(NAP)的网络配置要求和建议。
支持的网络配置
对于使用节点自动预配启用的群集,建议使用以下网络配置:
- 将 Azure CNI 与 Cilium 配合使用
- Azure CNI
建议的网络策略引擎
建议的网络策略引擎为 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
时,必须:
- 验证 CIDR 兼容性:确保自定义子网与现有群集无分类 Inter-Domain 路由(CIDR)范围不冲突
- 规划 IP 容量:计算预期缩放所需的 IP 地址
- 验证连接:测试网络路由和安全组规则
- 监视使用情况:跟踪子网利用率并计划增长
- 文档配置:维护网络设计决策的记录
常见 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 特定的网络行为疑难解答