大きく次の特徴があります。
- Raspberry Pi 4を3台使用して構築
- スティックSSD起動
- コンテナ専用OSのFedora CoreOS使用、動作が軽い(はず
- 分散ファイルシステムを構築、各ノードのスティックSSDにデータを分散して保存
いちばんの特徴は「Rook Cephで各ノードにデータを分散して保存している」ところかと思います。CPUやメモリーのリソースを大量に消費する予感がします。
一方、使用しているノードはRaspberry Pi。正直、リソースが豊富、強力、とは言えない機器かと思います。
本当にRaspberry Piで安定して動くのか?そのあたり、本当に実用になるのか・・・調べてみたいと思います。
Raspberry Pi Kubernetesクラスタのリソース使用状況の例
システム構成
- Raspberry Pi 4を3台使用
- メモリー8GB 2台 コントロールプレーン+ワーカーノード
- メモリー4GB 1台 ワーカーノード
- Fedora CoreOSを使用
- スティックSSDから起動
- Rook Cephで分散ファイルシステムを構築
- 永続ボリュームとして使用RWX(ReadWriteMany)対応
- 各ノードのSSDにデータを分散して保存
- ロードバランサにMetalLB使用
- クラスタの外側から各サービスにアクセス可能
具体的に、動作しているポッドはこのくらいのボリュームになりました。
管理ツールはCUIのみ
管理ツールは、Rook CephのToolboxをデプロイしてあります。
それ以外の、GUIを使用するような管理ツールはデプロイしていません。ええ、動作が重くなるのでは?ということで、管理ツールは最低限のみの状況です。
アプリケーションとしてWordPressをデプロイ
そしてアプリケーションは、WordPressをデプロイしてみました。
WordPressのポッドは、node3というノードで動作していることがわかります。
永続ボリュームは、既定の設定で合計18GB予約されています。
WordPressはインストールしたばかりの状態のため、ストレージはそれほど使われていないと思います。
実際に分散ストレージの状況を確認してみましょう。
ストレージの使用量は実質1.5GiB程度、3台に分散して4.5GiB程度使用
クラスターの状態は、「HEALTH_OK」で健康な状態です。
各ノードは867GiBのストレージ容量を持ち、合計2.5TiBが使用可能なストレージ容量になります。
現在、4.4GiB使用されていますが、OSDステータスを見ると、どうも各ノードで1500MBずつ使用されている感じです。おそらく、実際のデータは1.5GB程度で、それが3つのノードに分散されて、合計4.4GiB使用中、という感じです。
分散ストレージの動作としては、全く問題なく機能しています。
仮にノードがどれか故障しても、ノードが残っている限りは、データは消えることはない、分散ファイルシステムが正常に機能している状態です。
これはつまり、各ノードでCephファイルシステムの同期処理が動作していて、CPUやメモリーリソースを消費している、ということを意味します。
Raspberry Piで(性能的な面で)本当に大丈夫なのでしょうか?
各ノードのリソース使用状況
ノードの構成と、Raspberry Pi 4のメモリー搭載量は次の関係になります。
- node1
- Raspberry Pi 4メモリー容量8GB
- コントロールプレーン+ワーカーノード
- node2
- Raspberry Pi 4メモリー容量8GB
- コントロールプレーン+ワーカーノード
- node3
- Raspberry Pi 4メモリー容量4GB
- ワーカーノード
- アプリケーションのWordPressポッドが稼働中
node1(メモリー8GB、コントールプレーン+ワーカー)のリソース使用状況
node1はコントロールプレーンということで、sshでログインして、kubectlコマンドを操作することが多いノードです。
CPU負荷であるロードアベレージですが、だいたい1.0から2.0あたりをふらふらしている感じです。
Raspberry Pi 4はCPUが4つ搭載されているため、ロードアベレージが4.0になると、CPUパワーが全力となり、4.0を超えるとパワーが足りず、処理に遅延が発生する状況です。
使用可能なメモリー容量は、7823.8MiBです。空きメモリーが14.7MiBと表示されていますが、実際はバッファーとキャッシュに4488.7MiB使用されているため、4MiB程度は空いている、と考えられます。
負荷が大きいプロセスは「ceph」、黄色く表示されて、やはり分散ファイルシステムの負荷が大きいことがわかります。CPU負荷の大半は、Cephプロセスのようですが、メモリー使用量は0.6%+0.4%程度で、それほどメモリーを大量消費しているわけではありません。
そのようなわけでまとめますと。
- node1のCPU負荷は、20%~50%程度
- メモリー使用量は3.2GiB弱ほど
- バッファー・キャッシュが4.5GiBほど
- つまりメモリーは半分くらい空いている状況
node2(メモリー8GB、コントールプレーン+ワーカー)のリソース使用状況
続いてnode2の状況です。メモリー搭載量は、node1と同じく8GiBになります。
node2は、node1と同じ傾向です。ロードアベレージは0.5から1.5程度で推移しています。
メモリー使用量は2.8GiB程度で、5GiB近くがバッファーとキャッシュに使用されています。
cephのモニタープロセスが動いていて、稀に負荷が大きくなることがあります。
node2は比較的暇そうで、まだ余裕がある感じです。
- node2のCPU負荷は、20%~40%程度
- メモリー使用量は2.8GiB弱ほど
- バッファー・キャッシュが4.6GiBほど
- つまりメモリーは半分くらい空いている状況
node3(メモリー4GB、ワーカーノード)のリソース使用状況
node3は、メモリー容量は4GiBになります。そのため、コントロールプレーンにはしておらず、ワーカーノードとして動いています。
WordPressポッドがデプロイされたため、httpdやmysqlが動作していることがわかります。
そのため、いちばん負荷が大きいのはnode3です。CPU負荷は常に1.0以上で、場合によって負荷が7.0程度まで上がる場合があります。忙しい。
一方、メモリーの使用量は2.6GiB程度です。キャッシュで1GB程度使用されていて、実は余裕がある感じです。
- node3のCPU負荷は、30%~110%、場合により150%を超える場合も
- メモリーの使用量は、2.6GiB程度
- バッファー・キャッシュが1GiBほど
メモリー容量は現状は足りているが、ワーカーノードのCPU負荷が高い
まとめますと。
- node1コントロールプレーン+ワーカーノード
- CPU負荷は20%~50%程度
- (8GBモデル)メモリー使用量は3.2GiB程度で、4.5GiBほど空き
- node2コントロールプレーン+ワーカーノード
- CPU負荷は20%~40%程度
- (8GBモデル)メモリー使用量は2.8GiB程度で、4.6GiBほど空き
- node3ワーカーノード
- WordPressポッド稼働中、httpdとmysqldプロセスが存在
- CPU負荷は30%~100%、場合により150%を超える場合も
- (4GBモデル)メモリー使用量は2.6GiB程度で、1GiBほど空き
分散ファイルシステムを使用しても、メモリー使用量はそれほどない感じです。
Fedora CoreOSですが、LVMが実装されていません。つまり、機能が削られていて、軽くできているため、CPUとメモリーリソースの消費が小さく作られています。
そのあたりの影響があるのかもしれません。
CPU負荷も、分散ファイルシステムの影響で過負荷(100%を超える)ということはなさそうです。
一方、アプリケーションをデプロイしたノードは、CPU負荷が足りていない状況であるとわかりました。
分散ファイルシステムによる負荷は、思ったほど大きくありませんが。アプリケーションをデプロイすると、地味に効いてくる感じでしょうか。
それと、私のノードの配分は失敗していることがわかりました。
- コントロールプレーン →比較的負荷が低い →低スペックで大丈夫
- ワーカーノード →アプリケーションがデプロイされると負荷が高くなる→高スペック
という状況のため、メモリー8GBモデルをコントロールプレーンにするのではなく、アプリケーションを動かすノードに8GBモデルを使用したほうが良いことがわかりました。
今回、クラスタのCPU負荷とメモリー使用量を調べた結果、Raspberry Pi 4でも十分に分散ファイルシステムが使用できるとわかりました。
一方、アプリケーションをデプロイすると、メモリーよりもCPU負荷が足らないことがわかりました。
Raspberry Pi 4のメモリーが多いモデル8GBと、メモリーが少ないモデル4GBを、どういうノード構成にすればよいかは、アプリケーションのデプロイを考慮したほうが良い、という結論になります。
一方、Raspberry Pi 4のメモリー4GBモデルでも、アプリケーションをデプロイしなければ、メモリー容量は足りていて、1GB程度空きがあることがわかりました。
このあたりは、Fedora CoreOSを使用した影響かもしれません。他のOSを使用した場合は、メモリー使用量がどうなのか、気になるところではあります。
このような感じで、Raspberry Pi 4の4GBモデルでも、Kubernetesのノードとして十分活用可能です。
よろしければ、夏休みの課題として、おうちクラスターを構築してみてください!