こんにちは。Kubernetes の季節が深まってまいりました。今回は実際に Service を立てて iptables を眺めてみました。
以下のページに従って Stateless な Service を立てます。
https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/
Service の ClusterIP によってアクセスできるようになった後は、オペレーションせずに iptables の様子を眺めることにしました。
元々、iptables では Calico や kube-proxy などによって様々な設定がなされています。以下は一例です。
- nat テーブル
- 既存の Pod に対する Masqarade や DNAT
- Pod 間の Node をまたいだ通信は Calico が制御していて、 IPIP トンネルが貼られている。
- Calico によって Pod から外への Masquerade が設定されている。
- 既存の Service の ClusterIP のプロキシ
- 既存の Pod に対する Masqarade や DNAT
- filter テーブル
- IPIP や VXLAN 関係のフィルタ
ここで新しい Pod を立てると、 kube-proxy によって新しい Pod に対して DNAT が設定されました。さらに、Service を立てると ClusterIP に LB が設定されている様子が分かりました。
-A KUBE-SVC-KEAUNL7... -m statistic --mode random --probability 0.20000000019 -j KUBE-SEP-QPLJF...
-A KUBE-SVC-KEAUNL7... -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-JIT5V...
-A KUBE-SVC-KEAUNL7... -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-4QJKS...
-A KUBE-SVC-KEAUNL7... -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-3WNIU...
-A KUBE-SVC-KEAUNL7... -j KUBE-SEP-H2HDG...
KUBE-SEP-...
内では各 Pod に向かって DNAT してます。また、KUBE-SEP-...
で mark をつけており、出ていくときは Masquerade でSNAT するようになっていました。` 内では
KUBE-MARK-MASQ
また、filter テーブルでは Calico による設定が追加されていました。
その後、丁寧に iptables を読んでいって本日は終わりました。iptables のルールは数百行ありましたが、コメントが多く付加されていたので苦労せずに読むことができました。
ちなみに先週は flannel がうまくいかずに時間を潰していました。これについては、Container Linux ではなく Ubuntu で動かしてみようと画策中です。