🌟

Kustomize で configMapGenerator を使って ConfigMap を複数サービス間で共有する方法

2024/12/17に公開

概要

Kustomize は Kubernetes マニフェストを柔軟に管理できるツールで、configMapGenerator を使って ConfigMap を動的に生成することができます。しかし、複数のサービス間で ConfigMapを共有したい場合、単純にファイルを参照するだけではセキュリティ制約により動作しません。

この記事では、共有リソースレイヤー(sharedレイヤー)を作成する方法を用いて、ConfigMap を複数のマイクロサービス間で共有する方法を書いてみます。

サービス概要

例えば、以下のような構成で複数のサービスが存在するとします。

ディレクトリ構成例

app/
├── base/
│   ├── payment/             
│   └── payment_user/        
└── overlay/
    ├── dev/
    │   ├── payment/
    │   │   └── kustomization.yaml
    │   │   └── config.yaml
    │   └── payment_user/
    │       ├── kustomization.yaml
    │       └── deployment.yaml

payment サービスと payment_user サービスが存在しています。payment_user サービスは全く同じ内容の configMap が欲しいという要件があるとします。それぞれ個別で config.yaml を作成したくないので、共通の ConfigMap(config.yaml)を使いたいですね。
仮にpayment の ConfigMap を使用したい場合、payment_user サービスの kustomization における configMapGenerator は下記のように記述したくなります。

# overlay/dev/payment_user/kustomization.yaml
configMapGenerator:
  - files:
      - ../payment/config.yaml
    name: config

しかし、このような異なるサービスの config を使用することはできません。

>kustomize build . 
Error: loading KV pairs: file sources: [../payment/config.yaml]: security; file '/app/overlay/dev/payment/config.yaml' is not in or below '/app/overlay/dev/payment_user'

実際に実行すると上記のようなエラーとなリます。この問題を解決します。

shared レイヤーを使った ConfigMap の共有

解決策として、共通の ConfigMap をsharedディレクトリに定義し、他のサービス(paymentpayment_user)の kustomization.yaml から参照するようにします。

shared レイヤーで ConfigMap を定義

overlay/dev/shared/ディレクトリに config.yaml と kustomization.yaml を作成します。

共通設定のファイルとして、config.yaml を作成する。

# overlay/dev/shared/config.yaml
key1: value1
key2: value2

ConfigMapを生成。

# overlay/dev/shared/kustomization.yaml
configMapGenerator:
  - name: shared-config
    files:
      - config.yaml

この設定により、shared-configという名前の ConfigMa pが生成されます。

paymentサービスでsharedを参照

overlay/dev/payment/kustomization.yamlsharedレイヤーを取り込みます。

# overlay/dev/payment/kustomization.yaml
resources:
  - ../../../base/payment/
  - ../shared/  # sharedレイヤーを参照

payment_userサービスでsharedを参照

同様に、overlay/dev/payment_user/kustomization.yamlでもsharedを取り込みます。

# overlay/dev/payment_user/kustomization.yaml
resources:
  - ../../../base/payment_user/
  - ../shared/  # sharedレイヤーを参照
namePrefix: dev-

ConfigMapをDeploymentで利用

payment_userdeployment.yamlで、ConfigMapをボリュームとしてマウントします。

# overlay/dev/payment_user/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: nginx:1.16.0
          ports:
            - containerPort: 80
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: shared-config  # sharedレイヤーで生成したConfigMap

フォルダ構成はこんな感じになります。

app/
├── base/
│   ├── payment/             
│   └── payment_user/        
└── overlay/
    ├── dev/
    │   ├── shared/          # 共通のConfigMapを管理
    │   │   ├── config.yaml  # 共有する設定ファイル
    │   │   └── kustomization.yaml
    │   ├── payment/
    │   │   └── kustomization.yaml
    │   │   └── config.yaml
    │   └── payment_user/
    │       ├── kustomization.yaml
    │       └── deployment.yaml

Kustomizeでビルドと確認

payment_userのディレクトリに移動してKustomizeを実行します。

cd app/overlay/dev/payment_user
kustomize build .

出力

apiVersion: v1
kind: ConfigMap
metadata:
  name: dev-shared-config-9f2m5chkb7
data:
  config.yaml: |
    key1: value1
    key2: value2
---
apiVersion: apps/v1
kind: Deployment
...

shared にある configMap が生成できていることが確認できました。

まとめ

Kustomize の configMapGenerator を使って共有リソースレイヤー(shared)を作成することで、複数のサービス間で ConfigMap を共有できました。

Discussion