ConfigMapの使い方

Kubernetesを使う時、アプリの設定とかをコンテナイメージに埋め込むのではなく実行時に設定したい場合、ConfigMapを使う。

ConfigMapはkey-valueで情報を保持しているんだけど、これがなかなか便利で、ファイルから作る*1key: ファイル名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

[参考]

kubernetes.io

*1:kubectl ... --from-file=でファイルを指定

*2:もちろんkeyをファイル名じゃなくて指定したものにすることも可能

*3:kubectl ... --from-file=でディレクトリを指定