由 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,用于分配 Pod IP:
- 从覆盖网络分配 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的优先级命名空间。 - L7 策略不被
CiliumClusterwideNetworkPolicy(CCNP)支持。
先决条件
- Azure CLI 2.48.1 或更高版本。 运行
az --version查看当前安装的版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。 - 如果使用 ARM 模板或 REST API,则 AKS API 版本必须是
2022-09-02-preview或更高版本。
以前的 AKS API 版本(2022-09-02preview to 2023-01-02preview)使用了该字段 networkProfile.ebpfDataplane=cilium。 AKS API 版本自 2023-02-02preview 起使用字段 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受支持。 以下示例策略 YAML 演示如何配置 L4 规则: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: TCPAzure 托管 CNI 支持哪些 Cilium 功能? 其中哪项需要高级容器网络服务?
支持的功能 无 ACNS 有 ACNS Cilium 终结点切片 ✔️ ✔️ K8s 网络策略 ✔️ ✔️ Cilium L3/L4 网络策略 ✔️ ✔️ Cilium 群集范围的网络策略 ✔️ ✔️ FQDN 域名过滤 ❌ ✔️ L7 网络策略 (HTTP/gRPC/Kafka) ❌ ✔️ 容器网络可观测性(指标和流日志) ❌ ✔️ eBPF 主机路由 ❌ ✔️ 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 位于ipBlockCIDR 中也是如此。解决方法是,可以添加
namespaceSelector和podSelector以选择 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: {}目前无法指定
NetworkPolicy和ipBlock以允许流量流向节点 IP。AKS 是否在 Cilium
daemonset中配置 CPU 或内存限制?否,AKS 不会在 Cilium
daemonset中配置 CPU 或内存限制,因为 Cilium 是 Pod 网络和网络策略强制实施的关键系统组件。由 Cilium 提供支持的 Azure CNI 是否使用 kube-proxy?
否,Cilium 作为网络数据平面创建的 AKS 群集不使用
kube-proxy。 如果 AKS 群集位于 Azure CNI Overlay 或 具有动态 IP 分配的 Azure CNI 上,并且升级到由 Cilium 提供支持的 Azure CNI 运行的 AKS 群集,则不会创建新的节点工作负荷kube-proxy。 旧的工作负载也会被迁移以无kube-proxy的方式运行,这是此次升级过程的一部分。
使用由 Cilium 提供支持的 Azure CNI 的双堆栈网络
可以使用由 Cilium 支持的 Azure CNI 部署双堆栈 AKS 群集。 此功能还允许你使用 Cilium 网络策略引擎控制 IPv6 流量。
你必须具有 Kubernetes 版本 1.29 或更高版本。
使用由 Cilium 提供支持的 Azure CNI 设置 Overlay 群集
使用 [az aks create][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 中的网络: