このセクションでは、ConfigMap リソースの情報を Pod 内コンテナーの ボリューム( Volume )としてマウントし渡す方法について紹介します。

まず、ConfigMap リソースのサンプルマニフェストを作成します。ここでは、以下のような マニフェストを作成しています。

[root@kube-master sample-configmap]# cat sample3-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: sample3-configmap
data:
  thread: "16"
  connection.max: "100"
  connection.min: "10"
  sample.properties: |
    property.1=value-1
    property.2=value-2
    property.3=value-3
  nginx.conf: |
    user nginx;
    worker_processes auto;
    error_log  /var/log/nginx/error.log;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        #tcp_nopush     on;
        keepalive_timeout  65;
        #gzip  on;
        include /etc/nginx/conf.d/*.conf;
    }
[root@kube-master sample-configmap]#

Master サーバーから Kubernetes クラスタ上に ConfigMap リソースを作成します。

[root@kube-master sample-configmap]# kubectl apply -f sample3-configmap.yaml 
configmap/sample3-configmap created
[root@kube-master sample-configmap]# 

ConfigMap 情報を一つずつVolume にマウントして渡す場合

サンプルのマニフェストファイルを新規作成し、以下コードを記述します。

[root@kube-master sample-configmap]# vi sample-configmap-single-volume.yaml

spec の containers の volumeMounts にコンテナー上のボリュームをマウントするパスを指定します。 spec の volumes に指定したパスにマウント情報を指定します。ここでは、ConfigMap( sample3-cofigmap )リソースにある nginx.conf 情報を /config/ ディレクトリに nginx-sample.conf として登録する指定をしています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-single-volume
spec:
  containers:
    - name: configmap-container
      image: nginx:1.12
      volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
    - name: config-volume
      configMap:
        name: sample3-configmap
        items:
        - key: nginx.conf
          path: nginx-sample.conf

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。

[root@kube-master sample-configmap]# kubectl apply -f sample-configmap-single-volume.yaml 
pod/sample-configmap-single-volume created
[root@kube-master sample-configmap]# 

Master サーバーから Kubernetes クラスタ上の Pod リソースを確認します。

[root@kube-master sample-configmap]# kubectl get pod sample-configmap-single-volume
NAME                             READY   STATUS    RESTARTS   AGE
sample-configmap-single-volume   1/1     Running   0          10s
[root@kube-master sample-configmap]# 

Master サーバーから Pod( sample-configmap-single-volume )内 の /config/nginx-sample.conf に登録されている情報を確認します。ここでは、ConfigMap リソースの nginx.conf に定義されている 情報が nginx-sample.conf に登録されていることが確認できます。

[root@kube-master sample-configmap]# kubectl exec -it sample-configmap-single-volume cat /config/nginx-sample.conf
user nginx;
worker_processes auto;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}
[root@kube-master sample-configmap]# 

ConfigMap 情報を全て Volume にマウントして渡す場合

サンプルのマニフェストファイルを新規作成し、以下コードを記述します。

[root@kube-master sample-configmap]# vi sample-configmap-all-volume.yaml 

spec の containers の volumeMounts にコンテナー上のボリュームをマウントするパスを指定します。 spec の volumes に指定したパスにマウント情報を指定します。ここでは、ConfigMap( sample3-configmap )リソースにある 全ての情報( connection.max、 connection.min、 nginx.conf、 sample.properties、thread )を /config/ ディレクトリに登録する指定をしています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-single-volume
spec:
  containers:
    - name: configmap-container
      image: nginx:1.12
      volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
    - name: config-volume
      configMap:
        name: sample3-configmap

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。

[root@kube-master sample-configmap]# kubectl apply -f sample-configmap-all-volume.yaml 
pod/sample-configmap-all-volume created
[root@kube-master sample-configmap]# 

Master サーバーから Kubernetes クラスタ上の Pod リソースを確認します。

[root@kube-master sample-configmap]# kubectl get pod sample-configmap-all-volume
NAME                          READY   STATUS    RESTARTS   AGE
sample-configmap-all-volume   1/1     Running   0          11s
[root@kube-master sample-configmap]# 

Master サーバーから Pod( sample-configmap-all-volume )内 の /config/ ディレクトリを参照します。ここでは、/config/ ディレクトリに connection.max、 connection.min、 nginx.conf、 sample.properties、thread ファイルが確認できます。

[root@kube-master sample-configmap]# kubectl exec -it sample-configmap-all-volume ls /configconnection.max	connection.min	nginx.conf  sample.properties  thread
[root@kube-master sample-configmap]# 

Master サーバーから Pod( sample-configmap-all-volume )内 の /config/ ディレクトリにあるファイルの確認します。ここでは、ConfigMap リソースの情報がそれぞれのファイルに登録されていることが確認できます。

[root@kube-master sample-configmap]# kubectl exec -it sample-configmap-all-volume cat /config/connection.max
100
[root@kube-master sample-configmap]# 

[root@kube-master sample-configmap]# kubectl exec -it sample-configmap-all-volume cat /config/connection.min
10
[root@kube-master sample-configmap]# 

[root@kube-master sample-configmap]# kubectl exec -it sample-configmap-all-volume cat /config/sample.properties
property.1=value-1
property.2=value-2
property.3=value-3
[root@kube-master sample-configmap]# 

Master サーバーから 作成したKubernetes クラスタ上の ConfigMap と Pod リソースを全て削除します。

[root@kube-master sample-configmap]# kubectl delete configmap sample3-configmap
configmap "sample3-configmap" deleted
[root@kube-master sample-configmap]# 

[root@kube-master sample-configmap]# kubectl delete pod sample-configmap-single-volume sample-configmap-all-volume
pod "sample-configmap-single-volume" deleted
pod "sample-configmap-all-volume" deleted
[root@kube-master sample-configmap]#