先週の記事に続き kustomize の Examples を試していく.前回は「helloWorld」を試した.今回は ConfigMap リソースでローリングデプロイのような挙動を実現できる kustomize の configGeneration
を試す.
前提
今回も Docker Desktop for Mac "Edge" を使って,以下の Kubernetes 環境で試した.
$ kubectl version --short Client Version: v1.18.6 Server Version: v1.18.6 $ kustomize version --short {3.8.1 2020-07-16T05:11:04+01:00 }
Examples「configGeneration」とは?
kustomize で ConfigMap リソースを書き換える方法は「2種類」ある.
kustomization.yaml
のpatchesStrategicMerge
構文を使う(マニフェストを指定する)kustomization.yaml
のconfigMapGenerator
構文を使う(kustomization.yaml
自体に書く / 1. と組み合わせもある)
Examples「helloWorld」 で試したのは「1番目 (patchesStrategicMerge
)」だった.ポイントは ConfigMap のリソース名で,具体的には staging-the-map
や production-the-map
など,プレフィックス以外は固定される.これ自体は全く問題ではないけど,例えば環境変数として読み込んだ ConfigMap の更新を自動的に反映できなかったりする(正確には Volume マウントをすれば,自動的に反映できる).
そこで「2番目 (configMapGenerator
)」を使うことにより,ConfigMap のリソース名にハッシュを含めて,結果的にローリングデプロイのような挙動を実現できるようになる.イメージとしては Deployment と ReplicaSet の関係のような感じ!さっそく試していく.
1. 事前準備
まず,作業ディレクトリと「ベースマニフェスト」を置く base
ディレクトリを作る.前回と同じ.
$ DEMO_HOME=~/configGeneration $ BASE=${DEMO_HOME}/base $ mkdir -p ${BASE}
2. マニフェストと kustomization.yaml
を作る
次に GitHub に公開されている Deployment / Service リソースのマニフェストを base
ディレクトリにダウンロードする.そして,共通で使う kustomization.yaml
を作り,さらに staging 環境用の overlays
ディレクトリに ConfigMap のマニフェストと kustomization.yaml
を作る.最終的な tree
コマンドの結果も載せておく.
$ curl -s -o "${BASE}/#1.yaml" "https://raw.githubusercontent.com\ /kubernetes-sigs/kustomize\ /master/examples/helloWorld\ /{deployment,service}.yaml" $ OVERLAYS=${DEMO_HOME}/overlays $ mkdir -p ${OVERLAYS}/staging $ tree . . ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays └── staging ├── kustomization.yaml └── map.yaml
次に,作ったマニフェストと kustomization.yaml
を詳しく見ていく.
overlays/staging/map.yaml
まず,overlays/staging/map.yaml
は,staging 環境用の ConfigMap リソースを管理するマニフェストで,リソース名は the-map
となる.管理するキーとしては altGreeting
と enableRisky
を定義してある.
apiVersion: v1 kind: ConfigMap metadata: name: the-map data: altGreeting: "Have a pineapple!" enableRisky: "true"
base/deployment.yaml
次に base/deployment.yaml
で Deployment リソースのマニフェストを確認する.ポイントは env
のところで,configMapKeyRef
を使って,上に載せた ConfigMap リソースの the-map
を参照している.
apiVersion: apps/v1 kind: Deployment metadata: name: the-deployment spec: replicas: 3 selector: matchLabels: deployment: hello template: metadata: labels: deployment: hello spec: containers: - name: the-container image: monopole/hello:1 command: ["/hello", "--port=8080", "--enableRiskyFeature=$(ENABLE_RISKY)"] ports: - containerPort: 8080 env: - name: ALT_GREETING valueFrom: configMapKeyRef: name: the-map key: altGreeting - name: ENABLE_RISKY valueFrom: configMapKeyRef: name: the-map key: enableRisky
base/kustomization.yaml
今度は base
ディレクトリに置いた base/kustomization.yaml
を確認すると,configMapGenerator
という構文があり name
と literals
から構成されている.ConfigMap リソース名は合わせて the-map
にしておく.今回は kustomize build
を実行して overlays
の map.yaml
で書き換えるため,literals
の値は書き換えられてしまう.
commonLabels: app: hello resources: - deployment.yaml - service.yaml configMapGenerator: - name: the-map literals: - altGreeting=Good Morning! - enableRisky="false"
configMapGenerator
では,他にも behavior: [create|replace|merge]
や generatorOptions
など,オプションは用意されているけど,今回の Examples では使わなかった.ドキュメントを載せておく.
overlays/staging/kustomization.yaml
最後に overlays
ディレクトリに置いた overlays/staging/kustomization.yaml
を確認すると,リソース名にプレフィックスとサフィックスを設定したり,前回の記事で紹介した構文が使われている.同じくドキュメントを載せておく.
namePrefix: staging- nameSuffix: -v1 commonLabels: variant: staging org: acmeCorporation commonAnnotations: note: Hello, I am staging! resources: - ../../base patchesStrategicMerge: - map.yaml
3. kustomize build
を実行する
さっそく kustomize build ${OVERLAYS}/staging
を実行すると,以下のように表示される.長くなるため,ConfigMap と Deployment に限定した(それでもまだ長いけど).ポイントは ConfigMap のリソース名と Deployment の参照先となり,どちらも staging-the-map-v1-k25m8k5k5m
になっている.kustomize が自動的にリソース名を作り,Deployment にも適用してくれている.
apiVersion: v1 data: altGreeting: Have a pineapple! enableRisky: "true" kind: ConfigMap metadata: annotations: note: Hello, I am staging! labels: app: hello org: acmeCorporation variant: staging name: staging-the-map-v1-k25m8k5k5m (中略) apiVersion: apps/v1 kind: Deployment metadata: annotations: note: Hello, I am staging! labels: app: hello org: acmeCorporation variant: staging name: staging-the-deployment-v1 spec: replicas: 3 selector: matchLabels: app: hello deployment: hello org: acmeCorporation variant: staging template: metadata: annotations: note: Hello, I am staging! labels: app: hello deployment: hello org: acmeCorporation variant: staging spec: containers: - command: - /hello - --port=8080 - --enableRiskyFeature=$(ENABLE_RISKY) env: - name: ALT_GREETING valueFrom: configMapKeyRef: key: altGreeting name: staging-the-map-v1-k25m8k5k5m - name: ENABLE_RISKY valueFrom: configMapKeyRef: key: enableRisky name: staging-the-map-v1-k25m8k5k5m image: monopole/hello:1 name: the-container ports: - containerPort: 8080
4. ConfigMap の値を変更する
今度は overlays/staging/map.yaml
の値 Have a pineapple!
を Have a kiwi!
に変更する.そして,もう1度 kustomize build ${OVERLAYS}/staging
を実行すると,以下のように表示される.ポイントは ConfigMap のリソース名が staging-the-map-v1-k25m8k5k5m
から staging-the-map-v1-cd7kdh48fd
に変わった点で,これは ConfigMap のリソースを新しく作り直したと言える.さらに Deployment の参照先も更新されているため,ローリングデプロイのような挙動となる.これは便利!
apiVersion: v1 data: altGreeting: Have a kiwi! enableRisky: "true" kind: ConfigMap metadata: annotations: note: Hello, I am staging! labels: app: hello org: acmeCorporation variant: staging name: staging-the-map-v1-cd7kdh48fd (中略) apiVersion: apps/v1 kind: Deployment metadata: annotations: note: Hello, I am staging! labels: app: hello org: acmeCorporation variant: staging name: staging-the-deployment-v1 spec: replicas: 3 selector: matchLabels: app: hello deployment: hello org: acmeCorporation variant: staging template: metadata: annotations: note: Hello, I am staging! labels: app: hello deployment: hello org: acmeCorporation variant: staging spec: containers: - command: - /hello - --port=8080 - --enableRiskyFeature=$(ENABLE_RISKY) env: - name: ALT_GREETING valueFrom: configMapKeyRef: key: altGreeting name: staging-the-map-v1-cd7kdh48fd - name: ENABLE_RISKY valueFrom: configMapKeyRef: key: enableRisky name: staging-the-map-v1-cd7kdh48fd image: monopole/hello:1 name: the-container ports: - containerPort: 8080
まとめ
今回は kustomize の Examples「configGeneration」を試した.configGeneration
を使って ConfigMap リソースを作ると,リソース名にハッシュを含めて,結果的にローリングデプロイのような挙動を実現できるようになる.引き続き試していくぞー!