発端
kubeadmでkubernetesをデプロイしてみようとインストールガイド、その他を見ながらチャレンジ。
参考1:https://kubernetes.io/docs/setup/independent/install-kubeadm/
参考2:https://qiita.com/k-srkw/items/7a4c6be6c3e3fbf3c23c
当初の環境
+------+ +------+ +------+
|Master| |node-1| |node-2|
+---+--+ +---+--+ +---+--+
|.9 |.65 |.66
+---+--------+--------+--+
| virbr0(deafult) | 192.168.122.0/24
+------------+-----------+
|.1
+------------+-----------+
| Host OS : Ubuntu 16.04 |
+------------------------+
シングルマスタ+ノード2台構成で構築。
kubeadmのデプロイの簡単さに驚愕しながらnginxをデプロイ。
参考3:https://qiita.com/mihirat/items/ebb0833d50c882398b0f
問題事象
kubectl expose deployment nginx --port 80 --external-ip 192.168.122.9
[root@k8s-master ~]# kubectl get services nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.99.238.250 192.168.122.9 80/TCP 12s
[root@k8s-master ~]# curl 192.168.122.9
を打つも応答なし・・・タイムアウトしてる。
切り分け
Deployやexposeに誤りがあるのかと、小一時間色々とやり直したり。
どうもそういう問題でなさそうな気がするのでtcpdump
で切り分け実施。
masterとnginxのpodsが上がっているVMでtcpdump。
master上でのキャプチャ結果(ログ残ってなかったのでイメージ)
01:53:41.775515 IP 192.168.122.9.49240 > 10.244.2.2.http: Flags [S], seq 1831094493, win 43690, options [mss 65495,sackOK,TS val 2867936 ecr 0,nop,wscale 7], length 0
node上でのキャプチャ結果
01:53:41.775515 IP 192.168.122.1.49240 > 10.244.2.2.http: Flags [S], seq 1831094493, win 43690, options [mss 65495,sackOK,TS val 2867936 ecr 0,nop,wscale 7], length 0
01:53:41.775609 IP 192.168.122.66.49240 > 10.244.2.2.http: Flags [S], seq 1831094493, win 43690, options [mss 65495,sackOK,TS val 2867936 ecr 0,nop,wscale 7], length 0
なぜかnodeに来るときにsourceIPが変わっている。.1ってHostのIPなのになぜ・・・
しばし謎でしたがどう見てもSNATがかかってるのでもしやと・・・
10.x.0.1 10.x.1.1 10.x.2.2
+------+ +------+ +------+
|Master| |node-1| |node-2|
+---+--+ +---+--+ +---+--+
|.9 |.65 |.66
+---+--------+--------+--+
| virbr0(deafult) | 192.168.122.0/24
+------------+-----------+
|.1
+------------+-----------+
| Host OS : Ubuntu 16.04 |
+------------------------+
ちゃんとiptablesがどういう設定されていたかは読んではないですが、Master->Nodeの通信でvirbr0を通りつつ、virbr0以外の宛先アドレスであるがためにブリッジ内でSNATをかけていた模様・・
下記構成のようにVMアクセス用ブリッジと、k8s内通信用ブリッジを分けることによりめでたく、k8sでの疎通確認ができました。
参考4:https://libvirt.org/formatnetwork.html#examplesPrivate
10.x.0.1 10.x.1.1 10.x.2.2
+------+ +------+ +------+
|Master| |node-1| |node-2|
+-+-+--+ +-+-+--+ +-+-+--+
| |.9 | |.65 | |.66
+---+--------+--------+--+
+-| br-new | 172.30.0.0/24(Isolated)
| +------------+-----------+
+ -----------+-----------+ 192.168.122.0/24(Deafult/NAT)
|
+------------+-----------+
| Host OS : Ubuntu 16.04 |
+------------------------+
教訓とまとめ
- KVMというか、iptablesの仕様(というか書き方?)により必ずしもHOST OS側IFの外へ出て行くものだけがNATかかるわけではない
- k8s/calicoに限らず、L3ルーティングするもののお試しに、KVMデフォルトのNAT networkはダメ・ゼッタイ
- 環境の組み直しなどを何度もしましたけど、kubeadmが便利過ぎ。
- もし自分でビルドしてとかパッケージから入れてたら、ダメだった時点で心折れてたかも・・