1

环境准备

上一篇文章将 k8s 的网络插件改为 cilium 同时部署了观测平台 hubble,部署方式可参考上篇。

基于eBPF的k8s网络插件Cilium部署与流量治理浅尝

本篇讲一下 cilium的架构和数据流向的查看方式。首先,你需要一个kubernetes集群,并使用了 cilium 网络插件。

部署后可以看到,每个节点上都启动了一个cilium pod,还有一个cilium-operator,进到 cilium pod里,你可以使用 cilium cli工具。

2

cilium架构

Cilium的架构图如下所示。

Cilium Agent:以 DaemonSet 的方式运行在所有的节点上,负责 eBPF 程序的编辑和挂载,eBPF程序所需要的全局Maps 的初始化和维护以及 Pod 相关Maps 的创建和维护,同时负责 iptables 的初始化和维护。

Cilium Operator:负责 IPAM 的相关工作,主要是给主机节点分配 CIDR,给 Pod 分配 ip 地址由主机上的 Cilium Agent 来完成。

Cilium Cli:用来和本地的 Cilium Agent 通信,提供操作 Cilium 的能力。

3

数据流向查看

下面我们使用 cilium cli 工具查看一下数据是如何从 192.168.249.10 发送到192.168.249.12 上的 pod 10.0.0.23 里面的。

我们使用ciliummap命令,查看192.168.249.10 上的 cilium_ipcache,可以看到在 ebpf 的 map 中记录了,数据发送到10.0.0.23/32,可以通过endpoint 是192.168.249.12 的隧道发送。

然后查看192.168.249.12 上的cilium_ipcache,可以看到,发送给10.0.0.23/32 时经过的隧道 endpoint 是 0.0.0.0,说明这个 pod 在本节点上面。

继续查看 192.168.249.12 上的cilium_lxc,可以看到 10.0.0.23 的 mac 地址是 5A:xx,对应 node 上 lxc 的 mac 地址是 46:xx。

我们查看192.168.249.12上面的网络设备,可以看到 mac 地址为 46:xx 的 lxc 设备,该设备对端是 if9,也就是 pod 中的网卡设备,mac 地址应该是上面图中显示的 5A:xx。

这样,数据包就通过 eBPF 程序,从192.168.249.10 设备上发送到192.168.249.12 上的 pod 10.0.0.23 内部了。

点个赞

再走吧