昨日の記事では GitOps に入門できる Flux のチュートリアル「Get started with Flux」を紹介した.次は Flux と kustomize を組み合わせて,ベースマニフェストに対して環境ごとに異なる設定値を適用する流れを学んでいく.
kakakakakku.hatenablog.com
チュートリアル「How to bootstrap Flux using Kustomize」
Flux のドキュメントに載っているチュートリアル「How to bootstrap Flux using Kustomize」は,名前の通り「kustomize を使って Flux 自体をブートストラップする」内容だった.具体的には Flux を Kubernetes の Namespace flux
ではなく,任意の Namespace に起動するだけだった.実際に試したけど,個人的には試さなくて良いと思う.
https://docs.fluxcd.io/en/1.20.2/tutorials/get-started-kustomize/docs.fluxcd.io
チュートリアル「Using Flux with Kustomize」
次に GitHub に公開されているチュートリアル「Using Flux with Kustomize」を試した.これは期待していた通り,Flux を使って kustomize build
をして環境ごとに異なる設定値を適用する流れを学べる.今回はこのチュートリアルを紹介する.
github.com
1. 事前準備
今回も Docker Desktop for Mac "Edge" を使って,以下の Kubernetes 環境で試す.昨日の記事と同じく fluxctl
コマンドも使う.
$ kubectl version --short
Client Version: v1.18.6
Server Version: v1.18.6
$ fluxctl version
1.20.2
そして,チュートリアルで使う GitHub リポジトリ fluxcd/flux-kustomize-example
をフォークしておく.ディレクトリ構成は以下となり,kustomize で使うディレクトリ (base
/ staging
/ production
) と Flux の設定ファイル .flux.yaml
がある.もしかしたら kustomize の Overlay は?と気になるかもしれない.記事の最後に書いておいた.
$ tree -La 2 .
.
├── .flux.yaml
├── base
│ ├── demo-ns.yaml
│ ├── kustomization.yaml
│ ├── podinfo-dep.yaml
│ ├── podinfo-hpa.yaml
│ └── podinfo-svc.yaml
├── production
│ ├── flux-patch.yaml
│ ├── kustomization.yaml
│ └── replicas-patch.yaml
└── staging
├── flux-patch.yaml
├── kustomization.yaml
└── replicas-patch.yaml
2. セットアップ
Namespace flux
を作り,fluxctl install
コマンドと kubectl apply
コマンドを組み合わせて Flux 環境を構築する.
$ kubectl create namespace flux
$ export GHUSER=kakakakakku
$ fluxctl install \
--git-user=${GHUSER} \
--git-email=${GHUSER}@users.noreply.github.com \
--git-url=git@github.com:${GHUSER}/flux-kustomize-example \
--git-path=staging \
--namespace=flux \
--manifest-generation | kubectl apply -f -
serviceaccount/flux created
clusterrole.rbac.authorization.k8s.io/flux unchanged
clusterrolebinding.rbac.authorization.k8s.io/flux configured
deployment.apps/flux created
secret/flux-git-deploy created
deployment.apps/memcached created
service/memcached created
$ kubectl rollout status deployment/flux -n flux
deployment "flux" successfully rolled out
なお,昨日の記事で紹介したチュートリアル「Get started with Flux」とは異なるオプションがあり,以下に載せておく.
--git-path
- リポジトリにあるディレクトリ名を指定する
- kustomize で使う
staging
or production
を指定できる
- 今回は
staging
を指定する
--manifest-generation
- マニフェストの自動生成を有効化する
- デフォルトは
false
特に --manifest-generation
は今回重要な設定となり,リポジトリ直下に置いてある .flux.yaml
ファイルを使ってマニフェストを自動生成する.今回リポジトリに用意されていた .flux.yaml
は以下となり,やっと kustomize build
コマンドとの関係を確認できる.ここで実行していたんだ!
version: 1
patchUpdated:
generators:
- command: kustomize build .
patchFile: flux-patch.yaml
なお .flux.yaml
に関しては,以下のドキュメントに詳しく載っている.
https://docs.fluxcd.io/en/1.20.2/references/fluxyaml-config-files/docs.fluxcd.io
3. アクセス権限の設定
昨日の記事と同じように GitHub リポジトリの Deploy keys に公開鍵を追加する.Allow write access にもチェックを入れておく.
$ fluxctl identity --k8s-fwd-ns flux
ssh-rsa xxx
4. 動作確認
少し待てば Flux によって Namespece demo
にアプリケーションが起動される.ポートフォワードをすれば http://localhost:9898
にアクセスできるようになり,実際に curl
をすると JSON が返ってくる.
$ kubectl -n demo get pods
NAME READY STATUS RESTARTS AGE
podinfo-649f78fc4b-m8n78 1/1 Running 0 105s
podinfo-649f78fc4b-w5l75 1/1 Running 0 47m
$ kubectl -n demo port-forward deployment/podinfo 9898:9898
$ curl http://localhost:9898
{
"hostname": "podinfo-649f78fc4b-m8n78",
"version": "1.4.4",
"revision": "1c3bf10",
"color": "green",
"message": "greetings from podinfo v1.4.4",
"goos": "linux",
"goarch": "amd64",
"runtime": "go1.11.6",
"num_goroutine": "8",
"num_cpu": "2"
}
チュートリアル手順では動作確認もなく,今回は Horizontal Pod Autoscaler リソースの minReplicas
と maxReplicas
を確認することにする.GitHub リポジトリの構成を見る限り,staging 環境には Horizontal Pod Autoscaler の設定はなく,base
の設定をそのまま使う.実際に kubectl
で値を確認しても minReplicas: 1
と maxReplicas: 2
になっている.
Key |
base |
staging |
production |
minReplicas |
1 |
- |
2 |
maxReplicas |
2 |
- |
4 |
$ kubectl -n demo get horizontalpodautoscalers.autoscaling
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
podinfo Deployment/podinfo <unknown>/99% 1 2 2 100m
5. マニフェストの修正
さっそく staging/replicas-patch.yaml
を以下の YAML で新しく作る.staging 環境用に Horizontal Pod Autoscaler リソースの minReplicas
と maxReplicas
を設定している.
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: podinfo
namespace: demo
spec:
minReplicas: 2
maxReplicas: 10
また staging/kustomization.yaml
にも patchesStrategicMerge
の設定を追加しておく.やっと kustomize build をする準備が整ったため,最後に git commit
と git push
をする.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../base/
patchesStrategicMerge:
- replicas-patch.yaml
なお,kustomize の入門記事も前に書いているため,合わせて読んでもらえると良さそう.
kakakakakku.hatenablog.com
kakakakakku.hatenablog.com
6. 適用確認
少し待てば,Flux によって適用される.kubectl
の結果は以下のようになり,staging 環境の設定が minReplicas: 2
と maxReplicas: 10
になっている.うまく動いた!
Key |
base |
staging |
production |
minReplicas |
1 |
2💡 |
2 |
maxReplicas |
2 |
10💡 |
4 |
$ kubectl -n demo get horizontalpodautoscalers.autoscaling
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
podinfo Deployment/podinfo <unknown>/99% 2 10 2 100m
7. リソース削除
チュートリアル手順には載っていなかったけど,最後にリソースを削除しておく.以下のコマンドを使えば良いと思う.
$ export GHUSER=kakakakakku
$ fluxctl install \
--git-user=${GHUSER} \
--git-email=${GHUSER}@users.noreply.github.com \
--git-url=git@github.com:${GHUSER}/flux-kustomize-example \
--git-path=staging \
--namespace=flux \
--manifest-generation | kubectl delete -f -
$ kubectl delete namespace flux
$ kubectl delete deployments podinfo -n demo
$ kubectl delete horizontalpodautoscalers.autoscaling/podinfo -n demo
$ kubectl delete service/podinfo -n demo
まとめ
引き続き Flux に入門するために今回は Flux と kustomize を組み合わせたチュートリアル「Using Flux with Kustomize」を試した.Flux の「Manifest generation 機能」を使えば fluxd
に kustomize build
を実行させることができる.流れを把握できて良かった.1点注意点としては,kustomize の Overlay には対応していなさそうだった.Roadmap を確認したところ「Flux v2」の Goals には「Kustomize overlays」に対する言及があり,サポートされる可能性がありそう.
次は Argo CD を試していくぞー!
toolkit.fluxcd.io