koukiblog

たぶんweb系の話題

Weave Fluxを利用してGKE環境のCDを構築した

Weave Flux(https://github.com/weaveworks/flux)を利用して、GKE環境のCDを構築しました。 k8sでアプリケーションの継続的なデプロイを実現しようと思うと意外と考えないといけないことが多く、Fluxはよい解決策に思えました。

解決したかった課題

解決したかった課題としては、

  • いまクラスタに適用されているk8s manifestsが何なのかわかるようにしたい
  • kubectl applyを自動化したい

です。

Flux?

k8sクラスタに常駐するタイプのCDツールで、Gitレポジトリをポーリングして定期的にGitレポジトリにあるmanifestsをクラスタに適用してくれます。 指定したレポジトリをgit pullしてその中のmanifestsをkubectl apply するだけ、という非常にシンプルなツールです。 コンテナレジストリを監視してイメージの差し替えを自動化する機能もありますが、利用していないので割愛します。

インストール方法

公式レポジトリにデプロイ用のk8s manifestsがあるので、それを編集して kubectl apply するだけです。 github.com flux-deployment.yamlの --git-url(GitレポジトリのURL), --git-branch(ポーリングするブランチ), --git-path(マニフェストがあるディレクトリ) を変更すればほとんどの場合十分だと思います。

flux用に名前空間を分けることもできます。

kubectl create namespace flux
kubectl apply -f deploy -n flux

公式のチュートリアルが充実しています。

flux/get-started.md at master · weaveworks/flux · GitHub

レポジトリの準備

社内ネットワーク内に存在しているGithub Enterpriseを利用していたため、k8sクラスタから接続することはできません。そこで、GCPのCloud Source Repositories ( https://cloud.google.com/source-repositories ) にコードをミラーリングして対応することにしました。

FluxはデフォルトではCloud Source Repositoriesに対応していませんが、公式ドキュメントの"Using a private git"( https://github.com/weaveworks/flux/blob/master/site/standalone-setup.md#using-a-private-git-host )で紹介されている手順を利用すればCloud Source Repositoriesに接続することができます。

kustomize

kustomizeを利用してマニフェストの管理を行なっていたのですが、Fluxはkustomizeに対応していません。

僕の場合は、Cloud Source Repositoriesにマニフェストを持っていく時に kustomize build してしまい、ビルド後のマニフェストだけをコミットするようにしました。

kustomizeサポートは現在議論中のようです。

Kustomize integration support · Issue #1261 · weaveworks/flux · GitHub

出来上がったフロー

社内GHEレポジトリにコミット

CIツールでそれを検知し、kustomize build したものをSource Repositoriesにコミット

クラスタに常駐しているFluxがSource Repositoriesをポーリングし、差分があればkubectl apply

という感じになりました。

履歴も残るし、安定しているのでいまのところ満足しています。いまクラスタに適用されているマニフェストが何なのかが仕組みで保証されているのは安心度高いです。

Fluxのよいところ

シンプルでメンテがほぼ不要なところがよいです。

気をつけないといけないところ

マニフェストの削除にはまだ対応していません。なので、レポジトリからあるリソースを管理するマニフェストを削除しても、そのリソースはずっと残ってしまいます。

レポジトリに存在していないリソースを消していいかというと、そうじゃない場合もありそうなのでなかなか難しいところ。。