以前kubernetesをラズパイに設定しました。
k8sとラズパイでNASサーバを作る(基盤編) - 猫の手なら貸せる
k8sとラズパイでNASサーバを作る(アプリ編) - 猫の手なら貸せる
この頃の環境を現在まで使っていたので稼働日数的には半年くらいになるのですが、また賢くなってしまったので環境をいじろうと思っていたりしています。
背景
Dropboxの容量が一杯になったので、手元のHDDをネットワークディスク化(NAS)にできたらいいなと言うところから、ラズベリーパイでのサーバ構築を始めました。
シングルディスクのNASがRAID 1構成になり、kubernetesを知って(なんちゃって)ミラーリングサーバになり、半年ほど稼働を続けてきました。
社会人になってこのかたインフラばかりで最近マンネリ気味でした。ただ、最近のお仕事でまた少し賢くなり、新しいことをやる元気が湧いてきたので、今回また稼働環境を壊して組み立てていこうと思います。
製品について
microk8sによるコンテナ管理
開発当初は「シングルノードで実行可能なkubernetes」として、小規模な環境・ワンコマンドによるインストールなどを売りにしていたらしいですが、現在はクラスタを組んだりできたりして開発環境として魅力的なところがあります。
公式 microk8s.io
microk8s
は他のkubernetesとは異なる面白い点があります。どうも、microk8sは構築する全てのノードをマスター兼ワーカーとして利用することができるみたいです。すべてのノードにkube API serverがいるので、マスターノードが死なない。
お世辞にもRaspberryPiは安定しているとは言えないので、どのノードが潰れても代用が効く・大丈夫というのは心強いものがあります。
分散ファイルシステムの利用
分散ファイルシステムはファイルを何らかの形で分散して可用性を高めたファイルシステムです。
気にはなっていたのですがなかなか触る機会がなくここまできましたが、ついに手を出す時がきました。
これまでCeph
やSwift
について少し仕事で触る機会があり、改めて自分で調べたところ、結構プロダクトがあるのだなと感じました。
この中で個人で手軽に手を出せて、かつ今回利用したい機能であるPOSTIX互換を持つファイルシステムはこんなかんじです。
製品名 | 分散単位 | メタデータ管理 |
---|---|---|
GlusterFS | ファイル | 管理なし |
Ceph | ブロック | 管理あり |
これら二つに関しては先人がかなり研究してくれていたようで助かりました。
分散FS 比較 cephfs vs glusterfs (1) ceph編 – nodoka.org
分散FS 比較 cephfs vs glusterfs (2) glusterfs編 – nodoka.org
できることは所詮ラズベリーパイです。今回はあくまで小規模なシステムを構築しようということで、GlusterFS
を採用してみようと考えました。
構成の確認
現在の状況
現在の状態で問題だったのは
- masterノードが死んだらアクセスできない
- ミラーリングが弱い(ディスク間に必ず時差が発生)
- ワーカーノードごとに違うパッケージを使っている
masterが死んだらアクセスできないのは初めにNASを組んだ際も課題でした。ホストOSがダウンしたらアクセスできない。
このため負荷分散のためにワーカーを二台配置したものの、結局いずれもラズベリーパイでしかないので、落ちる可能性はあります。
実際、一度マスターがダウンしたこともあってなかなか面倒でした。ワーカーが生きていたおかげでデータに支障はありませんでしたが、心配になります。
ミラーリングが弱いというのは、結局コンテナアプリケーションによってrsyncをCronjobで行っているだけなので、二つのディスク間で内容が違う時間が発生する点です。
バックアップという目的ではむしろ安全かもしれませんが、対障害性を考慮した設計を考えるべきで、現状では不適です。
ワーカーノードごとに違うパッケージを使っているのは何が問題かというと、ワーカーの増設や故障した際、そのワーカー専用の設定などを記録しておかなければならないことが懸念事項となります。
せっかくkubernetesを使っているのにメリットが薄くなってしまうため、この状態はあまり好ましいとは言えません。
これらを今回のプロダクトがある程度解決できることに期待しています。
改善環境の構想
microk8sによってノードの一点集中が解決し、GlusterFSによってノードに入れるパッケージを統一できるので、かなりいい感じになるのかなと考えています。
懸念事項
いくらか利用している人の記事を見る限りだとGlusterFSの性能はよくないようです。
Cephと違って分散単位がファイルのため、どうしてもファイルシステムの制限をくらってしまっていると推測しています。
専用のシステムで制御するんじゃなくてLinuxのFUSE(関数定義によるファイルシステムの再定義の機能らしい?)を使っているらしいのでrsyncとsshの性能準拠だとか。
詳しい話はよくわかりませんが、とりあえず作ってみようと思います。
まずは今ある環境をバラすところからやらないとですが...とりあえず1台無事ノードを外せたので大丈夫そう。