【kustomize】ConfigMap作成時にglobでファイル指定

スポンサーリンク

はじめに

kustomizeでファイルからConfigMapを作成するときにglob(*とか?とか)を使ってファイルを指定する方法を紹介します。

configMapGeneratorについては下記を参考にしてください。

kustomizeでconfigMapGenerator
はじめにkustomizeでconfigMapGeneratorを使って、設定用のファイルからConfigMapを作成してみます。kustomizeの基礎については下記を参考にしてください。configMapGeneratorco...

globを使ってConfigMap作成する方法

kustomizeでConfigMapを作成する場合にkustomization.yamlの中でconfigMapGeneratorを使って下記のようにglobでファイルを指定したくなります。

configMapGenerator:
- name: some-name
  files:
   - configs/*.conf
   - configs/config.d/*.conf

しかし、これはkustomizeではサポートされていません。一度Pull Requestまでは作成されたようですが、明示的に依存関係を宣言できるようにするためkustomization.yamlでのglobサポートを禁止にしたみたいです。

Add glob support in configmap generator by Liujingfang1 · Pull Request #207 · kubernetes-sigs/kustomize
Fix #189
configMapGenerator should allow directories as input, like kubectl · Issue #189 · kubernetes-sigs/kustomize
Given this dir tree: configs/ ├── config.d/ │ ├── 10-input.conf │ ├── 50-filter.conf │ └── 90-output.conf ├── ssl.conf └── app.conf You can do the following wit...

では、どうしたらglobを使ってファイル指定ができるかというと、下記のようにkustomize edit add configmapを使うことでglobを使ってファイルを指定することができます。

kustomize edit add configmap some-name --from-files=somedir/*.conf

kustomize edit add configmapkustomization.yamlを編集するコマンドなので、globを使って指定したファイルがkustomization.yamlに追記されることになります。

実践:特定のディレクトリから1つのConfigMap作成

実際にkustomize edit add configmapでglobを使ってみます。

作成するファイルとディレクトリは下記の通りです。

.
├── base
│   ├── deployment.yaml
│   └── kustomization.yaml
└── overlays
    └── dev
        ├── common-conf
        │   ├── config1.properties
        │   └── config2.properties
        └── kustomization.yaml

base

base配下のファイルを作成します。

deployment.yamlは下記の通りです。ConfigMapをvolumeMountsしています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        volumeMounts:
          - name:  config-volume
            mountPath: /etc/config
      volumes:
      - name: config-volume
        configMap:
          name: config-file

kustomization.yamlは下記の通りです。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml

overlays/dev

overlays/dev配下のファイルを作成します。

common-conf/config1.propertiescommon-conf/config2.propertiesを作成します。内容はなんでも大丈夫です。

color=red
color=blue

kustomization.yamlは下記の通りです。この時点ではconfigMapGeneratorは記入しません

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: dev-
commonLabels:
  env: dev
resources:
- ./../../base

kustomize edit add configmap

必要なファイルは揃ったので、kustomize edit add configmapでConfigMapを作成するファイルを指定します。

overlays/devで下記コマンドを実行します。

kustomize edit add configmap config-file --from-file='common-conf/*'

overlays/dev/kustomization.yamlを確認すると、下記のようにcommon-conf/配下のファイルが追記されています。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: dev-
commonLabels:
  env: dev
resources:
- ./../../base
configMapGenerator: # 追記されている
- files:
  - common-conf/config1.properties
  - common-conf/config2.properties
  name: config-file

ビルド

kustomizeを使ってDeploymentとConfigMapを作成します。

kubectl apply -k overlays/dev

確認

2つのファイルからConfigMapが作成されていることが確認できます。

❯ kubectl get cm
NAME                         DATA   AGE
dev-config-file-864687f65g   2      11m

❯ kubectl describe cm dev-config-file-864687f65g
Name:         dev-config-file-864687f65g
Namespace:    default
Labels:       env=dev
Annotations:  <none>

Data
====
config1.properties:
----
color=red
config2.properties:
----
color=blue

BinaryData
====

Events:  <none>

volumeMountsしたファイルも確認できます。

❯ kubectl exec dev-myapp-5559d7f979-kwcxd -c nginx -- ls /etc/config
config1.properties
config2.properties

実践:複数のディレクトリから1つのConfigMap作成

次は、複数のディレクトリを指定してみます。

作成するファイルとディレクトリは下記の通りです。

.
├── base
│   ├── deployment.yaml
│   └── kustomization.yaml
└── overlays
    └── dev
        ├── common-conf
        │   ├── config1.properties
        │   └── config2.properties
        ├── dev-conf
        │   ├── config3.properties
        │   └── config4.properties
        └── kustomization.yaml

base

base配下のファイルを作成します。

deployment.yamlは下記の通りです。ConfigMapをvolumeMountsしています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        volumeMounts:
          - name:  config-volume
            mountPath: /etc/config
      volumes:
      - name: config-volume
        configMap:
          name: config-file

kustomization.yamlは下記の通りです。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml

overlays/dev

overlays/dev配下のファイルを作成します。

common-conf配下にconfig1.propertiesconfig2.properties、dev-conf配下にconfig3.propertiesconfig4.propertiesを作成します。内容はなんでも大丈夫です。

color=red
color=blue
color=green
color=yellow

kustomization.yamlは下記の通りです。この時点ではconfigMapGeneratorは記入しません

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: dev-
commonLabels:
  env: dev
resources:
- ./../../base

kustomize edit add configmap

必要なファイルは揃ったので、kustomize edit add configmapでConfigMapを作成するファイルを指定します。

overlays/devで下記コマンドを実行します。

kustomize edit add configmap config-file --from-file='common-conf/*'
kustomize edit add configmap config-file --from-file='dev-conf/*'

overlays/dev/kustomization.yamlを確認すると、下記のようにcommon-conf/dev-conf配下のファイルが追記されています。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: dev-
commonLabels:
  env: dev
resources:
- ./../../base
configMapGenerator: # 追記されている
- files:
  - common-conf/config1.properties
  - common-conf/config2.properties
  - dev-conf/config3.properties
  - dev-conf/config4.properties
  name: config-file

ビルド

kustomizeを使ってDeploymentとConfigMapを作成します。

kubectl apply -k overlays/dev

確認

4つのファイルからConfigMapが作成されていることが確認できます。

❯ kubectl get cm
NAME                         DATA   AGE
dev-config-file-t4kc6gb797   4      21s

❯ kubectl describe cm dev-config-file-t4kc6gb797
Name:         dev-config-file-t4kc6gb797
Namespace:    default
Labels:       env=dev
Annotations:  <none>

Data
====
config3.properties:
----
color=green
config4.properties:
----
color=yellow
config1.properties:
----
color=red
config2.properties:
----
color=blue

BinaryData
====

Events:  <none>

volumeMountsしたファイルも確認できます。

❯ kubectl exec dev-myapp-86d7fbbc4-qkn8t -c nginx -- ls /etc/config
config1.properties
config2.properties
config3.properties
config4.properties

まとめ

  • configMapGeneratorではglobは使えない
  • kustomzie edit add configmapではglobが使える

参考

タイトルとURLをコピーしました