📚

おうちKubernetesをはじめる(HA編)

2024/11/09に公開

概要

ついに、本当のHAおうちKubernetesクラスターの構築に取り組みます。
HAとは、High Availability、つまり高可用性を意味します。

最初は、ラズパイ3台でコントロールプレーン・ワーカーを含むクラスターを構築しました。

次に、ラズパイ3台のコントロールプレーン+x86(amd64)のPC 1台のワーカーを設けるKubernetesクラスターを構築しました。
(便宜上、ここではこれを半HA構成と呼んでいます)

いざ使い始めようとしたところ、上記で構築した半HA構成にはいろいろと課題がありました。

Kubernetesクラスターに実用的なアプリケーションをデプロイするにはKubernetes内のLoad Balancerサービスや、PV(Persist Volume)が必要になってきます。
Load BalancerとしてMetalLB、PVとして Longhorn、Rook Ceph などの分散ストレージの導入を試みましたがうまく行きませんでした。

そこで、ワーカーを3台設ける構成で構築し直すことにしました。
CalicoはMetalLBと相性が悪いことも学んだため、今回CNIはCiliumを使用します。

このやり方でも上手く行くという確証はありませんでしたが、結果的には動作するものを構成することができました。

構成

写真

ラズパイ4のケースは、タカチ電機工業の RPH-4B-H-B をチョイスしました。
当初はクラスターケースを検討していましたが、静音性・放熱性を考えると、ファン付きのクラスターケースよりは、全体がヒートシンクと言えるようなケースに個別に格納する方が優れていると考えました。

左から、Nuro光のモデム、ONUと一緒に並んでいるのがOpenWrtがインストールされたルーターBUFFALO WZR-1750DHP(無線LANは無効)であり、haproxyやFRR(FRRouting)を動作させます。

ハードウェア

3台のラズパイと3台のPC(Chromebox改)、OpenWrtをインストールした1台のルーターを使用します。

  • Raspberry Pi 4 Model B RAM 8GB 3台
  • ASUS Chromebox3 i7-8550U 16GB RAM, 256GB NVMe SSD) 3台
  • BUFFALO WZR-1750DHP (OpenWrtをインストール。更にOpenWrtにhaproxy、FRRをインストール)

ソフトウェア

  • Ubuntu 22.04
  • Kubernetes v1.29 (v1.29.6)
  • Cilium v0.16.10

ブロック図

詳細

ポイントは下記となります。
(用語は間違っている可能性がありますので、私の誤認識がありましたらご指摘いただけると幸いです。)

  • ラズパイ3台のコントロールプレーンとする
  • x86(amd64)のPC 3台をワーカーとする
  • OpenWrtにてサブネットを構成する
  • OpenWrtにインストールしたロードバランサー(haproxy)を使用してコントロールプレーンを冗長化し、サブネット外から利用可能にする
  • CNIとしてCiliumを使用する
  • ワーカー3台に対し、それぞれストレージの一部を未フォーマットのRawパーティションとして確保する
  • Rook/CephをKubernetesクラスターにデプロイし、上記のRawパーティションを使用して分散ストレージを構成する
  • MetallbをKubernetesクラスターにデプロイし、BGPモードで使用する
  • MetallbがServiceやIngressの役割を担い、そこから払い出されたIPアドレスを広報する
  • Ingress-Nginx ControllerをKubernetesクラスターにデプロイする
  • OpenWrtのルーティング(FRRouting)を使用してMetallbが広報するIPアドレスをサブネット内で利用可能にする
  • (OpenWrtにインストールしたロードバランサー(haproxy)を使用してServiceやIngressで払い出されたIPアドレス/ポートをサブネット外から利用可能にする)

詳細は下記の通りです。


おわりに

今回、3台のラズパイと3台のPC、OpenWrtをインストールした1台の小型ルーターを用いてHA(High availability) おうちKubernetesクラスターの構築ができました。

また、この構成に対し、Rook ceph による Storage の追加、Metallb による Load Balancer の追加、Ingress-Nginx Controller の追加を行うことができました。

そして、このクラスターにhelmチャートを使用してPostgresqlやThingsBoardをデプロイすることができました。

ここまで来てやっと、業務で使用しているマネージドKubernetes(AKS、EKS、GKEなど)向けのお試し検討ができるクラスターができました。

Discussion