Pod使用ConfigMap的兩種方式


(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”中的內容以環境變量 (APPLOGLEVELAPPDATADIR)設置為容器內部的環境變量,容器的啟動命令將顯示這兩個環境變量的值(“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.xmllogging.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-loggingpropertieskey-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命令)應用所用的實際配置目錄下。
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM