Ponz Dev Log

ゆるくてマイペースな開発日記

Intel NUC × ESXi × Kubernetesで自宅プライベートクラウドを立てた

以前から興味があった自宅プライベートクラウドを立てちゃいました。その記録です。

経緯

所属部署がマルチクラウド / ハイブリッドクラウドを推していることもあり、 お仕事でKubernetes、OpenShift on プライベートクラウド(vSphere)、VMware系のソリューション関わることが増えてきました。 仕事で必要となると「自宅にプライベートクラウドあったら便利じゃね?」と思うわけです。

実は別の用途で先にIntel NUCは手元にあったので、これを使ってプライベートクラウドを立てることにしました。 正直勢いで進めちゃいましたが、楽しいです。

構成

最終的な構成は以下の通りです。

f:id:accelerk:20211115194246p:plain
おうちクラウド 構成図

物理構成

コンポーネント スペック
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のバージョンは違いましたが差異はなくこの手順で出来ました。

zenn.dev

Kubernetes on ESXi

続いてKubernetesクラスタを立てる手順です。 先にESXiの上にLinuxVMを立てる必要があります。 今回VMUbuntu Serverのインストーラーで1つずつ立てています。 調べてみるとVM構築もvCenter Serverやcloud-initを使えば自動化できそうなのですが、 最速で検証環境を立てたいので一旦作業スコープ外としました。

さて、VMさえ立ててしまえばKubernetesクラスタの構築手順はいくつか選択肢があります。

  1. kubeadm を利用する。
  2. Kubespray を利用する。

個人的にはAnsibleを使う機会が増えてきたので、Kubesprayを採用しています。 事前にAnsibleのPlaybookの形でKubernetesクラスタの構築方法がコード化されているため、安心して作って壊すことができました。 新規でクラスタを立てるのに15分ほどかかりますが、3回ほどKubernetesクラスタを壊して作るを繰り返しているもののストレスなく作業できています。

手順は以下の記事を参考に進めました。

techstep.hatenablog.com

実は最初kubeadmで最初進めていたのですが、 VM側の設定・考慮すべき項目があまりにも多かったこと、何度もクラスタを作り直す時に再現性のある方法で構築したいという理由があったので採用を見送りました。

つまづきポイント

ここからは自宅プライベートクラウドの構築にあたりつまづいたポイントと自分なりの解決策を列挙します。

macOSではESXiのカスタムイメージを作れない

課題

Intel NUC上にESXiをインストールするには、専用のネットワークドライバーを含めたカスタムイメージを作成する必要があります。 そしてカスタムイメージの作成にはPower CLIと呼ばれるPowerShellのモジュールを使用します。 しかし、このPower CLIはこの記事を書いている2021/11/16現在、macOS版のPowerShellに対応していません。 つまりWindows機がないと困るわけですが、私はMacBook Proしか持っていませんでした。

解決策

AWSWindows 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は一定量のメトリクスであればインスタンス数の制限なく無料で使用できます。

newrelic.com

しかもKubernetesクラスタのNodeとPodの使用量の計測はNew RelicのエージェントをHelmチャート経由で導入するだけで可能です。 Helmチャートのインストール自体もガイド付きなので迷うことはありません。 実際にNew Relicのエージェントを入れた後は以下のようにリソースの使用状況を参照できるので、状況を確認しながらPodをスケジュールできるくらい空きが出るようにVMKubernetesクラスタを作り直せました。

f:id:accelerk:20211116203642p:plain
Kubernetes Nodeのリソース使用状況

f:id:accelerk:20211116203757p:plain
NodeとPodの状況


Kubernetesクラスタを立てて数日経ったので、もう少し課題が出たら別記事を書こうと思います。

以上。