asuto.dev

3台のRaspberry PiでおうちKubernetesを構築した

Date: 2024-12-28

なぜ

最近、いろんな大きなサービスがKubernetesで動いているんだなぁと思って、自分で基盤を構築してみたいと思ったときにちょうど家に3台ほどRaspberry Piがあったので、構築した。

使ったもの

ハードウェア

  • Raspberry Pi 5 (Sapphire)
    • RAM 8GB
    • microSD 128GB
    • Control Plane
  • Raspberry Pi 4B (Emerald)
    • RAM 8GB
    • microSD 128GB
    • Worker Node 1
  • Raspberry Pi 4B (Ruby)
    • RAM 4GB
    • microSD 32GB
    • Worker Node 2

ソフトウェア

  • Ubuntu Server 24.04.1
  • Kubernetes: v1.32
  • CRI-O: v1.32
  • calico: v3.29.1

Raspberry Piのセットアップ

今回はWindowsでRaspberry Pi Imagerを使った。ホスト名、authorized_keysなど設定してからmicroSDにimageを焼けるので便利。bootしたら、ssh, ipアドレスを設定する。これ以降特に何も言及がなければ3台に同じ操作をしている。

CRI-O, Kubernetesの導入

まず、CRI-Oのドキュメントに従って、コンテナランタイムであるCRI-OとそのオーケストレータのKubernetesの最新のバージョンを確認してaptパッケージを追加する。
そしてcri-oコマンドとKubernetesに必要なkubelet, kubeadm, kubectlの三つのコマンドをインストールして、後者のバージョンを固定する。
スワップをオフにしたりカーネルモジュールをロードしてカーネルパラメータを設定する。
ここからはControlPlaneでクラスタを構成して、CNIを入れて他のノードが参加する準備をしていく。 まず、CRI-Oのソケットが存在していることを確認して、kubeadm initする。
すると、いくつかコマンドが出力されるので実行して$HOME/.kube/configを作成しておく。
これでクラスタが初期化できたはずなので、そうしたらnodeやpodが正常に認識されていそうか確認しておく。

Calicoの導入

次に、以下のドキュメントに従ってノード間の通信を行うためのCNI(Container Network Interface)プラグインであるCalicoを導入していく。
まずはCalicoを入れるためのtigera-operatorを導入する。
マニフェストからtigera-operatorを生成したら、namespacedeploymentpodtigera-operatorがいることを確認する。
次に、Calico本体をマニフェストから生成して、calico-systemというnamespaceにpodが生えてくるのを待つ。

クラスタの構成

ここまでできたらあとは他の2つのWorker Nodeから以下のコマンドを実行してクラスタに参加させる。
そしてControl Planeからnodeが認識されていることを確認する。
そうしたら以下のような二つのマニフェストを用意して、applyする。
これでdeployされて、ここで表示されたポートであるhttp://<マシンのIPアドレス>:30379にアクセスすることでnginxのデフォルト画面が表示され、正常に動作していることが確認できた。

今後

今回、おうちkubernetes基盤を構築してnginxを動かすところまではできたが、悲しいことに肝心の動かしたいアプリが今のところ思いついていないので、もし適当なアプリを作るときは次はkubernetesで動かそうと思う。もし誰か面白そうなアイデアを思いついたら教えて欲しい。