ローカルk8sの上に色んなサービスを立てて壊す
モダンなサービス開発はとにかく入用のミドルウェアが多い。ちょっとしたものを作るだけで RDB と NoSQL とインメモリキャッシュと監視ダッシュボードが必要になってしまう。遠い記憶に RDB とキーバリューストアとキャッシュと検索とジョブキューをすべて MySQL にやらせていた牧歌的な時代もあったような気がするがもうそんな時代ではないのだった。
実際にサービスをデプロイする段ではなくローカルで開発するときにもそういったミドルウェアがないと開発自体が進まない。かと言って素の OS の上にミドルウェアを入れまくると設定ファイルディレクトリとかデータディレクトリが散逸してアンインストールやトラブルシュートの妨げになってしまう。
おそらくそういった複数のサービスをローカルに立ち上げるときによく使われるのは Docker Compose だと思う。まあそれが正着だと思う。様々なミドルウェアが Docker Compose のサンプルコードを提供している。
そんな Docker Compose にもちょっとした不満があって、開発の成果物として Docker image を作ったならば実際にサービスをデプロイする先は大抵 Kubernetes クラスターに変えないといけない。
(もしかしたら Docker Compose をプロダクション環境で使うケースもあるかもしれないが自分の周りにそういう雰囲気はなかった)
ローカル開発でしか使わない技術を覚えるのも腰が重いし、なら最初からローカルに Kubernetes クラスターを用意してその上でいろいろやればいいのでは、ということで作ったものがこれ。
これはローカル環境で Kubernetes を実行する方法の一つである kind を利用して様々なサービスを立ち上げたり壊したりできるものだ。
現在のところ以下のサービスを構築&破壊できる。
- Kubernetes Dashboard
- Grafana
- PostgreSQL
- Redis (single)
- Scylla (single)
主要な操作は Makefile に押し込んでいる。まず、クラスター自体の作成と破棄は次のようにする。何かがCPUを食いつぶしているな、というときはクラスター全体を雑に停止できる。
gist1a1da78dc3271f98fda41b05fe858954
そのクラスターの上に各ミドルウェアを立てていく(Redisの例)。
gist59f7240b34ebea34766d95e9c9d8686a
必要であれば Kubernetes Dashboard を見ることもできる(記事上部の画像)。
gist05df9585c8076ac1accd6c27c0b06f69
その他の仕様:
- ミドルウェア固有の設定ファイルは kustomize の configMapGenerator を使って投入する(Scylla がその例)。
- クラスターからホスト側に公開するポートの設定は cluster.yaml にある。
- ミドルウェアのデータをホスト側で永続化するディレクトリの設定も cluster.yaml にある。
さてこれでおよそ目的は達成できた。
- Docker Compose よりはプロダクションに近い環境で、
- 構築が面倒なミドルウェアを自由に作成し破棄できる。
と言いたいところだが問題点もある。
やはり Docker Compose の方がよかったかもしれない。