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

本文介绍 Azure Kubernetes 服务 (AKS) 群集中 Azure CNI 覆盖层的设置过程、双堆栈网络配置和示例工作负荷部署。 有关 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 资源组。 如果需要创建资源组,请参阅 “创建资源组”。

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

Azure CNI 覆盖网络 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 采用以逗号分隔的无类 Inter-Domain 路由(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创建双堆栈 AKS 群集,其中参数--ip-families设置为ipv4,ipv6

    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"
    

    显示状态需要几分钟时间Registered

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

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

    az provider register --namespace Microsoft.ContainerService
    

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

  1. 使用以下命令创建具有 Azure CNI 覆盖层的 az aks create 群集:

    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 群集

在虚拟机节点上部署具有 IPv4/IPv6 地址的双堆栈 AKS CNI 覆盖群集。 此示例部署了一个 NGINX web 服务器,并使用带有 IPv4 和 IPv6 地址的 LoadBalancer 服务对外公开它。

注释

我们建议在 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. 在部署已经公开并且服务完全预配后,可以使用以下命令获取服务的 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 覆盖网络,请参阅以下文章: