你当前正在访问 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 提供支持的 Azure CNI
注意
如果群集满足以下条件,则可以将现有 Azure CNI 群集升级为由 Cilium 提供支持的 Azure CNI:
- 群集使用 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
注意
在 AKS 群集上启用由 Cilium 提供支持的 Azure CNI 后,无法禁用它。 如果要使用不同的网络数据平面,则必须创建新的 AKS 群集。
常见问题解答
是否可以自定义 Cilium 配置?
否,AKS 将管理 Cilium 配置,且无法修改配置。 我们建议需要更高控制度的客户使用 AKS BYO CNI 并手动安装 Cilium。
是否可以使用
CiliumNetworkPolicy
自定义资源,而不使用 KubernetesNetworkPolicy
资源?部分支持
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 的限制是
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 网络和网络策略强制实施的关键系统组件。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 中的网络: