容器應用對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 命令)應用所用的實際配置目錄下。