译自:http://docs.cilium.io/en/stable/architecture/
本文档描述了Cilium的架构。它通过记录BPF数据路径(datapath)的钩子来实现Cilium数据路径,那么Cilium数据路径是如何与容器编排层继承,以及如何在各层(如BPF数据路径和Cilium代理)之间更新对象的?
Linux内核在网络栈中支持一个BPF钩子集,使用这些勾子可以允许BPF程序(即使用回调函数运行)。Cilium数据路径使用这些钩子加载BPF程序,当一起使用时,这些程序会创建更高级别的网络结构。
下面是Cilium使用的钩子列表以及简要概述。更详细的介绍可以参见BPF and XDP Reference Guide
将上述钩子与虚拟接口(cilium_host, cilium_net),可选的overlay接口(cilium_vxlan),Linux内核加密支持以及用户空间代理(Envoy)相结合,Cilium可以创建如下网络对象。
Cilium通过连接这些组件实现了灵活高效的数据路径。下面将展示连接单个节点上的endpoint可能存在的数据流(进入一个endpoint以及endpoint到网络设备)。在每种情况下,都会通过一个额外的图显示启用socket layer Enforcement时的可用的TCP加速路径。
首先展示的是本地endpoint到endpoint的数据流,在engress和ingress上使用了L7策略。紧跟着展示了启用socket layer Enforcement时相同endpoint到endpoint的数据流走向。通过对TCP流量启用socket layer Enforcement,发起连接的握手将遍历endpoint策略对象,直到TCP的状态变为ESTABLISHED。最后只有L7策略对象允许之后,连接状态才能变为ESTABLISHED。
下面展示了本地endpoint使用overlay网络进行出站的场景。overlay网络流量通过与overlay对应的Linux网络接口进行转发。默认的overlay接口称为cilium_vxlan。与上面类似,通过启用socket layer Enforcement并使用L7代理可以避免在TCP通信的endpoint和L7策略之间运行endpoint策略块。L3加密块可以在启用时加密报文。
最后展示了使用overlay网络时入站到endpoint的场景。与上面类似,通过启用socket layer Enforcement可以避免在代理和endpoint socket之间遍历策略集。如果接收到的报文被加密,则首先需要进行解密,并使用正常流程处理。
|基于ipvlan的数据路径目前仅在技术预览中,用于实验目的。该限制会在后续的Cilium发布中移除。
默认的Cilium CNI运行在基于veth的数据路径模式下,由于所有的BPF程序都由Cilium在主机网络命名空间之外进行管理,因此使用该模式可以获得更大的灵活性,这样容器就可以被授予其命名空间(如CAP_NET_ADMIN)的特权,而不会影响安全性(因为容器无法访问主机中的BPF enforcement点)。鉴于BPF程序是从主机的网络名称空间附加的,BPF也能够接管并有效地管理本地容器到主机之间的转发逻辑。但由于veth模式下,网络栈内部在处理从一个veth设备到位于另一个网络命名空间中的对端设备时需要重新遍历网络栈,因此会造成延迟。当在本地Cilium endpoint间进行通信时,这种出站到入站的转变需要执行两次,对于正在到达或从主机发送出去的数据包,则为一次。
对于更具延迟优化的数据路径,Cilium CNI还支持ipvlan L3/L3S模式,但存在大量限制。为了支持老的且不存在ipvlan发夹模式的内核,Cilium会在tc egress层将BPF程序附加到位于容器的网络命名空间内的slave设备上,意味着这种数据路径模式只能用于使用非CAP_NET_ADMIN 和CAP_NET_RAW特权运行的容器。ipvlan使用内部转发逻辑直接进行slave-to-slave或slave-to-master的重定向,因此BPF程序本身不会执行到设备的转发。由于网络栈不需要像基于veth的数据路径一样在处理外部报文时重新遍历,因此能够更有效地切换命名空间。主机到容器网络命名空间的切换直接发生在L3层,在后续的ingress处理中无需排队和重新调度。在本地endpoint之间通信的情况下,会执行一次egress-to-ingress的且华北,而不必执行两次。
目前的实现中,Cilium的ipvlan模式还有很多限制需要在接下来的工作中解决:目前还无法启用NAT64以及通过代理启用L7策略enforcement。当前未启用到本地endpoint的服务负载平衡以及容器到主机的本地通信。如果需要使用这些功能,仅以使用基于veth的数据路径模式。
Cilium的CNI ipvlan模式运行在Cilium daemon中,例如--datapath-mode=ipvlan --ipvlan-master-device=bond0
,后者通常指定了物理网络设备,同时也作为ipvlan的master设备。注意在ipvlan 数据路径模式在kubernetes中部署在L3S模式下。确保有一个稳定运行内核,包括以下ipvlan修复:d5256083f62e。
更多BPF的特性参见 BPF and XDP Reference Guide,可以在 Envoy 章节了解如何扩展L7策略。
所有创建的BPF映射都有上限限制。超出限制的插入将会失败,从而限制了数据路径的可伸缩性。下表展示了映射的默认值。每个限制都可以在源代码中进行修改,如果需要,可以根据请求添加配置选项。
Map Name | Scope | Default Limit | Scale Implications |
---|---|---|---|
Connection Tracking | node or endpoint | 1M TCP/256K UDP | Max 1M concurrent TCP connections, max 256K expected UDP answers |
Endpoints | node | 64k | Max 64k local endpoints + host IPs per node |
IP cache | node | 512K | Max 256K endpoints (IPv4+IPv6), max 512k endpoints (IPv4 or IPv6) across all clusters |
Load Balancer | node | 64k | Max 64k cumulative backends across all services across all clusters |
Policy | endpoint | 16k | Max 16k allowed identity + port + protocol pairs for specific endpoint |
Proxy Map | node | 512k | Max 512k concurrent redirected TCP connections to proxy |
Tunnel | node | 64k | Max 32k nodes (IPv4+IPv6) or 64k nodes (IPv4 or IPv6) across all clusters |
下图显示了kube-proxy安装的iptables规则和Cilium安装的iptables规则的集成。