LoginSignup
3
1

More than 5 years have passed since last update.

KVM上でk8s+calicoをkubeadmで試そうとしてNATネットワーク内でのルーティングでハマる

Posted at

発端

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が便利過ぎ。
    • もし自分でビルドしてとかパッケージから入れてたら、ダメだった時点で心折れてたかも・・
3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1