(1) 通過環境變量方式使用 ConfigMap
以前面創建的 ConfigMap “cm-appvars”為例 :
# vim cm-appvars.yaml apiVersion: v1 kind: ConfigMap metadata: name: cm-appvars data: apploglevel: info appdatadir: /var/data
在 Pod “cm-test-pod”的定義中,將 ConfigMap “cm-appvars”中的內容以環境變量 (APPLOGLEVEL
和APPDATADIR
)設置為容器內部的環境變量,容器的啟動命令將顯示這兩個環境變量的值(“env|grep APP”):
apiVersion: v1 kind: Pod metadata: name: cm-test-pod spec: containers: - name: cm-test image: busybox command: ["/bin/sh","-c","env|grep APP"] env: - name: APPLOGLEVEL # 定義環境變量的名稱 valueFrom: # key "apploglevel" 對應的值 configMapKeyRef: name: cm-appvars # 環境變量的值取自 cm-appvars 中 key: apploglevel # key 為 "apploglevel" - name: APPDATADIR valueFrom: configMapKeyRef: name: cm-appvars key: appdatadir restartPolicy: Never
使用 kubectl create -f 命令創建該 Pod,由於是測試 Pod,所以該Pod
在執行完啟動命令后將會退出,井且不會被系統自動重啟(restartPolicy=Never
):
kubectl create -f cm-test-pod.yaml
pod ” cm-test-pod” created
使用kubectl get pods --show-all
查看己經停止的 Pod:
kubectl get pods --show-all Flag --show-all has been deprecated, will be removed in an upcoming release NAME READY STATUS RESTARTS AGE cm-test-pod 0/1 Completed 0 4m
查看該 Pod 的日志,可以看到啟動命令 env | grep APP
的執行結果如下:
kubectl logs cm-test-pod APPDATADIR=/var/data APPLOGLEVEL=info
說明容器內部的環境變量使用 ConfigMap cm-appvars 中的值進行了正確的設置。
從 Kubernetes vl.6 開始,引入了一個新的字段 envFrom,實現在 Pod 環境內將 ConfigMap (也可用於 Secret 資源對象〉中所有定義的key=value
自動生成為環境變量:
apiVersion: v1 kind: Pod metadata: name: cm-test-pod-env spec: containers: - name: cm-test image: busybox command: ["/bin/sh","-c","env"] envFrom: - configMapRef: name: cm-appvars # 根據 cm-appvars 中的 key=value 自動生成環境變量 restartPolicy: Never
通過這個定義,在容器內部將會生成如下環境變量:
# kubectl logs cm-test-pod-env apploglevel=info appdatadir=/var/data
需要說明的是 ,環境變量的名稱受 POSIX 命名規范([a-zA-Z][a-zA-Z0-9]*)
約束 ,不能以數字開頭。如果包含非法字符,則系統將跳過該條環境變量的創建,並記錄一個 Event 來描 述環境變量無法生成,但並不阻止 Pod 的啟動。
(2)通過 volumeMount 使用 ConfigMap
在pod "cm-test-app"定義中,將configmap "cm-appconfigfile"中的內容以文件形式mount
到容器內部configfiles
目錄中。
Pod配置文件cm-test-app.yaml
內容如下:
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 configMap: name: cm-appconfigfiles # 使用configmap定義的的cm-appconfigfile 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文件名進行掛載
創建該Pod:
#kubectl create -f cm-test-app.yaml Pod "cm-test-app"created
登錄容器查看configfiles目錄下的server.xml
和logging.properties
文件,他們的內容就是configmap “cm-appconfigfile”中定義的兩個key的內容
# kubectl exec -ti cm-test-app -- bash # cat /configfiles/server.xml <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder charset="utf-8"> <!-- encoder 可以指定字符集,對於中文輸出有意義 --> <!-- %.-1level 只顯示信息級別的首字母,%-5level 左對齊顯示信息級別全稱 --> <!-- 如需自定義關鍵字,用 %mdc{鍵名} 表示,程序中用MDC.put("鍵名","鍵值")設置,可動態設置 [%logger:%line]--> <Pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] %logger %line --%mdc{client} [%X{TRACE_LOG_ID}] %msg%n</Pattern> </encoder> </appender>root@cm-test-app:/usr/local/tomcat# # cat /configfiles/logging.properties java -Xms1024m -Xmx2048m -Xmn1536m -Xss256k -XX:MaxPermSize=128m -XX:+UseConcMarr kSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XXX :+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/tmp/jvm.log -XX:+HH eapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmm xremote.port=4445 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.. jmxremote.authenticate=false -XX:HeapDumpPath=/tmp/heapdump.hprof -jar /data/appp deploy/$ENVIRONMENT/${PROJECT_JAR} >$jetty_log_path/$PROJECT_NAME.log
如果在引用 ConfigMap 時不指定 items,則將使用 volumeMount 方式在容器內的目錄中為每個item生成一個文件名為key的文件。
Pod配置文件cm-test-app2.yaml內容如下:
apiVersion: v1 kind: Pod metadata: name: cm-test-app2 spec: containers: - name: cm-test-app2 image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 volumeMounts: - name: serverxml # 引用volume名 mountPath: /configfiles # 掛載到容器內部目錄 volumes: - name: serverxml # 定義 volume 名 configMap: name: cm-appconfigfiles # 使用configmap定義的的cm-appconfigfile
創建該Pod:
#kubectl create -f cm-test-app2.yaml Pod "cm-test-app2"created
登錄容器,查看到/configfiles
目錄下存在key-loggingproperties
和key-serverxml
文件,文件的名稱來自 ConfigMap cm-appconfigfiles 中定義的兩個key
的名稱,文件的內容則為 value 的內容:
# ls /configfiles
key-loqqingproperties key-serverxml
使用ConfigMap的條件限制
- configmap必須在pod之前創建
- configmap也可以定義為屬於某個Namespace,只有處於相同namespaces中的pod可以引用
- kubelet只支持可以被API Server管理的Pod使用ConfigMap。
- kubelet在本Node上通過
--manifest-url
或--config
自動創建的靜態 Pod 將無法引用 Conf1gMap。 - 在 Pod 對 ConfigMap 進行掛載(volumeMount)操作時,容器內部只能掛載為“目錄”, 無法掛載為“文件”。在掛載到容器內部后,目錄中將包含 ConfigMap 定義的每個item,如果該目錄下原來還有其他文件,則容器內的該目錄將會被掛載的 ConfigMap 覆蓋。 如果應用程序需要保留原來的其他文件,則需要進行額外的處理。可以將 ConfigMap 掛載到容器內部的臨時目錄,再通過啟動腳本將配置文件復制或者鏈接到(cp或link命令)應用所用的實際配置目錄下。