在 Azure Kubernetes 服务 (AKS) 中配置 Azure CNI Powered by Cilium

由 Cilium 提供支持的 Azure CNI 将 Azure 容器网络接口(CNI)的可靠控制平面与 Cilium 的数据平面相结合,以提供高性能的网络和安全性。

由 Cilium 提供支持的 Azure CNI 利用加载到 Linux 内核中的 eBPF 程序以及更高效的 API 对象结构,提供以下优势:

  • 与现有 Azure CNI 和 Azure CNI 覆盖插件等效的功能
  • 改进了服务路由
  • 更有效的网络策略实施
  • 更好地观察群集流量
  • 支持更大的群集(更多节点、pod 和服务)

Azure CNI Powered by Cilium 的 IP 地址管理 (IPAM)

你可以将由 Cilium 提供支持的 Azure CNI 与三种 IP 地址管理(IPAM)选项配合使用:

对于大多数场景,建议使用 Azure CNI Overlay。 如果需要从连接的网络直接访问 Pod IP 地址,请使用 Azure CNI Pod 子网。 有关详细信息,请参阅 选择 AKS 的 IPAM 选项

支持的 Kubernetes 和 Cilium 版本

下表显示了每个 Kubernetes 版本的最低 Cilium 版本。 这些版本要求适用于使用由 Cilium 提供支持的 Azure CNI 的 AKS 自动群集和 AKS 标准群集。

Kubernetes 版本 Cilium 最低版本
1.31 (LTS) 1.16.19
1.32 (LTS) 1.17.18
1.33 (LTS) 1.17.18
1.34 1.18.12
1.35 1.18.12
1.36 1.19.6

有关 AKS 版本控制和发布时间线的详细信息,请参阅 支持的 Kubernetes 版本

使用 Cilium 实施网络策略

Cilium 实施网络策略来允许或拒绝 pod 之间的流量。 在 Cilium 中,无需安装单独的网络策略引擎,例如 Azure 网络策略管理器或 Calico。

本地重定向策略 (LRP)

本地重定向策略(LRP)将发往某个 IP 地址和端口或某个 Kubernetes 服务的 Pod 流量重定向到同一节点上的后端 Pod。

Kubernetes v1.29 及更高版本支持 LRP。 若要使 LRP 能与高级容器网络服务(ACNS)- FQDN 过滤一起工作,Cilium 网络策略的出口标签需要与节点本地 DNS 缓存 Pod 的标签匹配。

以下 CiliumLocalRedirectPolicy 会将发送到 kube-dns 服务的 DNS 流量重定向到同一节点上的 node-local DNS 缓存 Pod。 如果群集使用不同的 DNS 服务名称或命名空间,请更新 serviceNamenamespace 匹配群集。

apiVersion: cilium.io/v2
kind: CiliumLocalRedirectPolicy
metadata:
  name: dns-to-nodelocal
  namespace: kube-system
spec:
  redirectFrontend:
    serviceMatcher:
      serviceName: kube-dns
      namespace: kube-system
  redirectBackend:
    localEndpointSelector:
      matchLabels:
        k8s-app: node-local-dns
    toPorts:
      - port: "53"
        name: dns
        protocol: UDP
      - port: "53"
        name: dns-tcp
        protocol: TCP

以下代码片段显示了 toEndpoints 出口规则中的 CiliumNetworkPolicy 标签选择器,该规则必须与节点本地 DNS 缓存 Pod 上的标签匹配。

...
- matchLabels:
    io.kubernetes.pod.namespace: kube-system
    k8s-app: node-local-dns

限制

Azure由 Cilium 提供支持的 CNI 目前具有以下限制:

  • 仅适用于 Linux,不适用于 Windows。
  • 网络策略不能使用 ipBlock 来允许访问节点或 Pod IP。 有关详细信息和建议的解决方法,请参阅 常见问题
  • 对于 Cilium 版本 1.16 或更早版本,多个 Kubernetes 服务不能将同一主机端口与不同的协议(例如 TCP 或 UDP)(Cilium 问题 #14287) 配合使用。
  • 网络策略不会应用于使用主机网络(spec.hostNetwork: true)的 Pod,因为这些 Pod 使用主机标识而不是具有单个标识。
  • 阻止访问互联网或 Azure 服务的出站网络安全组(NSG)规则可能会导致无法导出 Cilium 诊断日志。 使用限制性出站策略的客户应允许流出到Azure Monitor服务标记,以确保适当的遥测、诊断和故障排除数据收集。
  • Kubernetes 版本 1.32 及更高版本中支持 Cilium 终结点切片。 Cilium 终结点切片不支持如何对 Cilium 终结点进行分组的配置。 不支持通过cilium.io/ces-namespace的优先级命名空间。
  • Cilium 使用 Cilium 身份作为用于预配端点的唯一身份标识,因此,像 Spark 作业这样频繁变动的工作负载会产生大量 Cilium 身份。 为了避免工作负荷达到 Cilium 标识限制(65535),可以在 Cilium configmap 中排除像 !spark-app-name!spark-app-selector 这样的 Spark 作业标签,以显著减少 Cilium 标识的生成。 有关 Cilium 标识排除规则的更多详细信息,请查看 官方 Cilium 标签文档

启用高级容器网络服务以实现可观测性和安全性

若要在群集上获取网络流量的可观测性以及基于完全限定域名(FQDN)的筛选和第 7 层网络策略等安全功能,请考虑在群集上启用 高级容器网络服务

先决条件

所需的Azure CLI版本因 IP 分配方法而异:

IP 分配方法 必需的Azure CLI版本
叠加网络 2.48.1 或更高版本
虚拟网络 2.48.1 或更高版本
节点子网 2.69.0 或更高版本

运行 az --version 查看当前安装的版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

  • 查看 AKS CNI 网络先决条件。 除非你使用网络隔离的群集,否则虚拟网络必须允许到所需终结点的出站连接。 地址范围不能与为 AKS 保留的地址范围或已连接的网络重叠,并且节点子网不能被委托。
  • 若要使用客户管理的子网,群集标识需要子网上的网络参与者权限或等效的自定义权限。 创建群集的用户必须有权创建所需的角色分配。 如果将网络安全组与子网相关联,请确保其规则允许所需的节点和 Pod 流量。

使用 Azure CNI Powered by Cilium 创建新的 AKS 群集

以下部分使用 az aks create 命令创建群集并分配 IP 地址。

选项 1:从覆盖网络分配 IP 地址

使用以下命令创建具有覆盖网络和 Cilium 的群集。 替换 <clusterName><resourceGroupName><location> 的值:

az aks create \
  --name <clusterName> \
  --resource-group <resourceGroupName> \
  --location <location> \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --pod-cidr 192.168.0.0/16 \
  --network-dataplane cilium \
  --generate-ssh-keys

--network-dataplane cilium 标志替换了早期版本的 aks-preview CLI 扩展中使用的已弃用 --enable-ebpf-dataplane 标志。

选项 2:从虚拟网络分配 IP 地址

运行以下命令创建资源组和虚拟网络,该虚拟网络包含一个节点子网和一个 Pod 子网。

# Create the resource group
az group create --name <resourceGroupName> --location <location>
# Create a virtual network with a subnet for nodes and a subnet for pods
az network vnet create \
  --resource-group <resourceGroupName> \
  --location <location> \
  --name <vnetName> \
  --address-prefixes <address prefix, example: 10.0.0.0/8> \
  -o none
az network vnet subnet create \
  --resource-group <resourceGroupName> \
  --vnet-name <vnetName> \
  --name nodesubnet \
  --address-prefixes <address prefix, example: 10.240.0.0/16> \
  -o none
az network vnet subnet create \
  --resource-group <resourceGroupName> \
  --vnet-name <vnetName> \
  --name podsubnet \
  --address-prefixes <address prefix, example: 10.241.0.0/16> \
  -o none

使用 az aks create 命令 --network-dataplane cilium 创建群集以指定 Cilium 数据平面。 将 <clusterName><resourceGroupName><location><subscriptionId><vnetName> 的值替换掉,并确保 --vnet-subnet-id--pod-subnet-id 的值指向上一步中创建的正确子网。

az aks create \
  --name <clusterName> \
  --resource-group <resourceGroupName> \
  --location <location> \
  --max-pods 250 \
  --network-plugin azure \
  --vnet-subnet-id /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/nodesubnet \
  --pod-subnet-id /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/podsubnet \
  --network-dataplane cilium \
  --generate-ssh-keys

选项 3:从节点子网分配 IP 地址

使用包含 Cilium 数据平面的 节点子网 创建群集:

az aks create \
  --name <clusterName> \
  --resource-group <resourceGroupName> \
  --location <location> \
  --network-plugin azure \
  --network-dataplane cilium \
  --generate-ssh-keys

常见问题解答

是否可以使用 CiliumNetworkPolicy 自定义资源而不是 Kubernetes NetworkPolicy 资源?

支持 L3 和 L4 CiliumNetworkPolicy ,可与 Kubernetes NetworkPolicy 资源一起使用。

客户可以使用 FQDN 筛选和第 7 层策略作为 高级容器网络服务 功能捆绑包的一部分。

是否可以使用 CiliumClusterwideNetworkPolicy

是的,由 Cilium 提供支持的 Azure CNI 支持 CiliumClusterwideNetworkPolicy

以下示例策略允许来自具有标签 role: frontend 的 Pod 的、通过 TCP 80 端口进入具有标签 role: backend 的 Pod 的入站流量。

apiVersion: "cilium.io/v2"
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: "l4-rule-ingress-backend-frontend"
spec:
  endpointSelector:
    matchLabels:
      role: backend
  ingress:
    - fromEndpoints:
        - matchLabels:
            role: frontend
      toPorts:
        - ports:
            - port: "80"
              protocol: TCP

Azure CNI Powered by Cilium 支持哪些 Cilium 功能? 哪些功能需要高级容器网络服务?

支持的功能 无 ACNS 借助 ACNS 要求和配置
Cilium 终结点切片 支持 ✔️ 支持 ✔️ 需要 Kubernetes 1.32 或更高版本。
Kubernetes 网络策略 支持 ✔️ 支持 ✔️ None.
本地重定向策略 支持 ✔️ 支持 ✔️ 需要 Kubernetes 1.29 或更高版本。
Cilium L3/L4 网络策略 支持 ✔️ 支持 ✔️ None.
Cilium 群集范围的网络策略 支持 ✔️ 支持 ✔️ None.
FQDN 筛选 不支持 ❌ 支持 ✔️ 需要 Kubernetes 1.29 或更高版本。 默认通过 ACNS 启用。
L7 网络策略 (HTTP/gRPC/Kafka) 不支持 ❌ 支持 ✔️ 需要 Kubernetes 1.29 或更高版本和 L7 高级网络策略选项。
容器网络可观测性(指标和流日志) 不支持 ❌ 支持 ✔️ 通过 ACNS 启用。
WireGuard 加密 不支持 ❌ 支持 ✔️ 要求在节点之间进行明确的 WireGuard 配置,并使用 UDP 端口 51871。
mTLS 加密 不支持 ❌ 在预览版中受支持 需要 Kubernetes 1.34 或更高版本、Cilium 1.18 或更高版本、预览注册和显式 mTLS 配置。
eBPF 主机路由 不支持 ❌ 支持 ✔️ 需要 Kubernetes 1.33 或更高版本、Azure CLI 2.71 或更高版本、Azure Linux 3.0 或 Ubuntu 24.04 以及显式BpfVeth配置。

有关特定于功能的设置说明和限制,请参阅 高级容器网络服务

是否可以修改 Cilium ConfigMap?

由 Cilium 支持的 Azure CNI 仅支持 label 排除。 此 ConfigMap 在kube-system命名空间中作为cilium-config存在。 标签的添加在群集重启、升级和对帐期间始终存在。 不支持更改 ConfigMap 中的其他值。

为什么当 NetworkPolicy 具有允许该 IP 地址的 ipBlock 时,流量会被阻止?

由 Cilium 提供支持的 Azure CNI 的一个限制是 NetworkPolicyipBlock 不能选择 Pod 或节点的 IP 地址。

例如,此 NetworkPolicy 具有一个 ipBlock,允许 0.0.0.0/0 的所有传出:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-ipblock
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - to:
      - ipBlock:
          cidr: 0.0.0.0/0 # This will still block pod and node IPs.

即使使用 cidr: 0.0.0.0/0,Cilium 也会阻止到 Pod 和节点 IP 的出站流量,因为 ipBlock 无法选择这些地址。

解决方法是,可以添加 namespaceSelectorpodSelector 以选择 pods。 此示例选择所有命名空间中的所有 Pod:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-ipblock
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - to:
      - ipBlock:
          cidr: 0.0.0.0/0
      - namespaceSelector: {}
      - podSelector: {}

目前无法指定NetworkPolicyipBlock以允许流量流向节点 IP。

AKS 是否针对 Cilium daemonset配置 CPU 或内存限制?

否,AKS 不会在 Cilium daemonset 中配置 CPU 或内存限制,因为 Cilium 是 Pod 网络和网络策略强制实施的关键系统组件。

由 Cilium 提供支持的 CNI Azure 是否使用 kube-proxy?

否,Cilium 作为网络数据平面创建的 AKS 群集不使用 kube-proxy

此行为适用于由 Cilium 提供支持Azure CNI 支持的所有 Kubernetes 版本,且没有单独的 AKS 版本约束。 数据平面升级仅在 Linux 群集上受支持,并且需要在更新期间禁用节点自动预配(NAP)。

如果将运行在 Azure CNI Overlay 上的 AKS 群集,或者运行 使用动态 IP 分配的 Azure CNI 的 AKS 群集,升级为运行由 Cilium 提供支持的 Azure CNI 的 AKS 群集,则新节点上的工作负载会在未使用 kube-proxy 的情况下创建。 作为此升级过程的一部分,现有节点上的工作负载也会被迁移,以便在没有 kube-proxy 的情况下运行。

由 Cilium 提供支持的 Azure CNI 是否支持 AKS 本地 DNS?

是的,网络策略必须显式允许 Pod 流出到 LocalDNS IP 地址。

以下策略允许流出到 UDP 上的 LocalDNS CIDR 169.254.10.0/24 和 TCP 端口 53 以及同 host 一端口上的实体。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "allow-azure-dns-egress"
  namespace: default
spec:
  endpointSelector:
    matchLabels: {} # This selects ALL pods in the namespace
  egress:
    - toCIDR:
        - 169.254.10.0/24
      toPorts:
        - ports:
            - port: "53"
              protocol: UDP
            - port: "53"
              protocol: TCP
    - toEntities:
        - host
      toPorts:
        - ports:
            - port: "53"
              protocol: UDP
            - port: "53"
              protocol: TCP

使用由 Cilium 提供支持的 Azure CNI 的双堆栈网络

你必须具有 Kubernetes 版本 1.29 或更高版本。

可以使用由 Cilium 支持的 Azure CNI 部署双堆栈 AKS 群集。 此功能还允许你使用 Cilium 网络策略引擎控制 IPv6 流量。

使用由 Cilium 提供支持的 Azure CNI 设置 Overlay 群集

通过 az aks create 命令使用 Azure CNI 覆盖创建群集。 请确保使用参数 --network-dataplane cilium 指定 Cilium 数据平面。

clusterName="myOverlayCluster"
resourceGroup="myResourceGroup"
location="westcentralus"

az aks create \
  --name $clusterName \
  --resource-group $resourceGroup \
  --location $location \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --network-dataplane cilium \
  --ip-families ipv4,ipv6 \
  --generate-ssh-keys

有关 AKS 网络的详细信息,请参阅以下资源: