流行りにはとりあえず乗っとく。乗ってから考える。
クソザコエンジニアのjaramonです。 今流行りのGitOpsについて運用し始めましたので、紹介したいと思います!
読者対象
- Kubernetesの基本的な用語を知っている方
- GitOpsを実運用してみようと考えている方
GitOpsとは?
Weaveworks社が提唱する、CI/CDパイプラインの概念の様なものです。 簡単に言うと、Git上に必要なコードが全てが存在する前提のもと、Git上のコードをpull型でそのままデプロイしちゃおう!!という感じです。 Kubernetesの 宣言的な構成 と相性が良さそうですね。
Fluxとは?
Kubernetesの環境を、Git上に存在するManifestの状態に維持し続けてくれるツールです。 KubernetesのManifestがすでに 宣言的な構成 になっているので、 ManifestだけをGitのリポジトリで管理すればそれ自体が 宣言的な構成 だから、常にGitの状態にすればええやん!!って感じです。
構築したデプロイフローを紹介します
基本はGitFlowです。大体はCircleCIで実施してます。
登場ブランチ
- AppRepo(アプリケーションリポジトリ)
- develop
- feature
- release
- master
- ManRepo(マニフェストリポジトリ)
- staging
- production
デプロイフロー
AppRepo:developからAppRepo:featureを作成して適宜修正
AppRepo:featureからAppRepo:developにプルリクエストを作成→マージ
AppRepo:developからAppRepo:releaseを作成
CircleCIにて、AppRepo:releaseのDockerImageを作成→レジストリにプッシュ
CircleCIにて、ManRepo:stagingのDockerImageのタグ部分を修正して直プッシュ
Fluxにて、ManRepo:stagingの変更を検知して新しいDockerImageのManifestをデプロイ(ステージングリリース!!!)
AppRepo:releaseからAppRepo:masterにプルリクエストを作成→マージ
CircleCIにて、ManRepo:stagingからManRepo:productionにプルリクエストを作成→手動でマージ
Fluxにて、ManRepo:productionの変更を検知して新しいDockerImageのManifestをデプロイ(本番リリース!!!)
Pros/Cons
- Pros
- デプロイのための強い権限をCircleCIに渡す必要がなくなる(CircleCIはDocker Imageのプッシュ権限のみあればOK!)
- AppRepoとManRepoを分けることで、CIとCDを分離することができる
- 環境をリリース前に戻すことも楽にできる(Revertやタグを部分を修正してマージするだけ)
- Cons
- Canary Releaseはちょっとテクニカルなことしないと厳しそう
- Flux稼動分のリソースと、正しく動いているかを監視する必要がある
あれ。。。DBのマイグレーションは。。。?
そうですよね。その気持ち分かります。 上記のデプロイフローにマイグレーションは含まれていません。 ここは今でも四苦八苦しており、私は解決策を持ち合わせておりません。
というのも、マイグレーションに失敗した場合はリリースしたくないですよね。 つまり、ManRepo:staging、ManRepo:productionへの反映前にマイグレーションを実施して失敗したら反映を止める必要があります。 マイグレーションに必要なのは、新しいDocker ImageとKubernetesのリソースを触れる権限です。
CircleCIにKubernetesを触れる権限を渡さないといけない。。。
そして私は答えが出なかったので考えるのをやめて、CircleCIに権限を与えました。 おかげさまでGitOpsのメリットが半減してます。 (色々と考えて試したのですが、やはりうまく行かなかったのと、時間を取られ過ぎてしまったので一旦諦めました。)
本当に伝えたいことは
ECSでもKubernetesでも コンテナ運用におけるDBのマイグレーションのベストプラクティス を知っている方はご教示いただけると大変喜びます!!!
(Twitterでコメントいただけると幸いです。。。)