容器应用对ConfigMap的使用有如下两种方法:node
经过环境变量获取ConfigMap中的内容api
经过volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录tomcat
经过环境变量的方式使用ConfigMap:bash
k8s 1.6版本开始,引入了envFrom字段,实现了在Pod环境中将ConfigMap中全部定义的key=value自动生成为环境变量:app
cat cm-appvars.yamlide
apiVersion: v1ui
kind: ConfigMapurl
metadata:spa
name: cm-appvarsrest
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
若是在引用ConfigMap时不指定items,则使用volumeMount方式在容器内的目录下为每一个item都生成一个文件名以key开头的文件。
使用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 命令)应用所用的实际配置目录下。