你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 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 分配)

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

网络策略实施

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

限制

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

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

  • Cilium L7 策略实施已禁用。

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

  • 多个 Kubernetes 服务不能使用协议不同(例如 TCP 或 UDP)的同一个主机端口(Cilium 问题 #14287)。

  • 当 pod 通过服务群集 IP 连接到自身时,可能会对回复数据包实施网络策略(Cilium 问题 #19406)。

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

先决条件

  • 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。

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

    部分支持 CiliumNetworkPolicy 自定义资源。 客户可将 FQDN 筛选用作高级容器网络服务功能捆绑的一部分。

    CiliumNetworkPolicy 示例演示了与指定标签匹配的服务的示例匹配模式。

    apiVersion: "cilium.io/v2"
    kind: CiliumNetworkPolicy
    metadata:
      name: "example-fqdn"
    spec:
      endpointSelector:
        matchLabels:
          foo: bar
      egress:
      - toFQDNs:
        - matchPattern: "*.example.com"
    
  • 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.
    

    但是,当应用此 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: {}
    

    注意

    目前无法指定具有 ipBlockNetworkPolicy,以允许流量流向节点 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 中的网络: