在 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 策略实施已禁用。
网络策略不能使用
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 提供支持的 Azure CNI
注意
如果群集满足以下条件,则可以将现有 Azure CNI 群集升级为由 Cilium 提供支持的 Azure CNI:
- 群集使用具有动态 IP 分配的 Azure CNI。 这不包括 Azure CNI。
- 群集没有任何 Windows 节点池。
注意
使用其他网络策略引擎(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
自定义资源,而不使用 KubernetesNetworkPolicy
资源?CiliumNetworkPolicy
自定义资源不受官方支持。 我们建议客户使用 KubernetesNetworkPolicy
资源来配置网络策略。NetworkPolicy
具有允许 IP 地址的ipBlock
,为什么流量会被阻止?由 Cilium 提供支持的 Azure CNI 的限制是
NetworkPolicy
的ipBlock
无法选择 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 中也是如此。解决方法是,可以添加
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: {}
注意
目前无法指定具有
ipBlock
的NetworkPolicy
,以允许流量流向节点 IP。AKS 是否在 Cilium
daemonset
中配置 CPU 或内存限制?否,AKS 不会在 Cilium
daemonset
中配置 CPU 或内存限制,因为 Cilium 是 Pod 网络和网络策略强制实施的关键系统组件。
后续步骤
通过以下文章详细了解 AKS 中的网络: