ご家庭向けk8sクラスタを?
chatagiriiiです。
就職してインフラ系の部署に配属されまして。
ベアボーンPCのBeeBoxを中古で安く買い、自宅鯖を動かしていろいろお勉強する日が続いていました。
コロナ禍になり家で過ごす時間も増えたので、せっかくだからとスペック高めのPCを購入してKubernetesのお勉強をすることにしました。
ホスト基盤はどうしよう
おうちKubernetesを作るためのホスト基盤構成を挙げてみると、よく見るのは
- 3台以上のRaspberry Pi を繋げてクラスタ作って、1台1Nodeとして割り当て
- 3台以上の物理サーバをL2で繋げて、1台1Nodeとして割り当て
- 1台の適当なスペックのPCにMinikubeを入れる
- 1台の適当なスペックのPCにvmを建てて、1vm1Nodeとして割り当て
- おうちはあきらめてCloudな環境を使う(GKE,EKS とか)
自分はせっかくkvm周りの知識をお勉強させていただいたので、
- 1台の適当なスペックのPCにvmを建てて、1vm1Nodeとして割り当て
で実施します。
vm母艦PCのスペックをみつもろう
Kubernetesクラスタを作るには、1台以上のMaster Node と、1台以上のWorker Node があると良いらしい。
Masterを増やせばマルチマスタで高可用性に、Workerを増やせば負荷分散、建てられるPod数の上限が増えるイメージ。
数台のvmで各Nodeを作る方式にするとして、vmを立ち上げるホストを新しく組もうと思い。
どのぐらいのスペックが必要なのかをまずは見積ります。
k8sの各Nodeのハード面の推奨スペックは以下な感じ。
- 2 GB or more of RAM per machine (any less will leave little room for your apps)
- 2 CPUs or more
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin
で、そこそこ動くクラスタを作りたいので、そこそこ動くっていう所を加味して作る予定のKubernetes Nodeを列挙してみる。
vm ホスト名 | 役割 | RAM | vCPU(core) | Disk | 備考 |
c8s-master00 | Master Node | 8GB | 4Core | 200GB | etcd とかkube-apiserverとかを動かすmaster node |
c8s-router00 | Router Node | 4GB | 2Core | 100GB | network系のPodを動かす (nginx-ingress-controller とか) |
c8s-worker00 | Worker Node | 8GB | 2Core | 200GB | ユーザ利用のPodを建てるnode |
c8s-worker01 | Worker Node | 8GB | 2Core | 200GB | 同上 |
c8s-worker02 | Worker Node | 8GB | 2Core | 200GB | 同上 |
必要そうなVMは以上。
載せるディスク周りも考えてみる。どちらもlvmでlvを切って、管理はある程度楽にしながらも、できるだけ安く済ませたい。
ディスクの役割 | 容量 | 備考 |
VM用 | 1000GB | vm母艦自体にmountする。 VMに使う領域をLVMで切るストレージ。 |
母艦用、nfs用 | 1000GB(を母艦用とnfs用に分ける) | vm母艦自体にmountする。 母艦のファイルシステム用領域と、nfs用の領域をLVMで切るストレージ。 |
上記の表からまとめると、vm母艦PCに必要そうなスペックは以下な感じに。
- CPU: 12Thread以上(=8Core16Threadかな)
- RAM: 36GB以上
- Disk: 合計2000GB以上
これを満たすPCを組むぞ組むぞ。
Mini-ITXなPCパーツ選定
作ったPCのスペックまとめるとこんな感じ
部位 | パーツ名 | 買ったときの価格 | リンク | 備考 |
CPU | AMD Ryzen7 3700X | 39,980 | https://amzn.to/34hJ67W | 8Core16Thread |
マザボ | ASRock B550-itx | 16,500 | https://amzn.to/3ajcrTk | ちっちゃいのがいいのでmini-ITX |
グラボ | 玄人志向 GF-GT710-E1GB/HS | 3,680 | https://amzn.to/37o1kqh | GT710. グラフィカルな処理はしないのでよわよわ。 |
RAM | Crucial CMK32GX4M2A2666C16 | 30,500 | https://amzn.to/2LAP11n | 32GBx2 (もう売ってなかったのでcorsairのリンク) |
SSD(1) | Crucial CT1000P1SSD8JP | 11,981 | https://amzn.to/2WgTQPC | 1TB. M.2のSSD。安い。母艦+NFS用 |
SSD(2) | Samsung 860 QVO 1TB | 10,990 | https://amzn.to/3anI7a2 | 1TB. SATAのSSD。VM用。 |
電源 | Corsair SF450 | 14,311 | https://amzn.to/3r43DGM | 450W. ちっちゃいのがいいのでSFX電源 |
CPUクーラー | SCYTHE 超天 | 3,880 | https://amzn.to/38nTahd | 意外と入る |
ケースファン | SCYTHE KAZE FLEX 120 | 1,270 | https://amzn.to/3nqHiRx | 2枚買った。明らかに静か。 |
ケース | RAIJINTEK Metis plus | 7,404 | https://amzn.to/3r43SBG | mini-itxなケース。銀色。品薄で高くなった。 |
こだわり的なところは以下
- 静音性重視。
- 消費電力をできるだけ下げる。但し、電源効率のいい電源を。
- 邪魔になったら直ぐ避けられるように、Mini-ITXでコンパクトな感じに。
で届いたので作ると。
METISのケース、非常に小さくていいんですが、組み込むときに指が引きちぎれるぐらい狭いのでご注意ください。
クラスタ周りの構成
vm母艦となるPCが組めたので、内側の構成を考えて作る。
図にするとこんな感じ。
物理的なPCは2台。
今回作ったvm母艦ホストと、今まで使ってたBeeboxくんの2台体制にしてみました。
- Node
- 前述のとおり、master, router, worker の構成。
- Cron
- PPPoEで回線繋いでるので、PPPoEの認証してるルータが落ちるとchatagiriii.comに紐づいてるIPアドレスが変わっちゃう
- chatagiriii.com上のサービス全断になるので、定期的に権威DNSのgoogle cloud dnsさんに、外からみたIPアドレスを通知するcronを仕込んだ。
- NFS
- Worker Nodeの皆さんがPersistent Volumeを使う時用のNFS volume
- 母艦ホストに乗ってて、'/' とか '/home' を展開してる1TBのSSDを、LVMで500GBぐらい追加で切る。
- 切った領域はnfs用にファイルシステム作って、Worker Nodeの役割を果たす各vmにmountする。
- Mail周り
- smtp, pop/imap の通信は母艦で直で受ける。
- ↑のプロトコルに使う認証は、管理が面倒くさいので母艦のsaslをそのまま使う。
- 但し、WebメーラはKubernetes上のPodにRainloopを作って展開したいので、そこだけ母艦<=>Pod間でsaslとかpop/imapとかsmtpとかを渡せるようにがんばる。
- 監視系
- vm母艦自体の監視はprometheus+exporter+grafanaを使う。
- 同じホストに乗ってても意味ないので、監視するホストには今まで使ってたBeebox君を使う。
- keepalived
- 母艦ホストのSSHポートの死活簡易をして、落ちてたら外からのSSHの向け先をBeeboxくんにするための仕組み。
- 母艦になんかあった時でもとりあえずおうちネットワークに入る為につかう。
今お家で動いているコンポーネントの解説は以上ですね。
おうちk8sいいわね
おうちインフラは上に書いた図の通り動いていて、おうちk8s上では49Podが元気に動いているようです(2020/12/16)
@母艦
$ kubectl get pods -A | wc -l
49
構築手順はまだまだまとめてる所なので、次はどんなPodを動かしているか紹介する記事をアドカレに合わせて書きたいとおもいます。