11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソニックガーデン 若手プログラマAdvent Calendar 2024

Day 7

Kamal。― デプロイの仕組みについて ―

Posted at

この記事はソニックガーデン 若手プログラマ Advent Calendar 2024の7日目の記事です。


はじめに

2024年9月にRails World 2024が開催されました。Railsの創始者であるDHHの発表で、Rails 8のベータ版がリリースされました!

このリリースにより、RailsのThe One Person Framework 化が格段に前進しました。SQLiteだけで、プライマリーデータベース、キャッシュ、キュー、リアルタイム通信の機能をカバーできるようになりました。Kamal により、さまざまなところに簡単にデプロイできるようになりました。

Kamalを使って、RailsサーバーをVPSにデプロイしてみました。コマンドを叩くだけでサクッとデプロイでき、体感がとても良かったです。「Kamalを使えるようになったのはいいけど、どういう仕組みでデプロイしてるんだ?」と思ったので、本記事では、Kamalのデプロイの仕組みをまとめます。

Kamalって何?

まず、Kamalとは何なのかを簡単にまとめます。

Kamalの公式サイトを見てみると、以下のメッセージに目を引かれます。つまり、Kamal は、「物理サーバーからクラウドの仮想マシンまで、どんなところにもWebアプリケーションをデプロイすること」を目的としたソフトウェアということです。

スクリーンショット 2024-12-07 5.35.58.png

さらに、公式サイトを読み進めていくと以下の文章があります。

Kamal offers zero-downtime deploys, rolling restarts, asset bridging, remote builds, accessory service management, and everything else you need to deploy and manage your web app in production with Docker. Originally built for Rails apps, Kamal will work with any type of web app that can be containerized.

これを粗く要約すると 「Kamalは、Webアプリケーションの本番環境デプロイに関することでやりたいことを色々やってくれる」 ということです。

Kamalのデプロイの仕組み

Kamalを使ってWebアプリケーションをデプロイする際は、基本的にkamal setupkamal deployのこれらコマンドしか使いません。

デプロイ先サーバーに対して、Kamalによるデプロイを初めてする場合、kamal setupを実行します。そうすると、サーバーにKamalを使ったデプロイが環境が作られます。そして、Webアプリケーションがサーバーにデプロイされます。

デプロイ先サーバーに対して、Kamalによるデプロイをしたことがある場合は、kamal deployを実行すれば、サーバーにWebアプリケーションがデプロイされます。

デプロイの戦略

デプロイの戦略は、「デプロイ先サーバー群に対するローリングリスタート戦略」と「ブルーグリーン・デプロイメント戦略」を組み合わせたものを採用しています。

新しい変更をサーバーごとにデプロイして、各サーバーが新しいバージョンのWebアプリケーションを古いバージョンと並行して実行します。トラフィックが安全に切り替わったら、古いバージョンのWebアプリケーションを停止します。

kamal deploy実行時の処理の流れ

上記戦略を実現するために、kamal deploy実行時に以下の処理が行われます。

  1. SSHにより、ローカルマシンとデプロイ先サーバーに接続
  2. ローカルマシンとデプロイ先サーバーの両方で、Dockerレジストリにログイン
  3. ローカルマシンで、Dockerイメージをビルドして、DockerレジストリにDockerイメージをプッシュ
  4. デプロイ先サーバーで、DockerレジストリからDockerイメージをプル
  5. デプロイ先サーバーで、kamal-proxyが80番と443番のポートを受け付けているか確認
  6. 新バージョンのWebアプリケーション用のDockerコンテナーを起動
  7. 新コンテナーが GET /upへのリクエストに対して 200 OKで応答することを確認する
  8. 新コンテナーへのトラフィックがルーティングされるように、kamal-proxyに設定する
  9. 古いバージョンのWebアプリケーションが実行しているコンテナーを停止

kamal-proxyは、Kamalに同梱されているHTTPプロキシです。これにより、HTTPリクエストを適切なコンテナーにルーティングしています。

kamal-proxyにより、古いバージョンのコンテナーから、新しいバージョンのコンテナーへのトラフィックルーティングを適切に行なっています。適切なルーティングにより、ダウンタイムがない安全なデプロイを実現しています。

おわりに

本記事では、Kamalのデプロイの仕組みについてまとめました。デプロイの戦略は、「ローリングリスタート戦略」と「ブルーグリーン・デプロイメント戦略」の組み合わせたものを採用しています。その戦略をどのように実現しているのか具体的にまとめました。

この記事を読んで、Kamalを使ってみようと感じてもらえれば幸いです。


ソニックガーデン 若手プログラマ Advent Calendar 2024の8日目は@Ito-Misaki です。お楽しみに!

11
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?