Kubernetesを使う時、アプリの設定とかをコンテナイメージに埋め込むのではなく実行時に設定したい場合、ConfigMapを使う。
ConfigMapはkey-valueで情報を保持しているんだけど、これがなかなか便利で、ファイルから作る*1とkey: ファイル名、value: ファイルの内容みたいに勝手にやってくれる*2。ディレクトリから作る*3と、そのディレクトリに含まれるファイルを全部読み込んで、それぞれkey-valueとして保持してくれたりもする。
説明するより例の方が分かり易いので実際のコマンドで説明。
ConfigMapの定義
$ ls redis-config $ cat redis-config maxmemory 2mb maxmemory-policy allkeys-lru
であった時に、このファイルからConfigMapを作成してみると
$ kubectl create configmap <名前> --from-file=redis-config
configmap "<名前>" created
$ kubectl get configmap <名前>
apiVersion: v1
data:
redis-config: |-
maxmemory 2mb
maxmemory-policy allkeys-lru
kind: ConfigMap
metadata:
creationTimestamp: xxxxxxx
name: <名前>
namespace: default
resourceVersion: "6872"
selfLink: /api/v1/namespaces/default/configmaps/<名前>
uid: 67b1ce21-125c-11e8-9a96-d4c7541dd274
のようになる。dataのところを見ると、ファイル名がキーになって、対応する内容がファイルの中身になっていることが確認できる。
ConfigMapの利用
ConfigMapに保存してある情報をPodで使う時は、ConfigMapの内容をファイルとして書き込んだvolumeを定義し、それをPodがmountして使う。
例
$ cat redis-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: kubernetes/redis:v1
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: example-redis-config
items:
- key: redis-config
path: redis.conf
上記のように、volumeを定義するときに、ConfigMapを選び、keyでデータを、pathでボリューム内に作成するファイルを指定する。ここでは、redis.confというファイル(中身はConfigMap内のredis-configで指定したデータ)があるボリュームが作成される。Podではそれを/redis-masterディレクトリにマウントしていることから、Pod内ではConfigMapの内容は/redis-master/redis.confとして参照可能となる。
$ kubectl apply -f redis-pod.yaml pod "redis" created $ kubectl exec -it redis /bin/bash root@redis:/data# ls /redis-master redis.conf root@redis:/data# cat /redis-master/redis.conf maxmemory 2mb maxmemory-policy allkeys-lru
[参考]