ラズパイでVMware ESXiを構築して運用した話

この記事はKyash Advent Calendar 2021の18日目の記事です。

こんにちは。KyashのPaymentチーム佐藤です。KyashではVisaやQUICPayの決済基盤の開発をしております。

去年はラズパイでおうちk8sを構築した話をさせていただきましたが、今回はそのラズパイクラスターにラズパイ4を1台増設してARM版VMware ESXiをインストールしてみましたので動機や構成そして用途について書いていこうと思います。いわゆる感想文ってやつですね。

前回同様、構築方法などはWeb上に大量に上がっているので今回は省かせていただこうかと思います。

f:id:ar_ciel_sa2:20211217171205j:plain

なぜ作ろうと思ったのか?

去年構築したラズパイk8sクラスターにアプリケーションをデプロイしていてコンテナの世界の中でk8sだけあるというのは不便さというか物足りなさがありました。

自作k8sにアプリケーションをデプロイするには以下の作業が必要です。

  1. CIでアプリケーションをAArch64用にビルド
  2. AArch64用のコンテナイメージ作成
  3. コンテナレジストリーにプッシュ
  4. k8sクラスターにデプロイ

このプロセスの中にはアプリケーションをビルドしたりコンテナイメージをビルドするCIや、ビルドしたコンテナイメージを保持しておくコンテナレジストリーという登場人物が居ます。つまり、k8sだけあってもその他のエコシステムが無いときちっとした実運用にはならないのです。 もちろんCircle CIやGitHub ActionsなんかでAArch64用にアプリケーションをビルドして、docker buildxでビルドすればローカルでもAArch64用のコンテナはできますし、コンテナレジストリーもDocker Hubを使ったり、k8s上にregistryを配置すれば解決できます。

でもせっかくならCIもコンテナレジストリーも専用ワークロードに自前で持ちたい、構築したいと想い始めました。k8sを構築したときからハイパーバイザーの構築もやってみたいと思っていたので1台ラズパイを増設してハイパーバイザーを構築するかーとなりました。

ハイパーバイザーの選定

ハイパーバイザーはVMware ESXiを選びました。 ESXiを選んだ理由は本当にシンプルで「ラズパイ ハイパーバイザー」で検索したときにファーストビューで目についたからです。 目についてからサクッと構築してしまったので、他のハイパーバイザーについてはあまり調べてないのですが、KVMとかを検討しても良かったかもと後で思っています。

しかし、ファーストビューに目につくだけあり公式ページの情報は充実してますし、ブログなどの情報量はかなりのものでした。 そういう点ではVMware ESXiを選んで良かったかもしれません。

追加で買ったパーツとか構成とか

VMware ESXi をラズパイにセットアップするのに必要なものは以下のとおりです - Raspberry PI 4 model B 8GB - 4台目のを買ってしまった - microSDXCカード - UEFI用なので容量は少なくてOK - USBメモリ - インストーラー用 - 128GB以上のUSBストレージデバイス - VMware ESXi のインストール先 - 128GB のSSDを購入 - 128GBシステム領域パーティションで確保されるので、128GB以上のものを買えばよかった - 追加でもう一つUSBストレージデバイス - 上記の通り、128GBをシステムに確保されてしまうのでVMのストレージなどの用途でもう一個ストレージが必要になった - 手持ちの500GBのHDDをつけた

セットアップ後の構成は以下のようになります

f:id:ar_ciel_sa2:20211217173859p:plain

上述の通りではあるのですが、VMware ESXi 本体はUSB1につないだSSD 128GBに入ってます。Micro SDはUEFI用です。USB2につながっているHDDはVMのデータや、OSイメージなどの保管場所です。

USB2につけているHDDはアクセスが低速で、クラスターに綺麗にまとめられていないので見た目もあまり良くないなぁと感じています。ここはNASにしてiSCSIなどでつなぎたいところです。

実際に使ってみた

f:id:ar_ciel_sa2:20211217174026p:plain

CIにjenkins、コンテナレジストリ公式のregistry、DBにPostgreSQLを使っているのですが、jenkinsはそのままjenkinsインスタンスへ、コンテナレジストリとDBはstorageインスタンスに入れています。 YAMAHAルーターSSHセッションを張ってLAN内のDNSを設定できるような仕組みを作ったのですが、それをdns-managerに配置しています。

セットアップも手動ではありますが、お手軽にできます。インストールイメージをVMwareのストレージにアップロードしておけば、VMware ESXi 内部で読み出して仮想DVDドライブを反映できます。

エコシステムとして一気にまとまってきたので、プライベートクラウドを構築したような感じで楽しいですね。 やっぱりNASとかを購入してSANノードとコンピューティングノードを分けるということをしてみたくなります。 他にもKVMでも遊んでみたいなぁとも思ってます。

最後に

今回はおうちk8sクラスターにVMware ESXiを追加構築した話を書かせていただきました。k8sを実運用するのに支える要素を自由に構築できるのでかなり便利です。ラズパイのk8sクラスターをお持ちの皆さんもぜひもう1台ラズパイを追加して、ハイパーバイザーを構築してみてはいかがでしょうか?おうちプライベートクラウド感が楽しめますよ。

Kyashではサーバーサイドエンジニアを募集中です。 もしご興味などありましたらぜひカジュアル面談へどうぞ

https://www.wantedly.com/projects/793421

ラズパイでおうちKubernetesを作ってよかった件

この記事はKyash Advent Calendar 2020の10日目の記事です。

KyashのPaymentチーム佐藤です。KyashではVisaやQUICPayの決済基盤の開発をしております。 最近ラズパイでKubernetesクラスターを作ったので、今回はその感想なんかを書いていこうかなぁと思います。 詳しい構築方法などはWeb上に大量に上がっているので今回は省かせていただこうかと思います。

f:id:ar_ciel_sa2:20201210100531j:plain

なぜ作ろうと思ったか?

個人的な理由

まず個人的な理由としてはKubernetesは昔ちょこっと触っただけで業務でも触れる機会がなかったので触ってみたいなぁと思っていました。またCKADを取得しているマネージャーとの1on1でKubernetesの話をしたりと自分の中でKubernetes熱が高まってきたというのがありました。

GKEなどマネージドサービスを使っても良かったのですが、「構築もやってみたい!」、「家にあればほぼ無料で使える!」などメリットが大きかったのでおうちKubernetesクラスターを作ることにしました。 (あと一家に一台Kubernetesクラスターの時代って言ってみたかった。。。)

Kyashのエンジニアとしての理由

KyashのエンジニアとしてもKubernetesクラスターを作ってKubenetesを触りたいと思う理由があり、Kyashでは基本的にECS on FargateもしくはEC2でインフラを構築しておりKubernetes本番運用しておりません。しばらくはアーキテクチャを大きく変えることはないかもしれませんが、今選択しているアーキテクチャが適切かどうかを判断するには各アーキテクチャを知る必要があると思います。 昨今ではKubernetes上で動いているプロダクトも増えてきています。一旦自分たちのプロダクトを見直すという意味でもKubernetesの知見を得ておくことはかなり良いのでは?と思い個人的にもKyashのエンジニアとしても美味しいアクションだろうということでやってみることにしました。

買ったパーツとか

f:id:ar_ciel_sa2:20201210100612p:plain

ラズパイ3台でクラスターを構築しました。 ラズパイ自体は公式代理店で購入しましたが、それ以外は基本的にアマゾンで揃えることができます。 僕は持っていたのですがSDカードリーダーやminiHDMI <-> HDMI変換ケーブルが必要になるでしょう。

構築するときに苦労したこと

構築するにあたっておうちKubernetesの先輩方の知恵を借りることが多かったのですが、なにか他の人がやってないことをやろうかなぁと思い、使ったことのないAnsibleを使ってある程度まで構築するようにしようと思っていました。

以下の内容を自動でセットアップできるようにAnsibleを用意しました。

  • セキュリティ周りの設定
  • debパッケージのアップデート
  • docker、kubectl、kubelet、kubeadmのインストール
  • swapの無効化などkubeadmの立ち上げ要件を満たすための作業

設定を複数台にあてる場合、同一の作業をするのは面倒くさいのでやってよかったです。

ちょっと荒削りで鍵情報などを載せたままだったりするので、そこらへんを解決したら公開しようと思います。

勉強になったこと

Ansibleの勉強になった

全然Kubernetesとは関係無いのですが、Ansibleを使うことが出来たのでAnsibleについての勉強ができました。ベストプラクティス集を読んでどんな構成にすべきか?などの知見を得られました。

Ansibleベストプラクティス集

Ansibleの練習台としてもラズパイを1台持っていてもいいかもと思いました。

コントロールプレーンへの知見が深まった

GKEなどマネージドサービスで運用してるとコントロールプレーン側を多分意識しなくて良いのかな?と思っているのですが、構築の場合嫌でもコントロールプレーンを意識する必要があるので公式ドキュメントでコントロールプレーンについて調べることが多かったです。

以下の内容は僕にとって新発見でした。

  • kubectlでコマンドを叩くとkube-api-serverが受け取っていたり、ほぼ全操作がkube-api-serverを経由している
  • cloud-controller-managerの存在
    • 当然クラウド基盤とのやりとりも必要なのですが、そのやり方までしっかり考慮されていてさすがだと思った
  • kube-schedulerによるPodの割当
    • Podが要求するリソース量やデータの局所性など色々な条件を考慮してノード選定をしていることがわかった

構築作業自体が公式ドキュメントを読むモチベーションになったので、こういったカタチでとっかかりになったのは良かったです。

kubeadmという便利な存在を知った

kubeadmは構築に必要な作業を色々やってくれます。kubernetesクラスターをかんたんに構築できます。

kubeadmがやってる作業はかなり多いですが、一部列挙するとこんな感じです。

  • preflight check
  • kubeletの起動
  • 証明書作成
  • コンフィグ作成
  • コントロールプレーン起動
  • etc...

今度これらを手動でセットアップしたいなぁと思いました。

どう利用していくのか?

現在コンテナレジストリと実験用のアプリケーションしか配置してないですが、勉強のために色々やっていきたいと思っています。特にやりたいのは Blue/Green デプロイ化とCRIの差し替えです。 得た知見を社内の勉強会で発表していったりもしたいと思っています。 熟練度が上がってきたらCKAの認定試験を受けてみたいです。

最後に

今回はおうちKubernetesを構築したときの話を書かせていただきました。 おうちKubernetesは構築するだけであれば簡単にできます。ぜひみなさんも一家に一台Kubernetesクラスターを持ってみてはいかがでしょうか?