你当前正在访问 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
自定义资源,而不使用 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 中的网络: