在介绍CNI Chaining之前,我们先简单介绍一下Cilium。要说现在最火的容器网络,莫过于Cilium了。Cilium 是一个基于 eBPF 和 XDP 的高性能容器网络方案,代码开源在https://github.com/cilium/cilium。其主要功能特性包括
- 安全上,支持 L3/L4/L7 安全策略,这些策略按照使用方法又可以分为
- 基于身份的安全策略(security identity)
- 基于 CIDR 的安全策略
- 基于标签的安全策略
- 网络上,支持三层平面网络(flat layer 3 network),如
- 覆盖网络(Overlay),包括 VXLAN 和 Geneve 等
- Linux 路由网络,包括原生的 Linux 路由和云服务商的高级网络路由等
- 提供基于 BPF 的负载均衡
- 提供便利的监控和排错能力
此外最新版本的Cilium已经包含了Kube-proxy的功能。
CNI Chaining
今天我们试想一种场景:你的集群运行在公有云上,整个k8s的网络模型已经使用了公有云提供的ENI弹性网络,比如aws的aws-cni和阿里云的terway。ENI带给我们诸多好处,高性能,拉平了Pod网络。
但是我们却希望使用Cilium带来的高性能负载均衡和可观察性。
于是今天的主角CNI Chaining出场了。
CNI Chaining允许将Cilium与其他CNI插件结合使用。
通过Cilium CNI Chaining,基本网络连接和IP地址管理由非Cilium CNI插件管理,但是Cilium将BPF程序附加到由非Cilium插件创建的网络设备上,以提供L3/L4/L7网络可见性和策略强制执行和其他高级功能,例如透明加密。
目前Cilium支持与以下网络模型配合使用:
Cilium与AWS eni
接下来主要介绍如何与aws-cni结合设置Cilium。在这种混合模式下,aws-cni插件负责通过ENI设置虚拟网络设备以及地址分配(IPAM)。安装程序中,调用Cilium CNI插件将BPF程序附加到aws-cni设置的网络设备上,以实施网络策略,执行负载平衡和加密。
Cilium cli
使用Cilium后,不会再使用kube-proxy,它会从Kubernetes API服务器获得Service信息,并存入BPF。可以使用cilium命令行查看相关的信息。
如使用# cilium node list
查看当前的node节点信息,使用# cilium service list
查看service信息等。对于策略的获取,可以通过命令行# cilium policy get
,也可以通过Hubble UI查看,如下: