Kubernetes のロールアウトを活用して。
この記事は、Hue Query Service がどのように構築されているのかを説明する一連の投稿です。
自動化がうまくいくと、反復的な作業から解放されると同時に、プロセスが文書化されるので、テームメンバーはより生産的に付加価値のある仕事ができるようになり、勢いを維持することができます。
さて、プロジェクトのウェブ際の更新を、ダウンタイムや手作業を伴わずに自動的に行うにはどうすれば良いでしょうか。
gethue.com と docs.gethue.com (jp.gethue.com も忘れてはいけません) の全ては、メインの Kubernetes クラスタ内の小さなコンポーネントで動作しています。コンテナはこの種の静的なウェブサイトには少々太っ腹かもしれませんが、ソースコードの変更によって自動的に駆動し、全てのサービスが全く同じ流れに沿って調和するという便利なパターンを可能にしています。
例えば demo.gethue.com では、デモウェブサイトで提供されている他のデータベースエンジンと同様に、同じデプロイのロジックを再利用しています。これらのウェブサイトも UI ではなく、GitHub のコードの変更によって駆動されます。
例えば、以下は実行中のウェブサイトです。
kubectl get pods -ngethue
NAME READY STATUS RESTARTS AGE
docs-55bf874485-vjnlf 1/1 Running 1 8h
website-5c579d4dd-kqlvt 1/1 Running 0 60m
website-jp-964f9cc57-h97gz 1/1 Running 0 6h38m
最近まで、毎日の再起動を「難しい方法」で行っていました。
kubectl delete pods -ngethue `kubectl get pods -ngethue | egrep ^website | cut -d" "-f1`
これは「動作する」のですが、必要のないダウンタイムや「ノイズ」が発生します。
「Website is down」という通知に悩まされる
現在、標準的な Kubernetes のrollout コマンドが使用されており、管理者や一般ユーザにとって等価的な移行となっています。
kubectl rollout restart -ngethue deployment/website
ロールアウトをデモするKubernetes のドキュメント からの最初の図
新しいwebsiteinstance/pod を起動し、準備ができたら古いものと入れ替えます。
kubectl get pods -ngethue
NAME READY STATUS RESTARTS AGE
docs-55bf874485-vjnlf 1/1 Running 1 13h
website-75c7446d4c-z5p6g 0/1 Running 0 6s
website-bb6fc6b6-nkzqh 1/1 Running 0 18m
website-jp-964f9cc57-h97gz 1/1 Running 0 11h
ここでは latest タグが使用されていますが、毎日レポジトリのミラーが同期されると新しいイメージが構築されることにご注意ください。静的ウェブサイトのイメージのビルドは非常にシンプルで、失敗したり誤ったイメージを送信する可能性は非常に低いです。適切なタグ付けを行うことで全ての状態がバージョン管理され、失敗したアップグレードは自動的に以前の有効な状態にロールバックされます。
現在の要件は「100%自動化された、できる限りシンプルなものを毎日の頻度で」です。しかし、もっと「リアルタイム」にロールアウトしたいとしたらどうでしょう?(例えば各コミットやプルリクエスト、あるいは1時間ごと)これは計画中で、後続のブログ記事で詳しく説明します。
ご意見や質問がありましたらお気軽にこちら、あるいは Discussions までコメントして下さい。quick start で SQL をクエリして下さい!
ご意見やアドバイスがありましたらお気軽にコメントお願いします!
Romain from the Hue Team