はじめに
kube-vipを使ったHAクラスターの構築例は多くありますが、多くがStatic Podを利用したものです。DaemonSetを使った構築を挑戦したのでその記録を共有します
環境
- 仮想化環境: Proxmox8.2
- ベースイメージ: Ubuntu24.04 - cloud-init
kube-vipについて
公式サイト: https://kube-vip.io/
kube-vipはコントロールプレーンに対するVIPや、ロードバランサー(Serviceのやつ)を作成できるものです。ここではコントロールプレーンに対するVIPを利用し、HAクラスタ構築を行います
構築方法として、Static Pod
とDaemonSet
の2種類がありますが各コントロールプレーンにStatic Pod
を毎回書くのは大変なため、DaemonSet
を使って構築します
構築手順
前提
VIPを192.168.20.100
に作ることにします。またIPアドレスなどは各自の環境に合わせて読み替えてください
VMの作成
Ubuntu24.04をベースイメージにしてVMを作成します。私の環境ではcloud-initのものを使いましたが、通常の版のものでも問題ないと思います。スペックは以下のようにしておきます
name | value |
---|
Memory | 4.0GB |
Processors | 2 |
Hard Disk | 8GB |
コンテナランタイムのインストール
コンテナランタイムにはcontainerd
やcri-o
などがありますが、今回はcontainerd
を使います。ここでは以下のインストール手順を参考に進めます
https://github.com/containerd/containerd/blob/main/docs/getting-started.md#option-2-from-apt-get-or-dnf
cri-o
でも試してみましたが、なぜかkube-vip
がうまく動きませんでした
IPv4フォワーディングを有効にします
以下のコマンドを使ってDockerリポジトリを追加し、containerd
をインストールします
CNIは別で入れるためここではcontainerd.io
を入れます。インストール完了後動作していることを確認してください
追加でcontainerd
のオプションを一部変更しておきます
containerd
を再起動します
kubeadmのインストール
参考
スワップを無効化します
次にkubeadm
やその他のツールをインストールします。kubelet
のバージョンが変わると困るので固定しておきます
kube-vipの準備
参考
kube-vip用のマニフェストを生成します。VIP
の値を各自が設定したいVIPのアドレス、INTERFACE
はVIPが待ち受けを行うネットワークインターフェイスを指定してください。
お使いの環境でのネットワークインターフェイスはnetworkctl list
で確認できます
次に/etc/hosts
に設定を書き加えます(cloud-init
の影響で変更しているファイルが若干違います)。ここはお使いのDNSで設定してもよいと思います
クラスタの初期化
先ほど作成したVMを停止し、適当な数クローンします。この際3以上の奇数である必要があることに注意してください。今回は3個クローンしました。
また、この際IPアドレスを固定しておいてください。今回は次のようにしました
- kube-vip1: 192.168.20.80
- kube-vip2: 192.168.20.81
- kube-vip3: 192.168.20.82
kube-vip1に接続し/etc/hosts
を書き換えます
次のコマンドでクラスタを初期化します。この際出ていたjoin用のコマンドはメモしておいてください
一応動作確認をしておきます
kube-vipのデプロイ
参考
まずデプロイするためのRBACを作成します
先ほど作成したkube-vipのマニフェストをデプロイします
簡単に動作確認をします。kube-vip関連のPodが動いでいることを確認してください
Ciliumのデプロイ
参考
CNIのCiliumをデプロイするために、Helmをインストールします
Ciliumをデプロイします。この時まだkube-vip
は動作していないため現在のノードのIPアドレスにすることを注意してください
デプロイ後、STATUSがReadyになっていることを確認します
kube-vipのデプロイ
参考
次にkube-vipのデプロイを行います。まずkube-vip用のRBACを作成します
次に作成したkube-vipのマニフェストをapplyします
kube-vipのPodが動作していることを確認してください
.kube/config
を編集してVIPを宛先に変更しても、kubectl
が使えることを確認します
他のコントロールプレーン追加
他のノードに入り、出力されていたjoinコマンドを実行します
もしここまでに時間がかかってしまい、トークンの有効期限が切れてしまった場合、次のコマンドでトークンを再生成できます
この作業をkube-vip2
,kube-vip3
で実行します
最終的な状態
ここまでの手順をすべて完了すると次のような出力が得られるはずです
コントロールプレーンが3台存在し、動作していることがわかります。ここで試しに3VMの内1つ、kube-vip1
をシャットダウンさせても動作することができるか確認してみます
kube-vip1
をProxmoxのUIからシャットダウンします
kube-vip2
もしくはkube-vip3
に入り、kubectl
が現在も使用できることを確認します
必要があればワーカーノードも追加してみてください
終わりに
Static Podを使わずにDaemonSetを使ったHAクラスタ構築ができました。個人的にkube-vipで気に入っているのはHAにするのにほかのアプリケーション(keepalivedやhaproxy)が不要な点です。
すべてがkubernetes上で完結しているのでとてもシンプルだと思います。
今回はARPモードでkube-vipを動かしましたが、BGPを使ったモードもあるようです。ちょうどBGPを扱えるルータがあるので、時間があるときにこちらも試してみたいと思います