はじめに
こんにちは、計測プラットフォーム開発本部SREブロックの渡辺です。普段はZOZOMATやZOZOGLASSなどの計測技術に関わるシステムの開発、運用に携わっています。
先日私達のチームでは、ArgoCDと拡張ツールArgoCD Image Updaterを導入した開発環境のCDリアーキテクトを行いました。本記事では、開発環境のCI/CDリアーキテクト設計とArgoCD Image Updaterの導入手順について紹介します。
ArgoCDとArgoCD Image Updaterについて
ArgoCDは、Kubernetes環境でのGitOpsを実現するためのCDツールです。Gitリポジトリで管理しているKubernetesマニフェストを監視して、Kubernetesクラスターに適用します。
ArgoCD Image UpdaterとはArgoCDの拡張ツールで、デプロイされたコンテナイメージを最新のバージョンに自動更新します。こちらはイメージを管理しているリポジトリを監視して、条件に一致した最新のイメージを検知した場合にKubernetesクラスターのコンテナイメージを更新します。
ArgoCD Image Updater導入前の課題
計測プラットフォーム開発本部のプロダクトのインフラ基盤は、EKS on Fargateで運用しており、Skaffoldを用いたデプロイを行っていました。また、GitHubで管理しているアプリケーションのリポジトリにKubernetesマニフェストも含まれていました。
例として、ZOZOMATの開発環境CI/CDアーキテクチャを下図に示します。
以下のような流れになります。
1. 対象ブランチをCircleCIのブランチフィルターの定義に追記する
2. 1.をコミットし、GitHubに変更をpushする
CircleCIのイメージビルド用のジョブが発火する
skaffold buildを実行し、イメージをビルドしてECRにpushする
ビルド時に生成されたイメージタグが記録されたjsonファイル(以下、イメージタグファイルとする)をS3にアップロードする
3. ビルド完了を待ち、CDをトリガーするスクリプトを実行する
CircleCIからCodePipelineのソースS3にソースコードをアップロードする
CodeBuildがソースとイメージタグファイルをS3から取得し、Skaffoldを使ってapplyする
4. 作業完了後、2のコミットを消す
「イメージタグファイル」について補足します。イメージビルド時にSkaffoldの--file-outputオプションを利用してイメージタグをファイルに記録しS3へ配置します。デプロイ時にS3のイメージタグファイルをダウンロードし、Skaffoldの--build-artifactsオプションでファイルを指定することで適切なタグ情報によるデプロイを実行しています。
このフローには、いくつかの問題点がありました。
- 各開発者の作業量が多く、デプロイまでに多くの時間を要する
- デプロイ先の環境を指定してCD用スクリプトを実行するため、オペレーションミスによりステージングや本番環境のCDが実行される
- 作業手順が複雑でツールも散在しているため、リバースエンジニアリングしづらく、他プロダクトへの横展開も難しい
特に作業開始からデプロイまでの時間の長さがネックでした。
また、計測プラットフォーム開発本部は複数のプロダクトを管理しているため、CI/CDは全て統一されることが望ましい状態と言えます。しかし、現状は各プロダクトで異なる手順となっているため、管理コストも大きな課題となっていました。
ここでは深く言及しませんが、GitOpsではアプリケーションのソースコードとKubernetesマニフェストを分けて管理することが推奨されています。このため、既存のGitHubリポジトリからKubernetesマニフェストを抜き出し、別GitHubリポジトリで管理するよう対応しました。
以下のような流れになります。
続きはこちら