自宅ネットワークのうち Kubernetes が動いているセグメントはコントローラでポート VLAN として設定して分離していた。 これのメリットはマシン側で特に設定が必要ないこと(DHCPでそれぞれの設定を配っていたので)だったがもう少し複雑なことをやりたくなってきたのでタグ VLAN へ変更した。
将来的に、マシンのセットアップからクラスタへの参加までを自動化したく、そうするとポート VLAN ではどうしても接続前に設定が必要になる。
ポートVLANをタグVLANに切り替える
セグメントを変更するわけではないので全台の作業が完了しなくても当然疎通する。したがってクラスタとしては Graceful に変更を行うことができる。 が、自宅では検証機材があるわけではないので本番一発勝負となりそこまで綺麗にはいかななかった。
1. cloud-init のネットワーク設定の生成を止める
実際はvlanの設定で上書きするので止まってなくても問題ないが生成されても使わないのだから止めてしまう。生成していると無駄にファイルが増えて後から見た時のメンテナンス性が下がるだけである。
2. netplan を設定する
network:
version: 2
ethernets:
eno1:
dhcp4: false
dhcp6: false
vlans:
eno1.1000:
id: 1000
link: eno1
dhcp4: false
dhcp6: false
addresses: ["192.168.10.2/24"]
gateway4: 192.168.10.1
nameservers:
addresses: ["192.168.10.1"]
- DHCPをやめて
- vlanタグを設定し
- gatewayやネームサーバを正しく設定する
これだけである。DHCPはもはや不要なので使うのをやめた。
3. drain する
以降一時的に疎通しなくなるのでまず Pod を追い出す。もしマスターノードに Pod をスケジューリングしてなければこれは必要ない。 (その場合は drain してもほぼ何も変わらないだろう)
これを忘れると疎通しなくなったノードにUniFiのコントローラがいたりして面倒なことになる。実際なった。
3. netplan applyする
ここでおもむろにapplyする。一旦疎通しなくなるが慌てない。
4. コントローラでポートVLANの設定を削除する
これを行えば疎通するはずである。
Listenしてるインターフェース名を変更する
これはインターフェースを指定してListenしているデーモンが動いていればやらなければいけない。
基本的には Pod で動いててクラスタのネットワークになっているので問題ないが、うちのクラスタでは keepalived を使ってマスターを冗長化しているのでここだけ変更が必要だった。
失敗
全6台あるうち4回は失敗した。
まず最初は netplan の設定が間違ってて apply したので疎通しなくなった。2回目も同じく。3回目は忘れた。
最後は netplan apply する前にポートVLAN の設定を抜いてしまった。そのためssh越しで操作できなくなったのでディスプレイとキーボードを繋ぐ羽目になった。