在 Azure Kubernetes 服务 (AKS) 中配置 Azure CNI 覆盖网络

本文介绍 Azure CNI 覆盖 AKS 群集的设置过程、双堆栈网络配置和示例工作负荷部署。 有关 Azure CNI 覆盖网络的概述,请参阅 Azure Kubernetes 服务(AKS)中的 Azure 容器网络接口(CNI)覆盖网络概述

重要

2025 年 11 月 30 日起,Azure Kubernetes 服务(AKS)不再支持或提供 Azure Linux 2.0 安全更新。 Azure Linux 2.0 节点映像在 202512.06.0 版中冻结。 从 2026 年 3 月 31 日开始,将删除节点映像,并且无法缩放节点池。 通过将 节点池升级到 受支持的 Kubernetes 版本或迁移到 osSku AzureLinux3,迁移到受支持的 Azure Linux 版本。 有关详细信息,请参阅 AKS 上的 Azure Linux 2.0 节点池

先决条件

  • 一份 Azure 订阅。 如果没有 Azure 订阅,可在开始前创建一个试用帐户
  • Azure CLI 2.48.0 或更高版本。 若要安装或升级 Azure CLI,请参阅 安装 Azure CLI
  • 现有的 Azure 资源组。 如果需要创建一个资源组,请参阅 “创建 Azure 资源组”。

对于双堆栈网络,需要 Kubernetes 1.26.3 或更高版本。

Azure CNI Overlay AKS 集群的关键参数

下表介绍了在 AKS 群集中配置 Azure CNI 覆盖网络的关键参数:

参数 Description
--network-plugin azure设为使用 Azure CNI 网络。
--network-plugin-mode overlay设置为以启用 Azure CNI 覆盖网络。 此设置仅在--network-plugin=azure时适用。
--pod-cidr 为群集指定自定义 Pod CIDR 块。 默认值为 10.244.0.0/16

默认网络插件行为取决于是否显式设置 --network-plugin

  • 如果未指定 --network-plugin,AKS 默认使用 Azure CNI Overlay。
  • 如果指定 --network-plugin=azure 并省略 --network-plugin-mode,AKS 会有意使用虚拟网络(节点子网)模式实现向后兼容性。

创建 Azure CNI 覆盖网络 AKS 群集

  • 使用az aks create命令和--network-plugin=azure--network-plugin-mode=overlay命令创建 Azure CNI 覆盖 AKS 群集。 如果未指定值 --pod-cidr,AKS 将分配默认值 10.244.0.0/16

    az aks create \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $REGION \
      --network-plugin azure \
      --network-plugin-mode overlay \
      --pod-cidr 192.168.0.0/16 \
      --generate-ssh-keys
    

将新节点池添加到专用子网

将节点池添加到同一虚拟网络的不同子网中,以控制 VM 节点的 IP 地址,从而管理发往虚拟网络或对等虚拟网络资源的网络流量。

  • 使用 az aks nodepool add 命令向群集添加新节点池,并使用参数指定子网资源 ID --vnet-subnet-id 。 例如:

    az aks nodepool add \
      --resource-group $RESOURCE_GROUP \
      --cluster-name $CLUSTER_NAME \
      --name $NODE_POOL_NAME \
      --node-count 1 \
      --mode system \
      --vnet-subnet-id $SUBNET_RESOURCE_ID
    

关于具有双堆栈网络的 Azure CNI 覆盖 AKS 群集

可以使用 Azure 虚拟网络在双堆栈模式下部署 Azure CNI 覆盖 AKS 群集。 在此配置中,节点从 Azure 虚拟网络子网接收 IPv4 和 IPv6 地址。 Pod 从与节点的 Azure 虚拟网络子网不同的地址空间接收 IPv4 和 IPv6 地址。 然后配置网络地址转换(NAT),以便 Pod 可以访问 Azure 虚拟网络上的资源。 流量的源 IP 地址通过 NAT 转换为同系列节点的主 IP 地址(IPv4 转换为 IPv4IPv6 转换为 IPv6)。

注释

还可以使用由 Cilium 提供支持的 Azure CNI 部署双堆栈网络群集。 有关详细信息,请参阅 由 Cilium 双堆栈网络提供支持的 Azure CNI

双堆栈网络限制

双堆栈网络不支持以下功能:

双堆栈网络的关键参数

下表介绍了在 Azure CNI 覆盖 AKS 群集中配置双堆栈网络的关键参数:

参数 Description
--ip-families 获取以逗号分隔的 IP 系列列表,以便在群集上启用。 仅支持 ipv4ipv4,ipv6
--pod-cidrs 采用以逗号分隔的 CIDR 表示法 IP 范围列表,从中分配 Pod IP。 此列表中范围的计数和顺序必须与提供给 --ip-families 的值匹配。 如果未提供任何值,则使用默认值 10.244.0.0/16,fd12:3456:789a::/64
--service-cidrs 采用以逗号分隔的 CIDR 表示法 IP 范围列表,以便从中分配服务 IP。 此列表中范围的计数和顺序必须与提供给 --ip-families 的值匹配。 如果未提供任何值,则使用默认值 10.0.0.0/16,fd12:3456:789a:1::/108 。 分配给 --service-cidrs 的 IPv6 子网不能大于 /108。

使用双堆栈网络创建 Azure CNI 覆盖 AKS 群集(Linux)

  1. 使用 az group create 命令为群集创建 Azure 资源组。

    az group create --location $REGION --name $RESOURCE_GROUP
    
  2. 使用 az aks create 参数设置为 --ip-familiesipv4,ipv6 命令创建双堆栈 AKS 群集。

    az aks create \
      --location $REGION \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --network-plugin azure \
      --network-plugin-mode overlay \
      --ip-families ipv4,ipv6 \
      --generate-ssh-keys
    

使用双堆栈网络创建 Azure CNI 覆盖 AKS 群集(Windows)

重要

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

在创建启用双栈网络和 Windows 节点池的 Azure CNI Overlay AKS 群集之前,需要安装 aks-preview Azure CLI 扩展并在订阅中注册 AzureOverlayDualStackPreview 功能标记。

安装 aks-preview Azure CLI 扩展

  1. 使用 aks-preview 命令安装 az extension add 扩展。

    az extension add --name aks-preview
    
  2. 使用 az extension update 命令更新到已发布的最新扩展版本。

    az extension update --name aks-preview
    

注册 AzureOverlayDualStackPreview 功能标志

  1. 使用 AzureOverlayDualStackPreview 命令注册 az feature register 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "AzureOverlayDualStackPreview"
    

    几分钟后,状态将显示为“已注册”

  2. 使用 az feature show 命令验证注册状态:

    az feature show --namespace "Microsoft.ContainerService" --name "AzureOverlayDualStackPreview"
    
  3. 当状态反映为已注册时,使用 命令刷新 az provider register 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

创建双堆栈 Azure CNI 覆盖 AKS 群集并添加 Windows 节点池

  1. 通过 az aks create 命令使用 Azure CNI 覆盖创建群集。

    az aks create \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $REGION \
      --network-plugin azure \
      --network-plugin-mode overlay \
      --ip-families ipv4,ipv6 \
      --generate-ssh-keys
    
  2. 使用 az aks nodepool add 命令将 Windows 节点池添加到群集。

    az aks nodepool add \
      --resource-group $RESOURCE_GROUP \
      --cluster-name $CLUSTER_NAME \
      --os-type Windows \
      --name $WINDOWS_NODE_POOL_NAME \
      --node-count 2
    

将示例工作负荷部署到 Azure CNI 覆盖 AKS 群集

在 VM 节点上部署具有 IPv4/IPv6 地址的双堆栈 AKS CNI 覆盖群集。 此示例中,通过服务 LoadBalancer 部署 NGINX web服务器,并用 IPv4 和 IPv6 地址公开。

注释

我们建议在 AKS 群集中的入口使用应用路由附加组件。 但是,出于演示目的,此示例在没有应用程序路由加载项的情况下部署 NGINX Web 服务器。 有关加载项的更多信息,请参阅 带有应用程序路由加载项的托管 NGINX 入口

使用 LoadBalancer 服务公开工作负荷

使用 kubectl 命令或 YAML 清单公开 NGINX 部署。

重要

AKS 中的 IPv6 服务目前有 两个限制

  • Azure 负载均衡器将运行状况探测从链接本地地址发送到 IPv6 目标。 在 Azure Linux 节点池中,无法将此流量路由到 pod,因此流量无法到达通过externalTrafficPolicy: Cluster部署的 IPv6 服务。
  • 必须使用 externalTrafficPolicy: Local 部署 IPv6 服务,这会导致 kube-proxy 对节点上的探测做出响应。
  1. 使用 kubectl expose deployment nginx 命令公开 NGINX 部署。

    kubectl expose deployment nginx --name=nginx-ipv4 --port=80 --type=LoadBalancer'
    kubectl expose deployment nginx --name=nginx-ipv6 --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilies": ["IPv6"]}}'
    

    输出应显示暴露的服务。 例如:

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. 公开部署并完全预配 LoadBalancer 服务后,使用 kubectl get services 命令获取服务的 IP 地址。

    kubectl get services
    

    输出应显示服务及其分配的 IP 地址。 例如:

    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx-ipv4   LoadBalancer   10.0.88.78               20.46.24.24         80:30652/TCP   97s
    nginx-ipv6   LoadBalancer   fd12:3456:789a:1::981a   2603:1030:8:5::2d   80:32002/TCP   63s
    
  3. 使用 kubectl get services 命令获取服务 IP,并将其设置为环境变量。

    SERVICE_IP=$(kubectl get services nginx-ipv6 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  4. 使用支持 IPv6 的主机发出的 curl 请求来验证功能。

    curl -s "http://[${SERVICE_IP}]" | head -n5
    

    输出应显示 NGINX 欢迎页 HTML。 例如:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    

若要详细了解 AKS 上的 Azure CNI 覆盖网络,请参阅以下文章: