RancherOSでESXi上にk8sクラスタを構築する

Posted by jolantern on Wednesday, October 13, 2021

訳あって作っていたRailsアプリが、訳あってHerokuとかで動かせないことにきづいた。仕方ないので、自宅のESXi上で動かそうとしていたのだが、DBのセットアップとかRubyのビルドとかを頑張るのがめんどくさい。DockerとHerokuに飼いならされてきたのを感じる。インフラをやりたいみたいなモチベーションはなくて、やりたいことやるために必要だから自宅サーバがあったりするだけなのだが、メモリなどはそれなりに積んでいたのが功を奏した。

色々検討して、Openshift Container Platformとかmicrok8sとかでいいかなと思ったのだけどなんか思ったように動かなかったのでRancherOSとRancherを使ってみることにした。Openshift Container Platformに関しては、なぜか常にCPUをバカ食いし始めてしまい、それさえなければ面白そうだっただけに残念。

RancherOS

RancherOSは、Dockerとかを動かすのに特化したというか、それだけ動かす前提で軽量化されたLinuxみたいなイメージ。あんま詳しくは調べていないのだが、だいたいそんなふうに書かれてる。GitHubからダウンロードしたISOを普通にESXi上のVMにインストールすればいいっぽかった。

RancherOSの最新はLinux Kernel 4.x系なので、それを指定したVMを作って起動したのだけど何故かISOをうまく読み込まない。3.x系を前提にしたVMだと普通にインストールできて、後から4.x系に切り替えても問題はなかった。

Rancherのインストール

インストールというかDockerコンテナを立ち上げるだけなのだが

フォルダ作ったりしてるのは別に必須ではないんだけど、一回Rancherのコンテナを飛ばしたらユーザの情報とか消えてしまったので対策としてやっている。Dockerなんだから当たり前なんだけど何故か1度やってしまった。冗長性のあるストレージに置いたほうが良い気はする。

これで https://rancher-master-ip:8443 にアクセスするとRancherの管理画面が見える。初期パスワードなどはこのコンテナのログに含まれていて、それの抽出の仕方もログイン画面に出ているので難なくログインできた。

Workerの追加

Rancher自体はシングルノードでk8sを動かすことは可能なのだが、せっかくリソースがあるしworkerを追加する。もう1つRancherOSを入れたVMを用意して

こんなのを実行する。workerを追加するのに必要なコマンドはRancherの画面からCluster Management -> Createでk8sクラスタを作る画面をたどっていくと表示されるのをコピペすると良い。

etcdとcontrol planeの追加

k8sが動くのに必要。これもworkerの追加と同じようにRancher上でコマンドが閲覧できるのでそれをコピペする。今回はmaster nodeで動作させた。

etcdがうまく立ち上がらない場合

なんか証明書のエラー出てうまくクラスタに入ってきてくれなかったことがあった。

なんだろなとググってるとhttps://github.com/rancher/rancher/issues/21514 にたどり着いた。/opt/rke/etc/kubernetes/ssl を掃除するとなおったっていうので、まぁ壊れてもいいやと思って sudo rm -rf /opt/rke/etc/kubernetes/ssl したら動いた。

kubectlで外部から弄る

kubectlでリポジトリ上のyamlでアプリケーションをデプロイするようなことがしたい。 クライアントの ~/.kube/config に設定を置く必要があり、rancherはWebGUIからダウンロード可能。

赤で囲ったボタンがそれ。WebGUIはバージョンごとに結構ガッツリ変えてるっぽくて既存の記事とかがあんま参考にならなかったので、この記事のスクショもあんまり丁寧に取るつもりがなかったのだが、これだけはどこにあるのかわからなくて迷ったのでメモしておく。隣のいかにもターミナルっぽいアイコンはkubectlが打てるShellが起動します。

どうしようかと思ってることと感想

これでk8sのクラスタを作ることはできたのだが、そもそものRancherOSの構成管理はどうするのが良いんだろうな。実質的には、rancherユーザのパスワードを設定してssh出来るようにしたいとか、iptablesの設定をどうするとか ros console switch してお好みのディストリビューションのコンソールを使うとかしたくなるんだけど、それはcloud-init.yamlにかいて置けばいいので、管理する対象はrancherを起動するコマンドだけになるんだろうか。それはそれで便利だけど、お家でやるならドキュメントに残す以上のモチベーションはないな。

自宅サーバでRailsとか、定期ジョブとかをいい感じに動かす物ができて便利だけど、そういうのを動かしてると当然なくしたくないデータが蓄積するわけで、これESXiが動いてるホストが壊れたらどうするつもりなのか…何も考えていないな。バックアップは取るけども。とはいえansibleとかpuppetで構成管理を頑張るより、個人的にはk8sのマニフェストを書いて動かすほうが楽だった記憶があるのでこれでいいかな。k8sを使ったことはあってもクラスタの世話はしたことないから、色々苦労はありそうだけど。ところで、Rancherの特色かつ強みであるGUIからマーケットプレイスからアプリをデプロイできるのを何もしてないので、これもそのうちためそう。

今の職場に転職する前に1度RancherOSとRancherは試したことがあったのだけど、なんかいまいちよくわからなくて面倒になってぶん投げたことがあったのを思い出した。今回一番詰まったのは先に書いたKernelのバージョンどおりにVMを構築すると起動しないってところだったので、当時よりは扱えるようになってるようだ。