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
を生成したら、namespace
とdeployment
とpod
にtigera-operator
がいることを確認する。次に、Calico本体をマニフェストから生成して、
calico-system
というnamespaceにpodが生えてくるのを待つ。クラスタの構成
ここまでできたらあとは他の2つのWorker Nodeから以下のコマンドを実行してクラスタに参加させる。
そしてControl Planeからnodeが認識されていることを確認する。
そうしたら以下のような二つのマニフェストを用意して、applyする。
これでdeployされて、ここで表示されたポートであるhttp://<マシンのIPアドレス>:30379にアクセスすることでnginxのデフォルト画面が表示され、正常に動作していることが確認できた。

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