如何在Pod中使用ConfigMap

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

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

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

spacer.gif

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

spacer.gif

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

相關文章
相關標籤/搜索