kubernetes 集群中 cilium 的实践及其网络通信解析

Cilium 是一个基于 eBPF 和 XDP 的高性能容器网络方案的开源项目,目标是为微服务环境提供网络、负载均衡、安全功能,主要定位是容器平台。

Why Cilium ?

现在应用程序服务的发展已从单体结构转变为微服务架构,微服务间的的通信通常使用轻量级的 /cilium/hubble

hubble 是一个用于云原生工作负载的完全分布式网络和安全可视化平台。它建立在 Cilium 和 eBPF 的基础上,以完全透明的方式深入了解服务以及网络基础结构的通信和行为。

hubble 对前面安装的测试用例监控信息

cilium 在 kubernetes 集群中安装好后,此处我们来探究一下在不同 node 上 pod 间的 vxlan 通信方式。

cilium 安装完后,cilium agent 会在 node 上创建 cilium_net 与 cilium_host 一对 veth pair 及用于跨宿主机通信的 cilium_vxlan ,然后在 cilium_host 上配置其管理的 CIDR IP 作为网关。

如上图示中,通过抓包分析 Container A 与 Container B 之前的通信路径。

Container A ping Container B (以下称 Container A -> CA , Container B -> CB)

进入 Node01 上 CA 内 (10.244.1.154),ping CB ip 地址 10.224.6.11

进入 Node01 上 cilium agent 容器内,查看 CA 容器作为 cilium endpoint 的信息

CA 容器 ping 出的 icmp 包将会经过网卡 lxc8b528e748ff4 (lxcxxA) 路由到 cilium_host 网关,路由方式与传统的通过 Linux bridge 这样的二层设备转发不一样,cilium 在每个容器相关联的虚拟网卡上都附加了 bpf 程序,通过连接到 TC ( traffic control ) 入口钩子的 bpf 程序将所有网络流量路由到主机端虚拟设备上,由此 cilium 便可以监视和执行有关进出节点的所有流量的策略,例如 pod 内的 networkPolicy 、L7 policy、加密等规则。

CA 容器内的流量要跨宿主机节点路由到 CB 容器,则需要 cilium_vxlan VTEP 设备对流量包进行封装转发到 Node02 上。bpf 程序会查询 tunnel 规则并将流量发送给 cilium_vxlan ,在 cilium agent 容器内可查看到 bpf 的 tunnel 规则

在 Node01 上对 cilium_vxlan 抓包,可看到 CA 容器对 icmp 包经过了 cilium_vxlan

再对 Node01 上的 eth0 抓包,可看到 cilium_vxlan 已将 CA 的流量进行 vxlan 封包,src ip 改为本机 node ip 192.168.66.226, dst ip 改为 192.168.66.221

到 Node02 上对 eth0 抓包,可看到 CA 容器的流量包已到 Node02 上

对 cilium_vxlan 抓包即可看到 CA 容器过来对流量包已被解封

至此,CA 容器对流量已到达 cilium 创建的虚拟网卡。

我们知道 Linux 内核本质上是事件驱动的(the Linux Kernel is fundamentally event-driven), cilium 创建的虚拟网卡接收到流量包将会触发连接到 TC ( traffic control ) ingress 钩子的 bpf 程序,对流量包进行相关策略对处理。

查看 cilium 官方给出的 ingress/egress datapath,可大致验证上述 cilium 的网络通信路径。

首先是 egress datapath ,图中橙黄色标签为 cilium component,有 cilium 在宿主机上创建的 bpf 程序(对应着红色标签的 kernel bpf 钩子),若使用 L7 Policy 则还有 cilium 创建的 iptables 规则。流量从某个容器 endpoint 通过容器上的 veth pair 网卡 lxcxxx 出发,即会触发 bpf_sockops.c / bpf_redir.c bpf 程序,若使用了 L7 Policy 则进入用户空间进行 L7 层的数据处理,若没有使能 L7 Policy 则将触发 TC egress 钩子,bpf_lxc 对数据进行处理(若使能 L3 加密,则触发其他 bpf 钩子),数据最终被路由到 cilium_hos t 网关处,再根据 overlay 模式(vxlan 等)将数据发送出去。

在 cilium ingress datapath 中,数据流量进入主机网络设备上,cilium 可根据相关配置,对数据流量进行预处理(prefilter/L3 加解密/ 负载均衡/ L7 Policy 处理)或直接路由到 cilium_host 触发相应到 bpf 程序,再到最终的 endpoint 处。