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 の設定を行う。
f:id:aaabbb_200904:20180514002620p:plain

この設定により、該当の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 で実施
f:id:aaabbb_200904:20180514002644p:plain
この変更により、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
/ # 

パッケージアップデートなどで、仮想ネットワーク内から、直接インターネットに出る必要がある場合などに使用出来る。