Open2
地理的に分散した Kubernetes クラスターを Proxmox + LXC + Tailscale で構成する
Proxmox VE 上に Kubernetes 用 LXC を作成する
- 普通に Web UI から作成する。
- 非特権コンテナのチェックを外す。
- スワップは使わないので 0 byte でよい。
- DNS はとりあえず
1.1.1.1
にしておく。- ホスト側に Tailscale が導入されていると
100.100.100.100
に向くのでゲスト側 (LXC) に tailscaled をインストールするまで名前解決できなくなる。
- ホスト側に Tailscale が導入されていると
- 作成後、
/etc/pve/lxc/<ID>.conf
に以下を追記する。features: mount=fuse,nesting=1 lxc.cgroup2.devices.allow: c 10:200 rwm lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file lxc.apparmor.profile: unconfined lxc.cap.drop: lxc.cgroup.devices.allow: a lxc.mount.auto: proc:rw sys:rw lxc.mount.entry: /dev/fuse dev/fuse none bind,create=file 0 0
- LXC を起動する。
- LXC 内に Tailscale をインストール、ログインする。
tailscale up
- エラー
failed to start OOM watcher open /dev/kmsg: no such file or directory
対策のため、以下を LXC 内で実行する。ln -s /dev/console /dev/kmsg echo 'L /dev/kmsg - - - - /dev/console' > /etc/tmpfiles.d/kmsg.conf
- スワップを完全に切る。
swapoff -a
- IPv4 パケットフォワーディングを有効にする。
sysctl -w net.ipv4.ip_forward=1
- 上記を必要なノード数 (master + worker) 分繰り返す。
LXC 内に K3s をインストールする
- Tailscale 内での IP アドレスは
tailscale ip
とかで確認する。
master
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --flannel-iface tailscale0 --advertise-address <master ノードの Tailscale 内での IP アドレス> --node-ip <master ノードの Tailscale 内での IP アドレス> --node-external-ip <master ノードの Tailscale 内での IP アドレス>" sh -s
worker
- トークンは master ノード上で
k3s create token
を実行して取得する。
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="agent --server https://<master ノードの Tailscale 内でのホスト名 (末尾 ts.net)>:6443 --token <トークン> --flannel-iface tailscale0 --node-ip <worker ノードの Tailscale 内での IP アドレス> --node-external-ip <worker ノードの Tailscale 内での IP アドレス>" sh -s
この時点で k3s kubectl get node
を実行すると目的のノードがすべて Ready になっているはず。
K3s の systemd unit ファイルを編集する
- 現状だと、サーバーを再起動した時に K3s (特に worker) が上がってこない。
- これは Tailscale よりも前に K3s が起動した時に発生する (と思われる)。
- したがって、以下の unit ファイルの
After=
の項を編集する。- master:
/etc/systemd/system/k3s.service
- worker:
/etc/systemd/system/k3s-agent.service
- master:
- 編集内容
-
After=network.target
をAfter=tailscaled.service
に書き換える。
-
- 書き換え後は、念の為
systemctl daemon-reload
を実行する。