(タイトルには誇張が入っています, わかる人だったら別に意外というわけではないかもしれません)
結論
長くなりそうなので結論だけ先に書いておきます:
- Kubernetes の CNI plugin の例として flannel や Calico, Cilium がある.
- これらの CNI plugin には VXLAN や BGP, ARP Proxy のネットワーク関連で既存の技術やプロトコルが使われている
- その他に eBPF という既存の技術を用いている例もある
Container Network Interface (CNI)
Kubernetes には Pod 間の通信を実現するためのインターフェースとして CNI という API インターフェースを備えています. その CNI を実装したソフトウェアを CNI plugin と言い, 現在では様々な実装があります. 有名どころで言うと, flannel, Calico, Cilium が有名どころとしてあげられます.
さて, そのような CNI plugin ですが, それぞれの実装に大きな違いがあるのでさくっと書こうと思います (本当はずらっと書きたかったけど面倒だったので…). それぞれのソフトウェアを使ったときのネットワークの特徴もあるのですがそこも省略させていただきます (ここが本来一番のネタになる部分なのですが, 時間の都合上省きます…)
flannel
ソースコード: https://github.com/flannel-io/flannel
OSI 参照モデルでは, L3 レベルの動作をするソフトウェアです. このソフトウェアに使われている技術として, VXLAN があります. VXLAN の説明はだるいので概要だけ説明すると, VLAN を拡張した技術だと考えれば大丈夫かと思います.
Calico
ソースコード: https://github.com/projectcalico/calico
OSI 参照モデルでは, L2, L3 レベルで動作をするソフトウェアですが, 機能追加が多く行われ, 今では flannel とほぼ同等の動作を行うことができるっぽいです (完全互換ではないので, 未確認ですが flannel でしか対応できないこともあるかもしれません). 機能追加で現在では様々な方法が使用できますが, 当初は BGP と ARP Proxy を用いたルーティングで通信を可能にしていました. 最近では, eBPF (説明は Cilium にて) にも対応してるらしいです, すごい.
ちなみに, Calico と flannel を合わせた Canal というソフトウェアもありますが, 現在では, 必要でない限り Calico で十分らしいです (公式ドキュメントより).
Cilium
ソースコード: https://github.com/cilium/cilium
OSI 参照モデルでは, L3 レベルで動作をするソフトウェアですが, なんやかんや L3 から L7 まで全部こなそうとしてるみたいです. このソフトウェアの大きな特徴と言えば eBPF を使ったルーティングや監視でしょうか.
eBPF とは Linux カーネルに使われている技術で, ユーザ空間のコードをカーネルレベルで動作させることを可能としています. これにより, OS を通さずにコードを実行できるので高速にコードを動作させることができます. 本来の仕様用途はネットワークのフィルタリングの動作を高速化するための仕組みで tcpdump はその使用例としてあげられます. この動作を逆手にとって CNI plugin にしているのは中々すごい.
また, Cilium は他にも Hubble や Tetragon などの eBPF を利用したソフトウェアも開発してるっぽいです.
最後に
CNI plugin の実装である flannel, Calico, Cilium を通して使われている技術を軽く説明しました. どの技術も昔から使われている技術であり, どの技術も今のインターネットには欠かせない技術です (どの技術 10 年以上の歴史があります). 古いと言ったら失礼ではあるかもしれませんが, 昔からある既存の技術を使って高速化を実現しているのは, 何かを考えたり作ったりする上で重要な考えだなあと個人的に感じました.
文献とか
CNI: https://www.cni.dev/
eBPF: https://ebpf.io/