Cilium 的 Host Firewall 功能
Cilium CNI 之前一直看文档,功能大概了解,eBPF也大略看过。但一直没有深入从代码角度去研究。它的 bpf 相关代码做的比较全,而且比较老,跟现在网上的 BCC, CO-RW 还不太一样,而且代码量又大,所以读起来并不容易。这次借着 Host Firewall 功能的探究,深入看下。不可能面面俱到,但尽量多涉及一些。这篇文章在后面可能会继续更新,如果有新的发现的话。 一些基本概念 Endpoint: 可以理解为跟 device 挂钩的概念(host, pod 等等),还有特殊的 health endpoint等等。Endpoint有ID,也有对应的 Identity 和自己的 Policy. Endpoint 是 Node Scope 的概念。 Identity: 跟 label 挂钩。同一个deploy的两个Pod, 有不同的endpoint,但有同样的 identity. K8s Node共用同样的 Identity. Cilium 的 NetworkPolicy 即是针对于 Identity的。这个很好理解,二者主要都是使用 label 来做 filter. 跟 Endpoint 不同, Identity 是 Cluster Scope 的概念(label当然跟node无关)。 KV Store: 用来存储一些映射关系。Labels, Identity, Address, Node等这些元素之间的各种映射关系。Cilium 要实现 NetworkPolicy, 那么就需要这些映射关系。比如 Address -> Identity 等等。 不同的 CNI 在架构方面的差别还是挺大的。比如 KV Store 的需求,有的 CNI 就完全不需要。对 Cilium 来说,当有新的 NetworkPolicy时, agent 来计算 NetworkPolicy,如果发现自己所在的 Node 上有 Endpoint 受影响,那么就需要对此 Endpoint 做一些 Update (Regenerate BPF Programs等等),其他的 Node 则不需要。不同的 agent 则依赖于 KV Store 来互相交换一些数据。 引用一篇架构图所示: ...