kakakakakku blog

Weekly Tech Blog: Keep on Learning!

kustomize の configGeneration を使って ConfigMap リソースをデプロイする

先週の記事に続き kustomizeExamples を試していく.前回は「helloWorld」を試した.今回は ConfigMap リソースでローリングデプロイのような挙動を実現できる kustomizeconfigGeneration を試す.

kakakakakku.hatenablog.com

前提

今回も 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」とは?

kustomizeConfigMap リソースを書き換える方法は「2種類」ある.

  1. kustomization.yamlpatchesStrategicMerge 構文を使う(マニフェストを指定する)
  2. kustomization.yamlconfigMapGenerator 構文を使う(kustomization.yaml 自体に書く / 1. と組み合わせもある)

Examples「helloWorld」 で試したのは「1番目 (patchesStrategicMerge)」だった.ポイントは ConfigMap のリソース名で,具体的には staging-the-mapproduction-the-map など,プレフィックス以外は固定される.これ自体は全く問題ではないけど,例えば環境変数として読み込んだ ConfigMap の更新を自動的に反映できなかったりする(正確には Volume マウントをすれば,自動的に反映できる).

そこで「2番目 (configMapGenerator)」を使うことにより,ConfigMap のリソース名にハッシュを含めて,結果的にローリングデプロイのような挙動を実現できるようになる.イメージとしては DeploymentReplicaSet の関係のような感じ!さっそく試していく.

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 となる.管理するキーとしては altGreetingenableRisky を定義してある.

apiVersion: v1
kind: ConfigMap
metadata:
  name: the-map
data:
  altGreeting: "Have a pineapple!"
  enableRisky: "true"

base/deployment.yaml

次に base/deployment.yamlDeployment リソースのマニフェストを確認する.ポイントは 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 という構文があり nameliterals から構成されている.ConfigMap リソース名は合わせて the-map にしておく.今回は kustomize build を実行して overlaysmap.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 では使わなかった.ドキュメントを載せておく.

kubernetes-sigs.github.io

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

kubernetes-sigs.github.io

3. kustomize build を実行する

さっそく kustomize build ${OVERLAYS}/staging を実行すると,以下のように表示される.長くなるため,ConfigMapDeployment に限定した(それでもまだ長いけど).ポイントは 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

まとめ

今回は kustomizeExamples「configGeneration」を試した.configGeneration を使って ConfigMap リソースを作ると,リソース名にハッシュを含めて,結果的にローリングデプロイのような挙動を実現できるようになる.引き続き試していくぞー!