容器應用對ConfigMap的使用有以下兩種方法:
通過環境變量獲取ConfigMap中的內容
通過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
如果在引用ConfigMap時不指定items,則使用volumeMount方式在容器內的目錄下爲每個item都生成一個文件名以key開頭的文件。
使用C onfigMap 的限制條件
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 命令)應用所用的實際配置目錄下。