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

2022.03.24
2024.03.24
Kubernetes
ConfigMapkustomize

はじめに

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

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

kustomizeでconfigMapGenerator

kustomizeでconfigMapGenerator

はじめに kustomizeで`configMapGenerator`を使って、設定用のファイル

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

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

1configMapGenerator:
2- name: some-name
3  files:
4   - configs/*.conf
5   - configs/config.d/*.conf

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

Add glob support in configmap generator by Liujingfang1 · Pull Request #207 · kubernetes-sigs/kustomize

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

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 with kubectl: kubectl create configmap m...

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

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

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

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

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

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

1.
2├── base
3│   ├── deployment.yaml
4│   └── kustomization.yaml
5└── overlays
6    └── dev
7        ├── common-conf
8        │   ├── config1.properties
9        │   └── config2.properties
10        └── kustomization.yaml

base

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

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

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5spec:
6  replicas: 1
7  selector:
8    matchLabels:
9      app: myapp
10  template:
11    metadata:
12      labels:
13        app: myapp
14    spec:
15      containers:
16      - name: nginx
17        image: nginx:latest
18        volumeMounts:
19          - name:  config-volume
20            mountPath: /etc/config
21      volumes:
22      - name: config-volume
23        configMap:
24          name: config-file

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

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3resources:
4- deployment.yaml

overlays/dev

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

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

1color=red
1color=blue

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

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3namePrefix: dev-
4commonLabels:
5  env: dev
6resources:
7- ./../../base

kustomize edit add configmap

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

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

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

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

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3namePrefix: dev-
4commonLabels:
5  env: dev
6resources:
7- ./../../base
8configMapGenerator: # 追記されている
9- files:
10  - common-conf/config1.properties
11  - common-conf/config2.properties
12  name: config-file

ビルド

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

1kubectl apply -k overlays/dev

確認

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

1❯ kubectl get cm
2NAME                         DATA   AGE
3dev-config-file-864687f65g   2      11m
4
5❯ kubectl describe cm dev-config-file-864687f65g
6Name:         dev-config-file-864687f65g
7Namespace:    default
8Labels:       env=dev
9Annotations:  <none>
10
11Data
12====
13config1.properties:
14----
15color=red
16config2.properties:
17----
18color=blue
19
20BinaryData
21====
22
23Events:  <none>

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

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

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

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

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

1.
2├── base
3│   ├── deployment.yaml
4│   └── kustomization.yaml
5└── overlays
6    └── dev
7        ├── common-conf
8        │   ├── config1.properties
9        │   └── config2.properties
10        ├── dev-conf
11        │   ├── config3.properties
12        │   └── config4.properties
13        └── kustomization.yaml

base

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

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

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5spec:
6  replicas: 1
7  selector:
8    matchLabels:
9      app: myapp
10  template:
11    metadata:
12      labels:
13        app: myapp
14    spec:
15      containers:
16      - name: nginx
17        image: nginx:latest
18        volumeMounts:
19          - name:  config-volume
20            mountPath: /etc/config
21      volumes:
22      - name: config-volume
23        configMap:
24          name: config-file

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

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3resources:
4- deployment.yaml

overlays/dev

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

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

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

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

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3namePrefix: dev-
4commonLabels:
5  env: dev
6resources:
7- ./../../base

kustomize edit add configmap

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

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

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

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

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3namePrefix: dev-
4commonLabels:
5  env: dev
6resources:
7- ./../../base
8configMapGenerator: # 追記されている
9- files:
10  - common-conf/config1.properties
11  - common-conf/config2.properties
12  - dev-conf/config3.properties
13  - dev-conf/config4.properties
14  name: config-file

ビルド

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

1kubectl apply -k overlays/dev

確認

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

1❯ kubectl get cm
2NAME                         DATA   AGE
3dev-config-file-t4kc6gb797   4      21s
4
5❯ kubectl describe cm dev-config-file-t4kc6gb797
6Name:         dev-config-file-t4kc6gb797
7Namespace:    default
8Labels:       env=dev
9Annotations:  <none>
10
11Data
12====
13config3.properties:
14----
15color=green
16config4.properties:
17----
18color=yellow
19config1.properties:
20----
21color=red
22config2.properties:
23----
24color=blue
25
26BinaryData
27====
28
29Events:  <none>

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

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

まとめ

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee