配置 Azure CNI 网络以在 Azure Kubernetes 服务 (AKS) 中动态分配 IP 和增强子网支持
传统 CNI 的一个缺点是,随着 AKS 群集的增长,Pod IP 地址将耗尽,导致需要在更大的子网中重建整个群集。 Azure CNI 中的新增 IP 动态分配功能可从与托管 AKS 群集的子网分隔的子网分配 Pod IP,以此来解决这个问题。
这能带来以下好处:
- 更高的 IP 利用率:IP 从 Pod 子网动态分配给群集 Pod。 与传统的 CNI 解决方案(为每个节点静态分配 IP)相比,此功能可以优化群集中的 IP 利用率。
- 可缩放性和灵活性:可以单独缩放节点和 Pod 子网。 单个 Pod 子网可以在群集的多个节点池之间或在同一 VNet 中部署的多个 AKS 群集之间共享。 你还可以为节点池配置单独的 Pod 子网。
- 高性能:由于为 Pod 分配了虚拟网络 IP,因此它们可以直接连接到 VNet 中的其他群集 Pod 和资源。 此解决方案支持非常大的群集,且丝毫不会降低性能。
- 用于 Pod 的单独 VNet 策略:由于 Pod 具有单独的子网,因此你可以单独为它们配置不同于节点策略的 VNet 策略。 这样可以实现许多有用的方案,例如只允许 Pod 而不允许节点连接 Internet,使用 Azure NAT 网关修复节点池中 Pod 的源 IP 以及使用 NSG 筛选节点池之间的流量。
- Kubernetes 网络策略:Azure 网络策略和 Calico 都适用于此新解决方案。
本文介绍如何在 AKS 中使用 Azure CNI 网络动态分配 IP 和增强子网支持。
先决条件
查看在 AKS 中配置基本 Azure CNI 网络的先决条件,因为相同的先决条件适用于本文。
查看用于在 AKS 中配置基本 Azure CNI 网络的部署参数,因为适用相同的参数。
不支持 AKS 引擎和 DIY 群集。
Azure CLI
2.37.0
或更高版本。如果你有现有群集,则需要启用容器见解来监视 IP 子网使用情况。 可以使用
az aks enable-addons
命令来启用容器见解,如以下示例所示:az aks enable-addons --addons monitoring --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME
计划 IP 寻址
使用此功能规划 IP 寻址要简单得多。 由于节点和 Pod 是独立缩放的,因此也可以单独计划其地址空间。 由于可以将 Pod 子网配置为节点池的粒度,因此你在添加节点池时始终可以添加新的子网。 群集/节点池中的系统 Pod 也会从 Pod 子网中接收 IP,因此需要考虑此行为。
以 16 个为一组将 IP 分配给节点。 Pod 子网 IP 分配应计划为群集中每个节点至少 16 个 IP;节点将在启动时请求 16 个 IP,且会在任何时候(当其服务配额中有 <8 个 IP 未分配时)请求另一批 16 个。
Kubernetes 服务和 Docker 桥的 IP 计划保持不变。
若要查看并验证负责这些 IP 分配的 NodeNetworkConfiguration (NNC) 资源,可以运行以下命令:
kubectl get nodenetworkconfigs -n kube-system -o wide
具有 IP 动态分配和增强版子网支持的群集中每个节点的最大 Pod 数
使用具有 IP 动态分配功能的 Azure CNI 时,每个节点的 Pod 值与传统的 CNI 行为相比略有变化:
CNI | 默认 | 可在部署时配置 |
---|---|---|
传统 Azure CNI | 30 | 是(最大 250) |
具有 IP 动态分配功能的 Azure CNI | 250 | 是(最大 250) |
与配置每个节点的最大 Pod 数相关的所有其他指南保持不变。
部署参数
用于在 AKS 中配置基本 Azure CNI 网络的部署参数都是有效的,但有两个例外:
- 现在,subnet 参数是指与群集节点有关的子网。
- 另一个参数 pod subnet 用于指定其 IP 地址将动态分配给 Pod 的子网。
为网络配置动态分配 IP 功能和增强的子网支持 - Azure CLI
在群集中使用 IP 动态分配和增强版子网支持类似于配置群集 Azure CNI 的默认方法。 下面的示例演示如何创建一个新的虚拟网络,其中包含一个用于节点的子网和一个用于 Pod 的子网,以及如何创建一个群集,该群集使用具有 IP 动态分配和增强版子网支持的 Azure CNI。 确保用自己的值替换变量(如 $subscription
)。
创建包含两个子网的虚拟网络。
RESOURCE_GROUP_NAME="myResourceGroup"
VNET_NAME="myVirtualNetwork"
LOCATION="westcentralus"
SUBNET_NAME_1="nodesubnet"
SUBNET_NAME_2="podsubnet"
# Create the resource group
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
# Create our two subnet network
az network vnet create --resource-group $RESOURCE_GROUP_NAME --location $LOCATION --name $VNET_NAME --address-prefixes 10.0.0.0/8 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_1 --address-prefixes 10.240.0.0/16 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_2 --address-prefixes 10.241.0.0/16 -o none
创建群集,使用 --vnet-subnet-id
引用节点子网,使用 --pod-subnet-id
引用 Pod 子网,并启用监视加载项。
CLUSTER_NAME="myAKSCluster"
SUBSCRIPTION="aaaaaaa-aaaaa-aaaaaa-aaaa"
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--location $LOCATION \
--max-pods 250 \
--node-count 2 \
--network-plugin azure \
--vnet-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_1 \
--pod-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_2 \
--enable-addons monitoring \
--generate-ssh-keys
添加节点池
添加节点池时,请使用 --vnet-subnet-id
引用节点子网,并使用 --pod-subnet-id
引用 Pod 子网。 以下示例创建了两个新子网,然后在创建新节点池时引用它们:
SUBNET_NAME_3="node2subnet"
SUBNET_NAME_4="pod2subnet"
NODE_POOL_NAME="mynodepool"
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_3 --address-prefixes 10.242.0.0/16 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_4 --address-prefixes 10.243.0.0/16 -o none
az aks nodepool add --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --name $NODE_POOL_NAME \
--max-pods 250 \
--node-count 2 \
--vnet-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_3 \
--pod-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_4 \
--no-wait
监视 IP 子网使用情况
Azure CNI 提供监视 IP 子网使用情况的功能。 若要启用 IP 子网使用情况监视,请执行以下步骤:
获取 YAML 文件
从 GitHub 下载或 grep 名为 container-azm-ms-agentconfig.yaml 的文件。
在集成中查找
azure_subnet_ip_usage
。 将enabled
设置为true
。保存文件。
获取 AKS 凭据
设置订阅、资源组和群集的变量。 请考虑以下示例:
az account set --subscription $SUBSCRIPTION
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME
应用配置
- 在保存了下载的 container-azm-ms-agentconfig.yaml 文件的文件夹中打开终端。
- 使用
kubectl apply -f container-azm-ms-agentconfig.yaml
命令来应用配置。 这将重启 Pod,5-10 分钟后,指标将可见。 - 若要查看群集上的指标,请导航到 Azure 门户群集页上的“工作簿”,找到名为“子网 IP 使用情况”的工作簿。
IP 地址动态分配和增强版子网支持常见问题解答
能否将多个 Pod 子网分配给群集/节点池?
只能向群集或节点池分配一个子网。 但是,多个群集或节点池可以共享一个子网。
能否完全从不同的 VNet 分配 Pod 子网?
不可以,Pod 子网应与群集来自同一 VNet。
能否群集中的一些节点池使用传统的 CNI,而其他节点池使用新的 CNI?
整个群集只能使用一种类型的 CNI。
后续步骤
通过以下文章详细了解 AKS 中的网络: