こんにちはGANMA開発エンジニアのorehahtiyaです。これは FLINTERS advent calendar 2022 6日目の記事です。
この記事ではfluxcdを導入してk8sイメージの更新を自動化したことについて説明します。これによってGANMAアプリのデプロイを少し楽にすることができました。
fluxcdとは
fluxcdはk8s上で動作するアプリをGitOps形式でデプロイしやすくするためのツールです。
GitOptsとはインフラの設定コードをgitリポジトリ上で管理(IaC)しgit上の操作(commitやmerge等)が行われたタイミングで自動的に実際のインフラとの同期を取るという考え方です。インフラの状態をロールバックしたい場合なども、インフラを直接操作するのではなく設定コードを管理しているgitレポジトリでrevertなどを行いロールバックします。他のGitOpsの考え方を採用しているツールとしてはArgo CD などがあります。
またfluxcdには設定コードと実際のインフラとの間の状態を同期する機能の他にもimage registryを監視して設定コードに書かれたイメージタグを自動で書き換える機能 もあります。
設定コードと実際のインフラとの間の状態を同期する部分に関してGANMAではhelmfile を使用しているため、今回はイメージタグを自動で書き換える機能だけを使いデプロイの自動化を進めました。
GANMAでのデプロイ手順
GANMAで運用しているアプリは大多数がk8sで運用されていて、上図のような手順でデプロイを行っています。
- app repositoryのメインブランチにマージリクエストがマージされると自動でgitlab jobのタスクがトリガーされコンテナイメージのビルドとECRへのプッシュが行われます。
- デプロイ担当者がpushされた最新イメージのタグを確認します
- 2で確認したタグでk8s config repositoryに記述されているイメージタグを書き換えます。
- k8s config repositoryのgitlab jobをトリガーし、helmfile applyを実行して設定コードの変更をEKS Clusterに反映させます
GANMAはDeploymentリソース を使ってデプロイを行っているので 3ではDeploymentリソース中の .spec.template.spec.containers.image
の箇所を書き換えます。
fluxcdによるデプロイ手順の改善
fluxcdを使って上図のようにデプロイ手順を改善しました。図の通り手順2と3をfluxで自動的に行うようにしました。
実際にはfluxcd自体もEKS Cluster上で動作しているのですが、分かりやすさのために図では別々にしています。
fluxcdは定期的にECR registryをscanし新しいイメージタグが発見されたタイミングで、k8s config repositoryにタグを書き換えるコミットを行います。どのようなポリシーで設定コード中のどの部分に書かれているイメージタグを書き換えるのかはマーカーによって指定します(https://fluxcd.io/flux/guides/image-update/#configure-image-updates) 。
fluxcdのインストールや詳しい設定方法は公式ドキュメントを参照してください(https://fluxcd.io/flux/guides/image-update/) 。
まとめ
fluxcdを導入することによりデプロイの手間を減らすことができました。また自動化によって人的ミスも起こりにくくなったと思います。 k8sを使っていてデプロイを宣言的&自動的に行いたい方はfluxcdやArgo CDなどのGitOpsツールの導入を検討してみると良いと思います。