前回、KubernetesのDynamic PVのためにCephを試してみたのに続いて、今度はLoadBalancer serviceのためにMetalLBを試したい、そしてできればL2モードじゃなくてBGPモードで試したい、ということで、VyOSでBPGをやってみました。
目次
必要なもの
- virtualbox
- vagrant
- vagrant-vyosプラグイン
- Vagrantfile内で
config.vagrant.plugins
を指定してるのでvagrant upすればインストールされると思います。
- Vagrantfile内で
VMが6台ぐらい立ち上がるので多少はマシンパワー必要かもです。
構成
構成については以下を参考にさせてもらいました。
上記ではhigebuさんのvyos boxを使っていて1.1系なのだけど、ネットワークのお勉強のために以前に1.3系のvagrant box作ってルータ作ったりしたので1.3系でやってます。
1.3のvagrant boxはvagrant cloudに公開しているのでVagrantfileで参照するだけで使えます。1.2ぐらいからコマンドが結構変わってみたいなので、BGPの知識がないこともあって結構調べるのが大変だった(そして合っているか自信がないので、間違ってたら指摘してください)
あと、多少自分的にわかりやすいようにAS番号とかネットワークセグメントは変えてます。こんな感じ。
実際のルーティングも確認したいので各ルータのネットワーク内に端末をおきました。
使い方
Vagrantfileや各ルータのセットアップを行うスクリプトなどはGitHubで公開しています。
クローンします。
$ git clone https://github.com/kun432/vagrant-vyos-bgp-sample.git $ cd vagrant-vyos-bgp-sample
upします。普通にアップしてもいいんだけど、vagrantでvirtualbox providerの場合、シーケンシャルにしか起動しないので時間がかかる。並列でできるようにシェルスクリプトを書きました。中身は単純で、vm一覧を取得してxargsでvagrantに渡してるだけ。parallel増やすと並列度があがります。
#!/bin/bash parallel=3 subcmds="$@" vagrant status --machine-readable | \ perl -wnlaF"," -e 'print $F[1] if $F[2] =~ /metadata/;' | \ xargs -P${parallel} -I {} vagrant $subcmds {}
ということで、VM起動。
$ ./vagrant-ctrl.sh up
ルータ3台とPC3台が起動します。
$ vagrant status (snip) rt-1 running (virtualbox) rt-2 running (virtualbox) rt-3 running (virtualbox) pc-1 running (virtualbox) pc-2 running (virtualbox) pc-3 running (virtualbox) (snip)
ルータについてはscripts以下にあるスクリプトでセットアップしてます。rt-1の場合だとこういう感じ。
#!/bin/vbash source /opt/vyatta/etc/functions/script-template set interfaces loopback lo address 1.1.1.1/32 set protocols bgp 65001 neighbor 10.10.1.2 remote-as '65002' set protocols bgp 65001 neighbor 10.10.1.2 update-source '10.10.1.1' set protocols bgp 65001 address-family ipv4-unicast network '192.168.1.0/24' set protocols bgp 65001 parameters router-id '1.1.1.1' set protocols static route 192.168.1.0/24 blackhole distance '254' commit save
BGPの細かい設定の意味がまだよくわかってないけど、1.3の公式ドキュメントにあるサンプルをもとに作ってます。
vyos1.1の場合だとこんな感じらしい。
set protocols bgp 65001 neighbor 10.10.1.2 remote-as '65122' set protocols bgp 65001 neighbor 10.10.1.2 soft-reconfiguration inbound set protocols bgp 65001 neighbor 10.10.1.2 update-source '10.10.1.1' set protocols bgp 65001 network 11.11.11.11/32 set protocols bgp 65001 parameters router-id '1.1.1.1'
広報する自分のネットワークを設定する箇所は、1.1だと
set protocols bgp 65001 network 11.11.11.11/32
だけど、1.3ではエラーになるのでこうなる。
set protocols bgp 65001 address-family ipv4-unicast network '192.168.1.0/24'
あと、今回は指定していないけど、経路情報を保存しておく以下の設定についても、1.1ではこうだけど、
set protocols bgp 65001 neighbor 10.10.1.2 soft-reconfiguration inbound
1.3だとこうなるみたい。1.3の情報がほとんどないのでこの辺は苦しい。
set protocols bgp 65001 neighbor 10.10.1.2 address-family ipv4-unicast network soft-reconfiguration inbound
なにはともあれVMが上がってきたら疎通確認してみましょう。
vagrant@pc-1:~$ ping 192.168.2.11 PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data. 64 bytes from 192.168.2.11: icmp_seq=1 ttl=62 time=1.30 ms 64 bytes from 192.168.2.11: icmp_seq=2 ttl=62 time=1.42 ms 64 bytes from 192.168.2.11: icmp_seq=3 ttl=62 time=1.56 ms (snip) vagrant@pc-1:~$ ping 192.168.3.11 PING 192.168.3.11 (192.168.3.11) 56(84) bytes of data. 64 bytes from 192.168.3.11: icmp_seq=1 ttl=61 time=9.71 ms 64 bytes from 192.168.3.11: icmp_seq=2 ttl=61 time=2.14 ms 64 bytes from 192.168.3.11: icmp_seq=3 ttl=61 time=1.77 ms (snip)
vagrant@pc-2:~$ ping 192.168.1.11 PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data. 64 bytes from 192.168.1.11: icmp_seq=1 ttl=62 time=1.24 ms 64 bytes from 192.168.1.11: icmp_seq=2 ttl=62 time=1.75 ms 64 bytes from 192.168.1.11: icmp_seq=3 ttl=62 time=2.38 ms (snip) vagrant@pc-2:~$ ping 192.168.3.11 PING 192.168.3.11 (192.168.3.11) 56(84) bytes of data. 64 bytes from 192.168.3.11: icmp_seq=1 ttl=62 time=1.04 ms 64 bytes from 192.168.3.11: icmp_seq=2 ttl=62 time=1.40 ms 64 bytes from 192.168.3.11: icmp_seq=3 ttl=62 time=2.43 ms (snip)
vagrant@pc-3:~$ ping 192.168.1.11 PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data. 64 bytes from 192.168.1.11: icmp_seq=1 ttl=61 time=1.66 ms 64 bytes from 192.168.1.11: icmp_seq=2 ttl=61 time=2.38 ms 64 bytes from 192.168.1.11: icmp_seq=3 ttl=61 time=1.90 ms (snip) vagrant@pc-3:~$ ping 192.168.2.11 PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data. 64 bytes from 192.168.2.11: icmp_seq=1 ttl=62 time=1.43 ms 64 bytes from 192.168.2.11: icmp_seq=2 ttl=62 time=1.25 ms 64 bytes from 192.168.2.11: icmp_seq=3 ttl=62 time=1.44 ms 64 bytes from 192.168.2.11: icmp_seq=4 ttl=62 time=1.28 ms (snip)
各ルータは以下のネットワーク間の疎通はOKですね。では各ルータもみていきます。rt-1から。
vagrant@rt-1.internal:~$ show ip bgp BGP table version is 3, local router ID is 1.1.1.1, vrf id 0 Default local pref 100, local AS 65001 Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, i internal, r RIB-failure, S Stale, R Removed Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 192.168.1.0/24 0.0.0.0 0 32768 i *> 192.168.2.0/24 10.10.1.2 0 0 65002 i *> 192.168.3.0/24 10.10.1.2 0 65002 65003 i Displayed 3 routes and 3 total paths
rt-2, rt-3のネットワークがBGPで広報されているようです。そして実際のルーティングで、rt-2, rt-3のネットワークへの経路が10.10.1.2経由になっているのがわかりますね。
vagrant@rt-1.internal:~$ show ip route Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route S>* 0.0.0.0/0 [210/0] via 10.0.2.2, eth0, 03:31:36 C>* 1.1.1.1/32 is directly connected, lo, 03:30:27 C>* 10.0.2.0/24 is directly connected, eth0, 03:31:36 C>* 10.10.1.0/24 is directly connected, eth2, 03:30:31 S 192.168.1.0/24 [254/0] unreachable (blackhole), 03:30:27 C>* 192.168.1.0/24 is directly connected, eth1, 03:30:31 B>* 192.168.2.0/24 [20/0] via 10.10.1.2, eth2, 03:30:25 B>* 192.168.3.0/24 [20/0] via 10.10.1.2, eth2, 03:30:24
rt-2とrt-3も貼っときます。
vagrant@rt-2.internal:~$ show ip bgp BGP table version is 3, local router ID is 2.2.2.2, vrf id 0 Default local pref 100, local AS 65002 Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, i internal, r RIB-failure, S Stale, R Removed Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 192.168.1.0/24 10.10.1.1 0 0 65001 i *> 192.168.2.0/24 0.0.0.0 0 32768 i *> 192.168.3.0/24 10.10.2.2 0 0 65003 i Displayed 3 routes and 3 total paths vagrant@rt-2.internal:~$ show ip route Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route S>* 0.0.0.0/0 [210/0] via 10.0.2.2, eth0, 04:41:13 C>* 2.2.2.2/32 is directly connected, lo, 04:40:02 C>* 10.0.2.0/24 is directly connected, eth0, 04:41:13 C>* 10.10.1.0/24 is directly connected, eth2, 04:40:07 C>* 10.10.2.0/24 is directly connected, eth3, 04:40:06 B>* 192.168.1.0/24 [20/0] via 10.10.1.1, eth2, 04:39:58 S 192.168.2.0/24 [254/0] unreachable (blackhole), 04:40:01 C>* 192.168.2.0/24 is directly connected, eth1, 04:40:06 B>* 192.168.3.0/24 [20/0] via 10.10.2.2, eth3, 04:39:58
vagrant@rt-3.internal:~$ show ip bgp BGP table version is 3, local router ID is 3.3.3.3, vrf id 0 Default local pref 100, local AS 65003 Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, i internal, r RIB-failure, S Stale, R Removed Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 192.168.1.0/24 10.10.2.1 0 65002 65001 i *> 192.168.2.0/24 10.10.2.1 0 0 65002 i *> 192.168.3.0/24 0.0.0.0 0 32768 i Displayed 3 routes and 3 total paths vagrant@rt-3.internal:~$ show ip route Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route S>* 0.0.0.0/0 [210/0] via 10.0.2.2, eth0, 04:44:21 C>* 3.3.3.3/32 is directly connected, lo, 04:43:11 C>* 10.0.2.0/24 is directly connected, eth0, 04:44:21 C>* 10.10.2.0/24 is directly connected, eth2, 04:43:15 B>* 192.168.1.0/24 [20/0] via 10.10.2.1, eth2, 04:43:05 B>* 192.168.2.0/24 [20/0] via 10.10.2.1, eth2, 04:43:05 S 192.168.3.0/24 [254/0] unreachable (blackhole), 04:43:11 C>* 192.168.3.0/24 is directly connected, eth1, 04:43:15
一応やりたかったことはできてますかね。
まとめ
VyOSでBGPを試してみました。とりあえず雰囲気はつかめたかなぁというところ。ネットワーク、もう少しちゃんと勉強しないとダメですね。
次はいよいよMetalLBだ。