Kustomize で configMapGenerator を使って ConfigMap を複数サービス間で共有する方法
概要
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
ディレクトリに定義し、他のサービス(payment
やpayment_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.yaml
でshared
レイヤーを取り込みます。
# 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_user
のdeployment.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