Open2

地理的に分散した Kubernetes クラスターを Proxmox + LXC + Tailscale で構成する

yudeyude

Proxmox VE 上に Kubernetes 用 LXC を作成する

  • 普通に Web UI から作成する。
    • 非特権コンテナのチェックを外す。
    • スワップは使わないので 0 byte でよい。
    • DNS はとりあえず 1.1.1.1 にしておく。
      • ホスト側に Tailscale が導入されていると 100.100.100.100 に向くのでゲスト側 (LXC) に tailscaled をインストールするまで名前解決できなくなる。
  • 作成後、/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) 分繰り返す。
yudeyude

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
  • 編集内容
    • After=network.targetAfter=tailscaled.service に書き換える。
  • 書き換え後は、念の為 systemctl daemon-reload を実行する。