如何在Pod中使用ConfigMap

容器應用對ConfigMap的使用有以下兩種方法:

  1. 通過環境變量獲取ConfigMap中的內容

  2. 通過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

spacer.gif

如果在引用ConfigMap時不指定items,則使用volumeMount方式在容器內的目錄下爲每個item都生成一個文件名以key開頭的文件。

spacer.gif

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章