Weave Fluxを利用してGKE環境のCDを構築した
Weave Flux(https://github.com/weaveworks/flux)を利用して、GKE環境のCDを構築しました。 k8sでアプリケーションの継続的なデプロイを実現しようと思うと意外と考えないといけないことが多く、Fluxはよい解決策に思えました。
解決したかった課題
解決したかった課題としては、
です。
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のよいところ
シンプルでメンテがほぼ不要なところがよいです。
気をつけないといけないところ
マニフェストの削除にはまだ対応していません。なので、レポジトリからあるリソースを管理するマニフェストを削除しても、そのリソースはずっと残ってしまいます。
レポジトリに存在していないリソースを消していいかというと、そうじゃない場合もありそうなのでなかなか難しいところ。。