容器应用对ConfigMap的使用有以下两种方法:

  1. 通过环境变量获取ConfigMap中的内容

  2. 通过volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录

通过环境变量的方式使用ConfigMap:

k8s 1.6版本开始,引入了envFrom字段,实现了在Pod环境中将ConfigMap中所有定义的key=value自动生成为环境变量:

cat cm-appvars.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: cm-appvars

data:

  apploglevel: info

  appdatadir: /var/data

cat cm-test-pod.yaml

apiVersion: v1

kind: Pod

metadata:

  name: cm-test-pod

spec:

  containers:

  - name: cm-test

    image: busybox

    command: ["/bin/sh","-c","env|grep APP"]

    envFrom:

    - configMapRef:

        name: cm-appvars

  restartPolicy: Never

通过这个定义,在容器内部将会生成如下环境变量:

 apploglevel=info

 appdatadir=/var/data

注意:环境变量的名称受POSIX命令规范约束,不能以数字开头,如果包含非法字符,则系统将跳过该条环境变量的创建,并记录Event来提示环境变量无法生成,但并不阻止Pod的启动。


通过 volumeMount 使用ConfigMap

apiVersion: v1

kind: Pod

metadata:

  name: cm-test-app

spec:

  containers:

  - name: cm-test-app

    image: kubeguide/tomcat-app:v1

    ports:

    - containerPort: 8080

    volumeMounts: 

    - name: serverxml                                            #引用Volume的名称

      mountPath: /configfiles                                #挂载到容器内的目录

  volumes:

  - name: serverxml                                              #定义Volume的名称

    configMap:

      name: cm-appconfigfiles                               #使用ConfigMap“cm-appconfigfiles

      items:

      - key: key-serverxml                                       #key=key-serverxml

        path: server.xml                                            #value将server.xml文件名进行挂载

      - key: key-loggingproperties                         #key=key-loggingproperties

        path: logging.properties                              #value将logging.properties文件名进行挂载

创建容器后,登录容器,查看到在/configfiles 目录下存在server.xml和logging.properties文件,它们的内容就是ConfigMap“cm-appconfigfiles中两个key定义的内容。

k exec -it cm-test-app /bin/bash

spacer.gif

如果在引用ConfigMap时不指定items,则使用volumeMount方式在容器内的目录下为每个item都生成一个文件名以key开头的文件。

spacer.gif

使用ConfigMap 的限制条件

  • configmap必须在Pod之前创建。

  • configmap受namespace限制,只有处于相同namespace中的pod才可以引用它。

  • configmap中的配额管理还未能实现。

  • kubelet只支持可以被API Server管理的Pod使用ConfigMap。kebelet在本地node上通过--manifest-url或--config自动创建的静态pod将无法引用configmap

  • 在pod对configmap进行挂载(volumeMount)操作时,在容器内部只能挂载为“目录”,无法挂载为“文件”。在挂载到容器内部后,在目录下将包含configmap定义的每个item,如果在该目录下原来还有其他文件,则容器内的目录将被挂载的configmap覆盖。如果应用程序需要保留原来的其他文件,则需要进行额外的处理。可以将configmap挂载到容器内部的临时目录,再通过启动脚本将配置文件复制或者链接到(cp 或 link 命令)应用所用的实际配置目录下。