【環境構築】Raspberry Pi 4台で作るKubernetesクラスタ

前書き:憧れのラズパイクラスタ

Raspberry Piでスパコンを構築する取り組みは昔からありましたが、最近は「Kubernetesクラスタを作ったよ」という報告が増えてきました。私もラズパイ4(8GB)を一台購入してラズパイが合計4台となったのをキッカケに、憧れのラズパイクラスタに手を出してみました!

本記事では「導入手順(ネットワーク接続などのセットアップ説明は除く)」や「ハマったポイント」を紹介します。

                       

クラスタ材料(ハード、ソフト)

機器・ソフト 個数 役割・備考
Raspberry Pi 4台 本記事ではRaspberry Pi 3(2台)、Pi 4(2台)を使用。クラスタのMasterはメモリ使用量が大きいので、Pi4(RAM4GB以上)がオススメ。
microSD 4枚 本記事では16GB〜64GBを使用。Class10、32GB以上がオススメ。16GBの場合、クラスタ構築が終わった段階で空き容量が不足するかもしれません。
LANケーブル 5本 本記事ではCat6aを使用。
4層ラックケース 1個 Raspberry Piを縦に積み上げるタイプのケース。ファンとヒートシンクも付いてきて、お得感があります。私は1層タイプのケースも予備で買いました。
USB Type A to TypeC X個 Raspberry Pi4用の電源ケーブル。Pi4の数だけ必要。
microUSB to USB TypeA X個 Raspberry Pi3用の電源ケーブル。Pi4の数だけ必要。
microHDMIケーブル 1個 Raspberry Pi4用の映像出力ケーブル。
HDMIケーブル 1個 Raspberry Pi3用の映像出力ケーブル。
無線LAN親機(小型) 1個 上流のルータに無線接続する時に使用しますが、有線接続の場合は不要。
スイッチングハブ 1個 Raspberry Pi 4台のLANと接続するスイッチングハブ。
USB充電器 1個 本記事では60W、6ポートのタイプを使用。
Raspberry Pi OS with Desktop 1個 Raspberry PiのOS。最終的にはデスクトップ環境は不要なので、Linuxが得意な人はLite版でも問題ありません。

                

                                 

上記のTweetでRaspberry Pi2を使ったと書いていますが、組み立て中にお亡くなりになっている事が判明したので、2から4に差し替えました。

                                                                          

Raspberry Piの基本的なセットアップと組み立て

Raspberry Piの基本的なセットアップおよび組み立て方法は、本記事では説明しません。想定している基本的なセットアップ内容を以下に示します。

Raspberry Piの基本的なセットアップ内容(以下は説明を省略します)
  • Raspberry Pi用のOSをmicroSDカードに書き込み
  • Raspberry Piを起動し、キーボードや時刻の設定
  • Raspberry Piを無線もしくは有線でネットワーク接続
  • Raspberry Piが使用できるmicroSDの領域を拡大
  • OSのアップデート

                      

組み立てに関しては、説明書に図が多いため、1〜2時間で完了すると思われます。

                                   

全てのRaspberry Piを固定IP化

DHCP設定の場合、Raspberry Piの再起動に伴い、IPアドレスが変わってしまいます。この状態では、Host環境からRaspberry PiにSSH接続する際に不便ですので、IPアドレスを固定化します。

以下の記事を参考にIPアドレスを固定化します。SSH接続する際にIPアドレスが必須なので、メモしてください。

Raspberry Piに固定IPを割り当てる方法

                             

全てのRaspberry PiのHost名を変更

この手順は必須ではありません。SSH接続した際に、どのRaspberry Piにログインしているか(およびクラスタのMaster<->Slaveの関係)を分かりやすくするために、Host名を変更します。

Host名は、任意です。よく見られる命名規則は都市の名前、ディズニーキャラ名、太陽系の惑星名などを使用するケースです。私は、スラッシュメタル四天王(Big4)の名前を付けました。この名付けによって、ラズパイクラスタへの愛着が増します。

以下、Host名とRaspberry Piの組み合わせです。

機器 Host名 役割
Raspberry Pi4(8GB) metallica ラズパイクラスタのMaster
Raspberry Pi3 Model B megadeth ラズパイクラスタのSlaveその1
Raspberry Pi3 Model B slayer ラズパイクラスタのSlaveその2
Raspberry Pi4(2GB) anthrax ラズパイクラスタのSlaveその3

                               

Host名を変える際は、hostnamectlコマンドを使用します。hostnamectlコマンドだけでは、unknown hostエラーが出るため、/etc/hostsファイルも修正します。なお、/etc/hostsは、Host名とIPアドレスを対応させる役割を持つファイルです。

上記の手順を全てのRaspberry Piに実行したら、”$ sudo reboot”などで再起動します。

                        

Raspberry Piに新規ユーザを追加し、piユーザを削除

Raspberry Piのデフォルトユーザ(piユーザ)は、パスワードが知れ渡っているため、セキュリティリスクがあります。そのため、新規ユーザ(任意のユーザ名)を作成し、piユーザを削除します。

【セキュリティ対策】Raspberry Pi4に新規ユーザを追加し、piユーザを削除

             

SSH接続設定(セキュリティ対策含む)

デフォルト設定では、Raspberry PiはSSHが無効化されています。

SSHを有効化するには、Raspberry Piの/bootディレクトリにsshファイル(空ファイル)を置くか、もしくは以下のコマンドをRaspberry Pi上で実行してください。

                           

デフォルトのSSH接続設定は脆弱なので、以下の記事を参考にセキュリティ対策を実施してください。

Raspberry Pi3向けのセキュアSSH接続設定(公開鍵認証、rootアクセス禁止、ログインユーザ設定など)

                   

 

                                

Dockerのインストール

ここまでの手順を実施すれば、Kubernetesのインストールまであと一歩です。

DockerとDocker Composeをインストールしますので、別記事を参照してください。

Raspberry Pi3/4にDockerとdocker-composeをインストールする方法

                        

Kubernetesのインストール

ここまでの手順で、Kubernetesインストールのための前準備が完了しました。以降の手順は、(ようやく)Kuberbetesの環境構築となります。

まずは、Kubernetes用パッケージマネージャであるHelmをインストールします。インストールスクリプトを利用した以下の手順は私の環境で失敗したので、後述するsnapパッケージマネージャを利用して入れました。

snapパッケージマネージャを利用したHelmインストール手順は、以下の通りです。

                          

次に、Kubernetesクラスタの構築に用いるkubeadmin(クラスタ起動コマンド)、KubernetesをCLIで操作するkubectl、Pod管理エージェントのkubelet(Podやコンテナを起動するコンポーネント)をインストールします(公式サイトの手順もリンクしておきます)。

インストール前にレガシー版のiptablesに関する設定を行います。2020年にRaspberry Pi OS(正確にはDebian10以降)は、iptablesは内部的にnftablesを使用しており、nftablesとkubeadminに互換性がない問題があります。この問題を回避するために、iptablesをレガシーモードで使用します。

kubeadmin、kubectl、kubeletをインストールします。また、これらのパッケージはapt-markコマンドを用いて、パッケージ更新対象外とします。

                        

Masterノードの構築

CNI(コンテナネットワーキング)プラグインは、Flannelを使用します。

kubeadm initを実行後、kubectlの設定方法が出力されるので、その内容を順に実行します。また、kubeadm joinに関する設定方法も出力されるので、そちらもメモしておきます(私はメモを無くしてしまいました…)。

Pod Network Addonをインストールします。

                       

Workerノードの構築

今回はWorkerノードが3台あるため、その3台に対して以下の手順を実行し、Workerノードをクラスタに参加させます。

入力するコマンドは、Masterノードkubeadm initコマンド実行後に表示されたkubeadm joinコマンドです。

全てのWorkerノードがクラスタに参加した後、”$ kubectl get nodes”で各ノードのステータスを確認できます。STATUS部分がREADY以外の場合は、上手く設定できていない可能性があります。

                       

最後に

Kubernetesクラスタ環境構築は面倒くさい部類であり、一日近くの時間を要します。

さらに、特に動かしたいDockerコンテナアプリがない場合は、「ここから先、どうすればいいんだ?」と手が止まります。少なくとも私は、何も考えずに作ったクラスタの使い道に困っています。

ハード購入費用もそこそこするので、よく考えてから手を出しましょう(戒め)。

                       

おすすめ