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

Azure CNI Powered by Cilium 将 Azure CNI 的可靠控制平面与 Cilium 的数据平面相结合,以提供高性能网络和安全性。

Azure CNI Powered by Cilium 利用加载到 Linux 内核中的 eBPF 程序和更高效的 API 对象结构来提供以下优势:

  • 与现有 Azure CNI 和 Azure CNI 覆盖插件等效的功能

  • 改进了服务路由

  • 更有效的网络策略实施

  • 更好地观察群集流量

  • 支持更大的群集(更多节点、pod 和服务)

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

可以使用两种不同的 pod IP 分配方法部署 Azure CNI Powered by Cilium:

  • 从覆盖网络分配 IP 地址(类似于 Azure CNI 覆盖模式)

  • 从虚拟网络分配 IP 地址(类似于现有 Azure CNI 的动态 Pod IP 分配)

如果不确定选择哪个选项,请阅读 “选择要使用的网络模型”。

Versions

Kubernetes 版本 最低 Cilium 版本
1.29 (LTS) 1.14.19
1.30 1.14.19
1.31 1.16.6
1.32 1.17.0
1.33 1.17.0

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

网络策略实施

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

限制

Azure CNI Powered by Cilium 目前存在以下限制:

  • 仅适用于 Linux,不适用于 Windows。

  • 网络策略不能使用 ipBlock 来允许访问节点或 Pod IP。 有关详细信息和建议的解决方法,请参阅常见问题解答

  • 对于 Cilium 版本 1.16 或更早版本,多个 Kubernetes 服务不能将同一主机端口与不同的协议(例如 TCP 或 UDP)(Cilium 问题 #14287) 配合使用。

  • 网络策略不会应用于使用主机网络(spec.hostNetwork: true)的 Pod,因为这些 Pod 使用主机标识而不是具有单个标识。

  • Kubernetes 版本 1.32 及更高版本中支持 Cilium 终结点切片。 Cilium 终结点切片不支持对 Cilium 终结点的分组方式进行配置。 不支持通过 cilium.io/ces-namespace 实现优先级命名空间。

先决条件

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

  • 如果使用 ARM 模板或 REST API,则 AKS API 版本必须为 2022-09-02-preview 或更高。

注意

以前的 AKS API 版本(2022-09-02preview 至 2023-01-02preview)使用字段 networkProfile.ebpfDataplane=cilium。 自 2023-02-02preview 起的 AKS API 版本使用字段 networkProfile.networkDataplane=cilium 来启用由 Cilium 提供支持的 Azure CNI。

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

选项 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

使用 --network-dataplane cilium 创建群集:

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

常见问题解答

  • 是否可以自定义 Cilium 配置?

    否,AKS 将管理 Cilium 配置,且无法修改配置。 我们建议需要更高控制度的客户使用 AKS BYO CNI 并手动安装 Cilium。

  • 是否可以使用 CiliumClusterwideNetworkPolicy

    是的, CiliumClusterwideNetworkPolicy 受支持。 下面是一个示例 CCNP 策略 YAML。

    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 支持哪些 Cilium 功能? 其中哪项需要高级容器网络服务?

    支持的功能 无 ACNS 有 ACNS
    Cilium 终结点切片 ✔️ ✔️
    K8s 网络策略 ✔️ ✔️
    Cilium L3/L4 网络策略 ✔️ ✔️
    FQDN 域名过滤 ✔️
    L7 网络策略 (HTTP/gRPC/Kafka) ✔️
    容器网络可观测性(指标和流日志) ✔️
  • NetworkPolicy 具有允许 IP 地址的 ipBlock,为什么流量会被阻止

    Azure CNI Powered by Cilium 的限制是 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.
    

    但是,当应用此 NetworkPolicy 时,Cilium 阻止 Pod 和节点 IP 的流出量,即使 IP 位于 ipBlock CIDR 中也是如此。

    解决方法是,可以添加 namespaceSelectorpodSelector 以选择 Pod。 此示例选择所有命名空间中的所有 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 网络和网络策略强制实施的关键系统组件。

  • Azure CNI Powered by Cilium 是否使用 Kube-Proxy?

    否,使用网络数据平面创建的 AKS 群集(例如 Cilium)不使用 Kube-Proxy。 如果 AKS 群集位于 Azure CNI 覆盖层使用动态 IP 分配的 Azure CNI 上,并且已升级到运行 Azure CNI Powered by Cilium 的 AKS 群集,则会在没有 kube-proxy 的情况下创建新节点工作负载。 作为此升级过程的一部分,旧工作负载也会迁移,以便在没有 kube-proxy 的情况下运行。

后续步骤

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