在 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 覆盖模式)

网络策略实施

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

限制

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

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

  • Cilium L7 策略实施已禁用。

  • Hubble 已禁用。

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

  • 不支持设置为 internalTrafficPolicy=Local 的 Kubernetes 服务(Cilium 问题 #17796)。

  • 多个 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 提供支持的 Azure CNI

注意

如果群集满足以下条件,则可以将现有 Azure CNI 群集升级为由 Cilium 提供支持的 Azure CNI:

注意

使用其他网络策略引擎(Azure NPM 或 Calico)在群集中启用 Cilium 时,将卸载网络策略引擎并将其替换为 Cilium。 有关详细信息,请参阅“卸载 Azure 网络策略管理器或 Calico”。

警告

升级过程将触发每个节点池同时重新映像。 不支持单独升级每个节点池。 群集网络的任何中断会类似于节点映像升级或 Kubernetes 版本升级,其中节点池中的每个节点会重新映像。 Cilium 将仅在所有节点重新映像后开始强制实施网络策略。

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

使用以下命令将现有群集升级到由 Cilium 提供支持的 Azure CNI。 替换 <clusterName><resourceGroupName> 的值:

az aks update --name <clusterName> --resource-group <resourceGroupName> \
  --network-dataplane cilium

常见问题

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

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

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

    CiliumNetworkPolicy 自定义资源不受官方支持。 我们建议客户使用 Kubernetes NetworkPolicy 资源来配置网络策略。

  • 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 网络和网络策略强制实施的关键系统组件。

后续步骤

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