😎

VXLAN を cloud-init で構成する

2022/10/10に公開約3,900字

VXLAN の構成を自動化したい

Ubuntu Server 20.04 で VXLAN を構成する では、VXLAN の構成が再起動しても維持されるよう各種 script を配置していました。
ただ、それでもそもそもこれらの script を配置するにあたっては SSH などでログインしてのオペレーションが前提となっていたため、これを cloud-init を利用して自動化します。

cloud-init でファイルを作成する方法

cloud-init でファイルを作成する方法は runcmdecho を実行するなどの方法があるようでしたが、それように用意された 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_updatepackages_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

うまくいきました、めでたしめでたし。

参考

  • もともとの記事はこちら

https://zenn.dev/skmkzyk/articles/ubuntu-2004-vxlan

  • cloud-init の module 群の reference

https://cloudinit.readthedocs.io/en/latest/topics/modules.html

Discussion

ログインするとコメントできます