以前から興味があった自宅プライベートクラウドを立てちゃいました。その記録です。
経緯
所属部署がマルチクラウド / ハイブリッドクラウドを推していることもあり、 お仕事でKubernetes、OpenShift on プライベートクラウド(vSphere)、VMware系のソリューション関わることが増えてきました。 仕事で必要となると「自宅にプライベートクラウドあったら便利じゃね?」と思うわけです。
実は別の用途で先にIntel NUCは手元にあったので、これを使ってプライベートクラウドを立てることにしました。 正直勢いで進めちゃいましたが、楽しいです。
my new gear... pic.twitter.com/iXKUEcWnIu
— ぽんず (@ponzmild) 2021年10月1日
構成
最終的な構成は以下の通りです。
物理構成
コンポーネント | スペック |
---|---|
Intel® NUC 11 Performance Kit | NUC11PAK5i |
ACアダプタ用電源ケーブル | サンワサプライ 電源コードACインレット 1m KB-DM3S-1 |
SSD | Samsung 970 EVO Plus 500GB MZ-V7S500B/EC |
メモリ | Samsung 32GB DDR4 2666MHz × 1 |
※ メモリ1枚挿しの理由はAmazonで安かったのと、予算的に2枚買えなかったためです
論理構成
コンポーネント | 実装 | バージョン | スペック |
---|---|---|---|
ハイパーバイザー | VMware ESXi | 7.0 Update 3 | NUC用のネットワークデバイスを同梱したISOイメージから構築 |
コンテナオーケストレーター | Kubernetes | v1.21.6 | コンテナランタイム=containerd, Network Plugin=Calico, Load Balancer=MetalLB |
Kubernetes Master Node VM | Ubuntu Server | 20.04 LTS | 1台, vCPU = 2, Memory = 8192GB, Disk = 20GB |
Kubernetes Worker Node VM | Ubuntu Server | 20.04 LTS | 3台, vCPU = 2, Memory = 8192GB, Disk = 20GB |
実際の構築
ESXi on Intel NUC
Intel NUCの上にESXiを載せる構成はインターネットで検索すれば多くヒットします。 構築手順は以下の記事を参考にさせていただきました。ESXiのバージョンは違いましたが差異はなくこの手順で出来ました。
Kubernetes on ESXi
続いてKubernetesクラスタを立てる手順です。 先にESXiの上にLinuxのVMを立てる必要があります。 今回VMはUbuntu Serverのインストーラーで1つずつ立てています。 調べてみるとVM構築もvCenter Serverやcloud-initを使えば自動化できそうなのですが、 最速で検証環境を立てたいので一旦作業スコープ外としました。
さて、VMさえ立ててしまえばKubernetesクラスタの構築手順はいくつか選択肢があります。
個人的にはAnsibleを使う機会が増えてきたので、Kubesprayを採用しています。 事前にAnsibleのPlaybookの形でKubernetesクラスタの構築方法がコード化されているため、安心して作って壊すことができました。 新規でクラスタを立てるのに15分ほどかかりますが、3回ほどKubernetesクラスタを壊して作るを繰り返しているもののストレスなく作業できています。
手順は以下の記事を参考に進めました。
実は最初kubeadmで最初進めていたのですが、 VM側の設定・考慮すべき項目があまりにも多かったこと、何度もクラスタを作り直す時に再現性のある方法で構築したいという理由があったので採用を見送りました。
つまづきポイント
ここからは自宅プライベートクラウドの構築にあたりつまづいたポイントと自分なりの解決策を列挙します。
macOSではESXiのカスタムイメージを作れない
課題
Intel NUC上にESXiをインストールするには、専用のネットワークドライバーを含めたカスタムイメージを作成する必要があります。 そしてカスタムイメージの作成にはPower CLIと呼ばれるPowerShellのモジュールを使用します。 しかし、このPower CLIはこの記事を書いている2021/11/16現在、macOS版のPowerShellに対応していません。 つまりWindows機がないと困るわけですが、私はMacBook Proしか持っていませんでした。
解決策
AWSでWindows Server 2019のEC2インスタンスを立てて、そこでカスタムイメージを作成します。 開発用のMacBook ProとEC2間のカスタムイメージの受け渡しはS3バケットを作成してやりとりしました。
プライベートクラウドを作りたいのにパブリッククラウドを使わないといけないとは。。。
ESXiのISOイメージのUSBメモリへの書き込みが遅すぎる
課題
ESXiのカスタムイメージを作成したら、イメージのISOファイルをNUCに差し込むUSBメモリに書き込みます。
macOSの場合はRufusのようなツールを使わずとも、 dd
コマンドでISOファイルを書き込み可能です。
$ sudo dd if=/tmp/ESXi/ESXi-7.0U3-IntelNUC.iso of=/dev/disk2
しかし1時間たっても書き込みが終わらない。。。
原因
ddコマンドについて調べると、書き込みバイト数を表すbsオプションをmanで調べるとデフォルト512バイトとなっていました。 カスタムイメージは400MB以上あるので終わらないのも当然です。
read and write up to BYTES bytes at a time (default: 512)
解決策
bsオプションで大きめの値を指定すればOK。
$ sudo dd if=/tmp/ESXi/ESXi-7.0U3-IntelNUC.iso of=/dev/disk2 bs=512k
Kubernetesクラスタの各NodeのVMにどれだけメモリを割り当てれば良いの?
課題
ESXiをインストールし、VMも立てたらKubernetesクラスタを構築です。 Kubesprayで何度も作り直しできるとはいえ、Kubernetesクラスタが動作する十分なリソースが分からないと好きな時にリソースを払い出すプライベートクラウドの特徴を活かせません。 特にメモリは32GB 1枚挿ししかしていないので、果たしてこれで足りるのか心配です。
原因
リソースが足りているのか把握するためには、何にせよ計測しないと始まりません。 「果たしてこれで足りるのか」という問いに対して答えを出せない状況だから心配になるわけです。 Metrics Serverを入れたら終わりかもしれませんが、 長時間に渡る継続的なリソース使用量の推移も把握しないと後々やっぱりリソースが足りないとなってしまいます。長期間にわたるリソース使用量の可視化も必要と判断しました。
解決策
ラッキーなことに、私はObservabilityツールの検証のために個人でNew Relic Oneのアカウントを持っていたのでNew Relicで計測することにしました。New Relic Oneは一定量のメトリクスであればインスタンス数の制限なく無料で使用できます。
しかもKubernetesクラスタのNodeとPodの使用量の計測はNew RelicのエージェントをHelmチャート経由で導入するだけで可能です。 Helmチャートのインストール自体もガイド付きなので迷うことはありません。 実際にNew Relicのエージェントを入れた後は以下のようにリソースの使用状況を参照できるので、状況を確認しながらPodをスケジュールできるくらい空きが出るようにVMとKubernetesクラスタを作り直せました。
Kubernetesクラスタを立てて数日経ったので、もう少し課題が出たら別記事を書こうと思います。
以上。