配置 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 动态分配和增强版子网支持的群集中每个节点的最大 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 文件

  1. GitHub 下载或 grep 名为 container-azm-ms-agentconfig.yaml 的文件。

  2. 在集成中查找 azure_subnet_ip_usage。 将 enabled 设置为 true

  3. 保存文件。

获取 AKS 凭据

设置订阅、资源组和群集的变量。 请考虑以下示例:

az account set --subscription $SUBSCRIPTION
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME

应用配置

  1. 在保存了下载的 container-azm-ms-agentconfig.yaml 文件的文件夹中打开终端。

  2. 首先,使用以下命令来应用配置:kubectl apply -f container-azm-ms-agentconfig.yaml

  3. 这将重启 Pod,5-10 分钟后,指标将可见。

  4. 若要查看群集上的指标,请转到 Azure 门户群集页上的“工作簿”,找到名为“子网 IP 使用情况”的工作簿。 视图与以下内容类似:

    此图显示 Azure 门户的工作簿边栏选项卡,并显示 AKS 群集的子网 IP 使用情况的指标。

IP 地址动态分配和增强版子网支持常见问题解答

  • 能否将多个 Pod 子网分配给群集/节点池?

    只能向群集或节点池分配一个子网。 但是,多个群集或节点池可以共享一个子网。

  • 能否完全从不同的 VNet 分配 Pod 子网?

    不可以,Pod 子网应与群集来自同一 VNet。

  • 能否群集中的一些节点池使用传统的 CNI,而其他节点池使用新的 CNI?

    整个群集只能使用一种类型的 CNI。

后续步骤

通过以下文章详细了解 AKS 中的网络: