Cilium架构 (Cilium 2)

本文档描述了Cilium的架构。它通过记录BPF数据路径(datapath)的钩子来实现Cilium数据路径,那么Cilium数据路径是如何与容器编排层继承,以及如何在各层(如BPF数据路径和Cilium代理)之间更新对象的?

数据路径

Linux内核在网络栈中支持一个BPF钩子集,使用这些勾子可以允许BPF程序(即使用回调函数运行)。Cilium数据路径使用这些钩子加载BPF程序,当一起使用时,这些程序会创建更高级别的网络结构。

下面是Cilium使用的钩子列表以及简要概述。更详细的介绍可以参见

XDP:XDP BPF钩子最早可以在网络驱动中使用,在报文接收时触发BPF程序。由于BPF程序能够(在进行其他处理前)直接作用于报文数据,因此能够获取最好的报文处理性能。该钩子可用于过滤程序丢弃恶意的或非期望的流量,以及其他常见的DDOS防护机制。

Ingress/Egress流控:与XDP相同,附加到tc(traffic control) ingress钩子的BPF程序会附加到网络接口上,但是在网络栈完成初始的报文处理之后运行。该钩子在协议栈的L3层之前运行,但可以访问与报文相关的大多数元数据,适用于本地节点的处理,如配置L3/L4 endpoint策略以及限制达到endpoints的流量。对于面向设备的网络,tc ingress钩子可以与上面的XDP钩子耦合。完成该操作后,可以合理地假设此时的大多数流量是合法的,并且目的地是主机。

容器通常会使用一个虚拟设备,称为veth对,可以看作是连接容器和主机的虚拟线路。通过连接到这对veth的主机侧的TC ingress钩子,Cilium可以监控和对一个容器中存在的所有流量强制执行制订的策略(在主机侧监控和限制本机的容器的流量)。通过将一个BPF程序附加到与每个容器关联的veth对上,然后使用另外一个附加到tc ingress钩子上的BPF程序将所有网络流量路由到主机侧的虚拟设备上,这样Cilium也可以监控和对到达本节点或节点中存在的流量强制执行制订的策略(在容器侧监控和限制本机的流量)。

根据场景的需要,容器也可能使用ipvlan设备进行连接。这种模式下,主机的物理设备作为ipvlan的master,容器中的虚拟ipvlan设备被设置为slave模式。使用ipvlan而不是veth对的好处是可以减少网络栈将报文推送到位于另一个网络命名空间中的ipvlan slave所需要的资源,因此可以获得更好的延迟结果。为了使用Cilium配置L3/L4 endpoint策略,需要将用于tc的BPF程序附加到容器网络命名空间中的ipvlan slave设备的tc egress钩子上。例如,与在ipvlan master的tc ingress钩子上运行的另一个BPF程序相结合,这样也可以限制节点上的传入流量。

socket操作:socket操作钩子附加到一个特定的cgroup上,根据TCP时间运行。Cilium将BPF socket操作程序附加到根cgroup上,并使用该程序监控TCP状态变更,特别是对ESTABLISHED 状态变更。当一个socket转换为ESTABLISHED 状态,如果TCP socket的对端位于本地节点上(可能是本地代理),则会附加socket 发送/接受程序。

socket 发送/接收:当一个TCP socket执行发送操作时会运行socket 发送/接受钩子。此时,钩子或检查消息,最终会丢弃该消息,会将该消息发送到TCP层,会直接将该消息重定向到另外一个socket。如下所述,Cilium使用它来加速数据路径的重定向。

将上述钩子与虚拟接口(cilium_host, cilium_net),可选的overlay接口(cilium_vxlan),Linux内核加密支持以及用户空间代理(Envoy)相结合,Cilium可以创建如下网络对象。

预过滤(prefilter):预过滤对象会运行一个XDP程序,并提供一组预过滤规则来过滤网络上的流量来达到更好的性能。特别使用一组Cilium agent提供的CIDR映射来查找报文,如在目的地不是一个有效的endpoint时丢弃报文,或允许网络栈处理该报文。可以很容易通过扩展来构建一个新的预过滤标准/能力。

endpoint策略:endpoint策略对象实现了Cilium endpoint的执行方式。它使用一个映射来查找与身份相关的报文,且该层(layer)可以很好地扩展到多个endpoint。取决于本层的策略,可能会丢弃报文,转发到本地的endpoint或服务对象,或转发到L7策略对象,用于后续L7规则。它是Cilium数据路径中负责报文和身份映射以及执行L3和L4策略的主要对象。

服务(service):服务对象会根据该对象接收到的每个报文的目的IP(可能包含目的端口)来进行映射查找。如果找到一个匹配的表项,则将该报文转发到一个配置到的L3/L4 endpoint上。服务块可以使用TC ingress钩子在任何接口上实现一个独立的负载均衡,或集成到endpoint策略对象中。

L3加密:在ingress上,可以使用L3加密对象标识需要解密的报文,然后将报文传递到Linux xfrm(转换)层进行解密,在解密报文后,该对象会接受报文,然后将报文传递到网络栈,后续给其他对象进行处理。根据网络的模式(直接路由或overlay),可能是BPF尾部调用或将数据包传递到下一个对象的Linux路由栈。解密需要的密钥编码在IPsec首部,这样我们不需要在ingress上使用映射查找来定位解密密钥。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyzpx.html