VXLAN を cloud-init で構成する
VXLAN の構成を自動化したい
Ubuntu Server 20.04 で VXLAN を構成する では、VXLAN の構成が再起動しても維持されるよう各種 script を配置していました。
ただ、それでもそもそもこれらの script を配置するにあたっては SSH などでログインしてのオペレーションが前提となっていたため、これを cloud-init
を利用して自動化します。
cloud-init
でファイルを作成する方法
cloud-init
でファイルを作成する方法は runcmd
で echo
を実行するなどの方法があるようでしたが、それように用意された write_files
module を素直に使っていきます。
たとえば最初の /etc/networkd-dispatcher/routable.d/50-ifup-hooks
を作成する部分は以下のように書くことができます。
#cloud-config
write_files:
- path: /etc/networkd-dispatcher/routable.d/50-ifup-hooks
content: |
#!/bin/sh
for d in up post-up; do
hookdir=/etc/network/if-${d}.d
[ -e $hookdir ] && /bin/run-parts $hookdir
done
exit 0
これを 3 ファイル分記述し、そのうえで permission を変更します。
実際の反映にもさまざまな方法があるとは思いますが、ここではシンプルに VM を再起動します。
cloud-init
のファイル
完成した packages_update
や packages_upgrade
module は定番として、前述のとおり write_files
module を使ってファイルを作成します。
そのうえで、runcmd
で permission の変更と、最後に reboot
します。
#cloud-config
packages_update: true
packages_upgrade: true
write_files:
- path: /etc/networkd-dispatcher/routable.d/50-ifup-hooks
content: |
#!/bin/sh
for d in up post-up; do
hookdir=/etc/network/if-${d}.d
[ -e $hookdir ] && /bin/run-parts $hookdir
done
exit 0
- path: /etc/networkd-dispatcher/off.d/50-ifdown-hooks
content: |
#!/bin/sh
for d in down post-down; do
hookdir=/etc/network/if-${d}.d
[ -e $hookdir ] && /bin/run-parts $hookdir
done
exit 0
- path: /etc/network/if-post-up.d/vxlan
content: |
#!/bin/sh
if [ "$IFACE" = "eth0" ]; then
ip link add vxlan0 type vxlan id 77 remote 10.0.0.4 dstport 4789 dev eth0
ip link set up vxlan0
ip address add 169.254.0.2/24 dev vxlan0
fi
runcmd:
- chmod +x /etc/networkd-dispatcher/routable.d/50-ifup-hooks
- chmod +x /etc/networkd-dispatcher/off.d/50-ifdown-hooks
- mkdir -p /etc/network/if-post-up.d
- chmod u+x /etc/network/if-post-up.d/vxlan
- reboot
動作確認
まずは VXLAN を使わず、VNet の IP アドレスを使って通信確認します。
ikko@vm-hub00:~$ ping -c 4 10.10.0.4
PING 10.10.0.4 (10.10.0.4) 56(84) bytes of data.
64 bytes from 10.10.0.4: icmp_seq=1 ttl=64 time=1.49 ms
64 bytes from 10.10.0.4: icmp_seq=2 ttl=64 time=1.34 ms
64 bytes from 10.10.0.4: icmp_seq=3 ttl=64 time=1.56 ms
64 bytes from 10.10.0.4: icmp_seq=4 ttl=64 time=1.27 ms
--- 10.10.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.271/1.415/1.559/0.116 ms
vxlan0
が正常に生えていることを確認します。
IP アドレスとして 169.254.0.1 が設定されてることも確認します。
ikko@vm-hub00:~$ ip -d link show vxlan0
3: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether b2:ac:1c:29:e7:0b brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535
vxlan id 77 remote 10.10.0.4 dev eth0 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 62780 gso_max_segs 65535
そのうえで、対向の VM に設定されている 169.254.0.2 への ping
で通信確認します。
ikko@vm-hub00:~$ ping -c 4 169.254.0.2
PING 169.254.0.2 (169.254.0.2) 56(84) bytes of data.
64 bytes from 169.254.0.2: icmp_seq=1 ttl=64 time=1.10 ms
64 bytes from 169.254.0.2: icmp_seq=2 ttl=64 time=1.03 ms
64 bytes from 169.254.0.2: icmp_seq=3 ttl=64 time=1.51 ms
64 bytes from 169.254.0.2: icmp_seq=4 ttl=64 time=1.20 ms
--- 169.254.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.028/1.209/1.505/0.181 ms
うまくいきました、めでたしめでたし。
参考
- もともとの記事はこちら
-
cloud-init
の module 群の reference
Discussion