gatewayless, distributed snat
Tungsten Fabric の4.1 以降では、gatewayless という機能が加わっている。
https://github.com/Juniper/contrail-specs/blob/master/gateway-less-forwarding.md
通常、Tungsten Fabric では、外部とのアクセスを行うためにはexternal router (L3VPNの機能が必要) を使う必要があるのだが、gatewayless の機能を使うと、上記の機能を持つルーターが無くとも、直接外部とのやり取りを行うことができるようになる。
設定方法としては、k8s でインストールを行った後、仮想ネットワーク (以下では、k8s-default-pod-network) に対して、 Advanced Options > IP Fabric Forwarding の設定を行う。
この設定により、該当のVN上の pod から、computeと同じサブネットにあるノードに対して、pingが届くようになっていることを確認できる。
※ aws上で試す場合、EC2メニューの、ネットワークインターフェースで、送信元/送信先の変更チェック、を無効にする必要があった。
(pod: 10.47.255.251からpingを発行) / # ping 172.31.8.163 [root@ip-172-31-8-163 ~]# tcpdump -i eth0 -n icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 14:34:58.240730 IP 10.47.255.251 > 172.31.8.163: ICMP echo request, id 62208, seq 301, length 64 14:34:58.240762 IP 172.31.8.163 > 10.47.255.251: ICMP echo reply, id 62208, seq 301, length 64 14:34:59.240821 IP 10.47.255.251 > 172.31.8.163: ICMP echo request, id 62208, seq 302, length 64 14:34:59.240850 IP 172.31.8.163 > 10.47.255.251: ICMP echo reply, id 62208, seq 302, length 64 14:35:00.240955 IP 10.47.255.251 > 172.31.8.163: ICMP echo request, id 62208, seq 303, length 64 14:35:00.240991 IP 172.31.8.163 > 10.47.255.251: ICMP echo reply, id 62208, seq 303, length 64 (snip)
また、以下のように、pingを受けるノードに static routeを定義することで、pingが戻ってくることも確認できた。
※ ip は、それぞれ、 172.31.8.163: master, 172.31.6.88: slave (pingを発行しているpodが稼働している) となる
[root@ip-172-31-8-163 ~]# route add -host 10.47.255.251 gw 172.31.6.88 [root@ip-172-31-8-163 ~]# / # ping 172.31.8.163 PING 172.31.8.163 (172.31.8.163): 56 data bytes 64 bytes from 172.31.8.163: seq=0 ttl=63 time=0.629 ms 64 bytes from 172.31.8.163: seq=1 ttl=63 time=0.465 ms ^C --- 172.31.8.163 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.465/0.547/0.629 ms / #
また、5.0以降のバージョンでは、仮想ネットワークからの通信に対して、computeのipへのSNATを行い、直接外部への通信を行わせる仕組みが追加されている。
https://github.com/Juniper/contrail-specs/blob/master/distributed-snat.md
こちらの機能を有効化する場合、仮想ネットワークで、Advanced Options > SNAT の有効化、を行う。
※ 例では、default-k8s-pod-network で実施
この変更により、pod内のcirrosから、直接computeから到達できるip (例では 8.8.8.8) にpingが飛ぶようになる。
/ # ip -o a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1\ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 1: lo inet6 ::1/128 scope host \ valid_lft forever preferred_lft forever 13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue \ link/ether 02:f3:18:5d:a4:56 brd ff:ff:ff:ff:ff:ff 13: eth0 inet 10.47.255.251/12 scope global eth0\ valid_lft forever preferred_lft forever 13: eth0 inet6 fe80::e860:76ff:fedb:e0e2/64 scope link \ valid_lft forever preferred_lft forever / # / # / # ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=48 time=1.951 ms 64 bytes from 8.8.8.8: seq=1 ttl=48 time=1.740 ms ^C --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 1.740/1.845/1.951 ms / #
パッケージアップデートなどで、仮想ネットワーク内から、直接インターネットに出る必要がある場合などに使用出来る。