私のおうちにはProxmoxクラスタがいます。
pve / pve2 / pve3 / pve4 の4ノード構成で、VM・LXC・k8s Applicationがまあだいたい40台くらい稼働しています。
これまではSSHや設定時にわかりやすいよう、10.0.ノード番号.VMIDのようにStaticで割り当てていました。
が、ライブマイグレーションやk8s移行をするうちにVMIDは一致しているもののノード番号がズレたり、k8sにいるのでVMIDはないのにIPだけ持っている、といったことが増えてきました。
いい加減把握がめんどくさくてやってられないので、この辺の割り当て・管理を(ほぼ)自動化しました。
アーキテクチャ
How to
- VMIDさえ分かっていれば脳死でssh繋ぎに行ける
- 普段のVM/LXC作成フローに割り込まない
この2つは怠惰Humanにとっては譲れないので、ここをメインで作りました
DHCP予約
PVEクラスタで/cluster/resourcesを5s間隔くらいでポーリングして、ip-manageタグがついたVMIDとMACのリストを作ります。
これをOpenwrtのDHCP予約に突っ込んで自動割り当てされるようにしています。
ただ、5sごとにDHCP予約更新するのは美しくないので、差分があるとき、要は追加なり削除なりされたときだけ予約更新されるようにしています。
OSに依存せずゲストをDHCPにするだけで規則に従い全自動割り当てしてくれるので便利になりました。
でもVMIDが255超えたらどうすんのって思うかもしれません。私は天才なので、家のネットワークは/16で切っています。
10.0.30.X以降の30~33のセグメントを使い、次のようなマッピングをすることで255以上のVMIDもハンドリングできるようにしています。
- 計
IP = 10.0.30.0 + VMID- VMID
100〜254→10.0.30.100〜10.0.30.254 - VMID
257〜510→10.0.31.1〜10.0.31.254 - VMID
513〜766→10.0.32.1〜10.0.32.254 - VMID
769〜999→10.0.33.1〜10.0.33.231 - 末尾
.0/.255になるVMIDはエラーとして割り当てません。
- VMID
ip-sync
k8sに常駐させているPythonスクリプトです。
- 動き
- 5秒周期でPVE API
/cluster/resources?type=vmをポーリング - PVE APIを
PVEAuditorで叩く - 毎回全VMのconfigを叩くと重いので新規VMIDやタグ変更・ノード移動があった時だけ
/nodes/{node}/{type}/{vmid}/configを読みMACをキャッシュ。
- 5秒周期でPVE API
- 実IPとのドリフト検知
- 60秒周期の別スレッドで、稼働中VMのGuest AgentやLXCの
/interfacesから今掴んでいるIPをとる - DHCP予約と実割り当てを比較し、ずれていれば
/statusエンドポイントに出す
- 60秒周期の別スレッドで、稼働中VMのGuest AgentやLXCの
Openwrt側ヘルパー
重複とか人間のオペレーションとかぶるとやばいので、いくつかフェイルセーフを入れています。
- .lockファイルを置きロックを取得してから操作する
- 既存のUCI操作を検知した場合はロックを即時解除し・適用中止する
- 既存の操作がcommitされるまではロックを取得しない
- 競合を検知した場合は適用中止する
- ついでに
/etc/sysupgrade.confに書き足して、ファームアップデートで消えないようにする
netbox同期
都合よく我が家には野生のNetBoxが生えているので、Netboxに自動同期するようにしました。
おわり
こんな感じに変わっています
| 項目 | Before(従来) | After(今回) |
|---|---|---|
| IPのルール | 10.0.<ノード番号>.<VMID> | 10.0.30.0 + VMID(例:VM107 → 10.0.30.107) |
| 手動SSHのしやすさ | ノード番号+VMIDが必要 | VMIDだけでSSH可能 |
| 設定方法 | ゲスト内 or PVE設定に手動で固定IP入力 | ゲストはDHCP統一+ip-managed タグでDHCP予約を自動生成 |
| マイグレーション時 | IPとノード番号が不一致になる or IP変更+nginx等の書き換えが必要 | 何もしなくていい、うれしいハッピー |
| NetBox連携 | LXCのDHCP非対応、移動後の旧IPがゴミとして残る | LXCの実IP取得に対応+使われなくなった旧IPを自動整理 |
