このセクションでは、ConfigMap リソースを Pod 内のコンテナーに環境変数を使って渡す方法について紹介します。

まず、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 情報を一つずつ環境変数に渡す場合

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

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

spec の containers の env に ConfigMap リソースからコンテナーに渡す環境変数を指定します。ここでは、sample3-configmap の ConfigMap リソースに登録されている connection.max をコンテナーの環境変数に登録するようにしています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-env
spec:
  containers:
    - name: configmap-container
      image: nginx:1.12
      env:
        - name: CONNECTION_MAX
          valueFrom:
            configMapKeyRef:
              name: sample3-configmap
              key: connection.max

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

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

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

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

Master サーバーから Pod( sample-configmap-env )内の CONNECTION_MAX 環境変数を確認します。ここでは、ConfigMap リソースの connection.max に定義されている 情報が環境変数として登録されていることが確認できます。

[root@kube-master sample-configmap]# kubectl exec -it sample-configmap-env env | grep CONNECTION_MAX
CONNECTION_MAX=100
[root@kube-master sample-configmap]# 

ConfigMap 情報を全て環境変数に渡す場合

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

[root@kube-master sample-configmap]# vi sample-configmap-multi-env.yaml

spec の containers の envFrom に ConfigMap リソースを指定します。ここでは、ConfigMap リソースに sample3-configmap を指定しています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-multi-env
spec:
  containers:
    - name: configmap-container
      image: nginx:1.12
      envFrom:
      - configMapRef:
          name: sample3-configmap

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

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

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

[root@kube-master sample-configmap]# kubectl get pod sample-configmap-multi-env
NAME                         READY   STATUS    RESTARTS   AGE
sample-configmap-multi-env   1/1     Running   0          22s
[root@kube-master sample-configmap]# 

Master サーバーから Pod( sample-configmap-multi-env )内の 環境変数を確認します。ここでは、ConfigMap リソースの情報が環境変数として登録されていることが確認できます。

[root@kube-master sample-configmap]# kubectl exec -it sample-configmap-multi-env env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=sample-configmap-multi-env
TERM=xterm
connection.max=100
connection.min=10
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;
}

sample.properties=property.1=value-1
property.2=value-2
property.3=value-3

thread=16
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
NGINX_VERSION=1.12.2-1~stretch
NJS_VERSION=1.12.2.0.1.14-1~stretch
HOME=/root
[root@kube-master sample-configmap]#