kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Flux と kustomize を組み合わせた GitOps 入門チュートリアル「Using Flux with Kustomize」を試した

昨日の記事では GitOps に入門できる Flux のチュートリアル「Get started with Flux」を紹介した.次は Fluxkustomize を組み合わせて,ベースマニフェストに対して環境ごとに異なる設定値を適用する流れを学んでいく.

kakakakakku.hatenablog.com

チュートリアル「How to bootstrap Flux using Kustomize」

Flux のドキュメントに載っているチュートリアル「How to bootstrap Flux using Kustomize」は,名前の通り「kustomize を使って Flux 自体をブートストラップする」内容だった.具体的には Flux を Kubernetes の Namespace flux ではなく,任意の Namespace に起動するだけだった.実際に試したけど,個人的には試さなくて良いと思う.

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 がある.もしかしたら kustomizeOverlay は?と気になるかもしれない.記事の最後に書いておいた.

$ 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 に関しては,以下のドキュメントに詳しく載っている.

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 リソースの minReplicasmaxReplicas を確認することにする.GitHub リポジトリの構成を見る限り,staging 環境には Horizontal Pod Autoscaler の設定はなく,base の設定をそのまま使う.実際に kubectl で値を確認しても minReplicas: 1maxReplicas: 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 リソースの minReplicasmaxReplicas を設定している.

---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: podinfo
  namespace: demo
spec:
  minReplicas: 2
  maxReplicas: 10

また staging/kustomization.yaml にも patchesStrategicMerge の設定を追加しておく.やっと kustomize build をする準備が整ったため,最後に git commitgit 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: 2maxReplicas: 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 に入門するために今回は Fluxkustomize を組み合わせたチュートリアル「Using Flux with Kustomize」を試した.Flux「Manifest generation 機能」を使えば fluxdkustomize build を実行させることができる.流れを把握できて良かった.1点注意点としては,kustomizeOverlay には対応していなさそうだった.Roadmap を確認したところ「Flux v2」の Goals には「Kustomize overlays」に対する言及があり,サポートされる可能性がありそう.

次は Argo CD を試していくぞー!

toolkit.fluxcd.io