自宅 Kubernetes クラスタのバージョンアップ (ずぼら編)

サーバー
スポンサーリンク

約一年前に構築した自宅 Kubernetes クラスタをバージョンアップした手順のメモです.

スポンサーリンク

課題と対応

多分,自宅で Kubernetes クラスタを運用(≠構築)するにあたって,最も大きな壁がこのバージョンアップだと思います.

Kubernetes は業務でも活用されているだけあって,バージョンアップ手順のドキュメントは充実しています.しかし,残念ながらマイナーバージョンをスキップしてのバージョンアップについては以下のように対象外となっています.

一方,昨年夏に構築したクラスタの kubeadm のバージョンは 1.24.3 で,約1年後の23年5月時点の最新バージョンは 1.27.1 となっており,マイナーバージョンが3回も更新されています.

これは,正しいお作法でクラスターを最新バージョンに上げるには全てのノードに対してバージョンアップを3回実施する必要がある,ということを意味します.その道を進むのも手ですが,普通は Kubernetes クラスタ自体が好きでないとやってられないと思います.

ということで,クラスターを動かしたままバージョンアップするのではなく,クラスターをリセットして新しいバージョンで再構築することにしました.

バージョンアップ作業

次の3つの作業をすべてのノードで行います.Pod は事前に停止しておきます.

  • kubeadm, kubelet, kubectl の更新
  • kubeadm reset の実行
  • Kubernetes の再設定

最初の項目は,次のようなスクリプトを準備しておくと便利です.実行には Z Shell が必要です.

こんな感じで,バージョンを選択してアップデートが行えます.

残りの項目は,『Ubuntu 22.04 に Kubernetes をインストールして自宅クラウド』と同等の内容を実行すればOKです.

トラブルシューティング

バージョンアップの中で一部トラブったので紹介します.

apt update が正常に完了しない

間が空いたためか,apt update を実行したときに下記のような Warning が出てしまいました.

これは下記のコマンドで解消できます.

MetalLB

Pod で動かしているサービスを外部に公開するにあたり MetalLB を使用していたのですが,バージョンアップの過程で次の2点で躓きました.

  • バージョン不整合
  • サービスに振り出される EXTERNAL-IP の変動

最初の項目については,昨年時点の v0.13.4 だと動かなかったので,最新の v0.13.9 に更新すればOKです.

後者は IP を自動割り付けしている限り回避できないので,クラスタ再構築によって変動することを頭に入れておくとスムーズに作業できると思います.CoreDNS 等を使って名前引きできるように設定しておくのも良いと思います.

【追記】設定方法を『Kubernetes 上のサービスにホスト名でアクセス』にて紹介しています.

ダウンタイムの考慮

これは蛇足ですが,今回紹介した方法でバージョンアップする場合,クラスタが正常稼働していない期間が数時間オーダーで発生する可能性がありますのでそれを見越して対策しておくとよいです.

私の場合,Fluentd で家中のセンサーからデータを収集しているのですが,バージョンアップ作業でそこそこの欠損が生じてしまいました.同じように Fluentd を使っている場合,HAProxy で Pod 上の Fluentd にデータを飛ばすのではなく,クラスタ外に Fluentd を立てておいて,そこから Forwarding するのがお勧めです.これにより,クラスタ内の Fluentd が停止している間も,クラスタ外の Fluentd に一時的にデータをためておけます.

なお,前述のように,クラスタ内の Fluentd の IP アドレスは再構築で変動する可能性があります.そのため,クラスタ外の Fluentd の Buffer タイプは file にしておき,クラスタ再構築後に Forwarding 先の IP アドレスを書き換えて再起動してもデータが残るようにしておくと良いと思います.

コメント