在Calico方案中,IP数据包是被宿主机linux系统路由表和iptables进行路由转发和防火墙策略处理的。对于正在发送数据包的workload(workload,后面均使用英文原文),无论它的路由是如何配置的,Calico都确保将下一跳解析出来的是宿主机(Host)的MAC地址。对于寻址到一个workload的数据包,最后一跳是从目标workload所在宿主机到workload自身。
图:容器网络IP转发流程图
Calico数据路径:IP路由和iptables_第1张图片
假设workload的IPv4地址是从数据中心私有地址池10.65/16分配出来的,而宿主机使用172.18.203/24的地址段。你将在宿主机的路由表上看到以下类似信息:
图:Calico宿主机路由表信息
Calico数据路径:IP路由和iptables_第2张图片
在这台宿主机上有一个地址为10.65.0.24的workload,通过宿主机TAP接口tapa429fb36-04可达,之后就会存在一条下一跳为tapa429fb36-04去往10.65.0.24的直连路由。其他workload,如10.65.0.21、10.65.0.22、10.65.0.23则在部署在其它两台宿主机(172.18.203.126和129)上,所以去往这些workload的路由的下一跳是这两台宿主机。
Calico中有一个名字是Felix的代理,当被要求为一个特定workload提供连接时,它会在路由表中转载一个直连路由。然后,本机的BGP客户端(比如BIRD)会注意到它们,并将它们(可能通过路由反射器)宣告给运行在其他主机上的BGP客户端,继而非直连路由也会出现了。

安全隔离

上面的路由原则上允许数据中心中的任意一个workload与任何其他workload进行通信---但是通常操作人员会限制这种情况;比如将客户A的workload与客户B的workload相互隔离。因此Calico在每一台宿主机上运行iptables,指明每个workload能够发送和接收数据包的IP地址(以及可选端口等信息),这个设计是将workload X和workload Y之间的流量通过X的宿主机和Y的宿主机上的防火墙策略加以过滤,从而达到隔离的目的,这帮助让非期望流量远离数据中心核心网络,和作为一种备用的防御机制,让本地宿主机免于rogue workload的危害。

后续

关于静态数据路径的考虑,是的,它是一个对workload ARP请求应答内容的组合,包括宿主机MAC,IP路由和iptables。对路由的需求,安全信息如何管理,以及处理一些动态的事物,比如workload的迁移,Calico还有大量的工作需要去完成。但基本的数据路径实际上是很简单的。

原文地址:https://docs.projectcalico.org/master/reference/architecture/data-path