技術

おうちKubernetesクラスタをつくる - 構成

ご家庭向け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 ホスト名役割RAMvCPU(core)Disk備考
c8s-master00Master Node8GB4Core200GBetcd とかkube-apiserverとかを動かすmaster node
c8s-router00Router Node4GB2Core100GBnetwork系のPodを動かす (nginx-ingress-controller とか)
c8s-worker00Worker Node8GB2Core200GBユーザ利用のPodを建てるnode
c8s-worker01Worker Node8GB2Core200GB同上
c8s-worker02Worker Node8GB2Core200GB同上

必要そうなVMは以上。
載せるディスク周りも考えてみる。どちらもlvmでlvを切って、管理はある程度楽にしながらも、できるだけ安く済ませたい。

ディスクの役割容量備考
VM用1000GBvm母艦自体にmountする。
VMに使う領域をLVMで切るストレージ。
母艦用、nfs用1000GB(を母艦用とnfs用に分ける)vm母艦自体にmountする。
母艦のファイルシステム用領域と、nfs用の領域をLVMで切るストレージ。

上記の表からまとめると、vm母艦PCに必要そうなスペックは以下な感じに。

  • CPU: 12Thread以上(=8Core16Threadかな)
  • RAM: 36GB以上
  • Disk: 合計2000GB以上

これを満たすPCを組むぞ組むぞ。

Mini-ITXなPCパーツ選定

作ったPCのスペックまとめるとこんな感じ

部位パーツ名買ったときの価格リンク備考
CPUAMD Ryzen7 3700X39,980https://amzn.to/34hJ67W8Core16Thread
マザボASRock B550-itx16,500https://amzn.to/3ajcrTkちっちゃいのがいいのでmini-ITX
グラボ玄人志向 GF-GT710-E1GB/HS3,680https://amzn.to/37o1kqhGT710. グラフィカルな処理はしないのでよわよわ。
RAMCrucial CMK32GX4M2A2666C1630,500https://amzn.to/2LAP11n32GBx2 (もう売ってなかったのでcorsairのリンク)
SSD(1)Crucial CT1000P1SSD8JP11,981https://amzn.to/2WgTQPC1TB. M.2のSSD。安い。母艦+NFS用
SSD(2)Samsung 860 QVO 1TB10,990https://amzn.to/3anI7a21TB. SATAのSSD。VM用。
電源Corsair SF45014,311https://amzn.to/3r43DGM450W. ちっちゃいのがいいのでSFX電源
CPUクーラーSCYTHE 超天3,880https://amzn.to/38nTahd意外と入る
ケースファンSCYTHE KAZE FLEX 1201,270 https://amzn.to/3nqHiRx2枚買った。明らかに静か。
ケースRAIJINTEK Metis plus7,404https://amzn.to/3r43SBGmini-itxなケース。銀色。品薄で高くなった。

こだわり的なところは以下

  • 静音性重視。
  • 消費電力をできるだけ下げる。但し、電源効率のいい電源を。
  • 邪魔になったら直ぐ避けられるように、Mini-ITXでコンパクトな感じに。

で届いたので作ると。

METISのケース、非常に小さくていいんですが、組み込むときに指が引きちぎれるぐらい狭いのでご注意ください。

パーツが届いたぞ!

クラスタ周りの構成

vm母艦となるPCが組めたので、内側の構成を考えて作る。
図にするとこんな感じ。

物理的なPCは2台。
今回作ったvm母艦ホストと、今まで使ってたBeeboxくんの2台体制にしてみました。

2020/12/16現在 のおうちkubernetes周りの内部構成
  • 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を動かしているか紹介する記事をアドカレに合わせて書きたいとおもいます。

-技術