FluxでGitOps

流行りにはとりあえず乗っとく。乗ってから考える。

クソザコエンジニアの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

デプロイフロー

  1. AppRepo:developからAppRepo:featureを作成して適宜修正

  2. AppRepo:featureからAppRepo:developにプルリクエストを作成→マージ

  3. AppRepo:developからAppRepo:releaseを作成

  4. CircleCIにて、AppRepo:releaseのDockerImageを作成→レジストリにプッシュ

  5. CircleCIにて、ManRepo:stagingのDockerImageのタグ部分を修正して直プッシュ

  6. Fluxにて、ManRepo:stagingの変更を検知して新しいDockerImageのManifestをデプロイ(ステージングリリース!!!)

  7. AppRepo:releaseからAppRepo:masterにプルリクエストを作成→マージ

  8. CircleCIにて、ManRepo:stagingからManRepo:productionにプルリクエストを作成→手動でマージ

  9. 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でコメントいただけると幸いです。。。)


See also