传统 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 Pod 子网 - 动态 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
具有 Pod 子网的群集中每个节点的最大 Pod 数 - 动态 IP 分配和增强的子网支持
使用 Azure CNI Pod 子网时,每个节点的 Pod 值 - 动态 IP 分配与传统的 CNI 行为略有不同:
CNI | 默认 | 可在部署时配置 |
---|---|---|
传统 Azure CNI | 30 | 是(最大 250) |
Azure CNI Pod 子网 - 动态 IP 分配 | 250 | 是(最大 250) |
与配置每个节点的最大 Pod 数相关的所有其他指南保持不变。
部署参数
用于在 AKS 中配置基本 Azure CNI 网络的部署参数都是有效的,但有两个例外:
- 现在,subnet 参数是指与群集节点有关的子网。
- 另一个参数 pod subnet 用于指定其 IP 地址将动态分配给 Pod 的子网。
配置 Pod 子网 - 动态 IP 分配和增强的子网支持 - Azure CLI
使用 Pod 子网 - 群集中的动态 IP 分配和增强子网支持类似于配置群集 Azure CNI 的默认方法。 以下示例逐步讲解如何创建包含节点子网和 Pod 子网的新虚拟网络,以及创建使用 Azure CNI Pod 子网的群集 - 动态 IP 分配和增强的子网支持。 确保用自己的值替换变量(如 $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 使用情况”的工作簿。
Azure CNI Pod 子网 - 动态 IP 分配和增强子网支持常见问题解答
能否将多个 Pod 子网分配给群集/节点池?
只能向群集或节点池分配一个子网。 但是,多个群集或节点池可以共享一个子网。
能否完全从不同的 VNet 分配 Pod 子网?
不可以,Pod 子网应与群集来自同一 VNet。
能否群集中的一些节点池使用传统的 CNI,而其他节点池使用新的 CNI?
整个群集只能使用一种类型的 CNI。
后续步骤
通过以下文章详细了解 AKS 中的网络: