- Kubernetes權(quán)威指南:從Docker到Kubernetes實踐全接觸(第4版)
- 龔正等編著
- 2660字
- 2019-09-23 11:04:37
3.5 Pod的配置管理
應(yīng)用部署的一個最佳實踐是將應(yīng)用所需的配置信息與程序進行分離,這樣可以使應(yīng)用程序被更好地復(fù)用,通過不同的配置也能實現(xiàn)更靈活的功能。將應(yīng)用打包為容器鏡像后,可以通過環(huán)境變量或者外掛文件的方式在創(chuàng)建容器時進行配置注入,但在大規(guī)模容器集群的環(huán)境中,對多個容器進行不同的配置將變得非常復(fù)雜。從Kubernetes 1.2開始提供了一種統(tǒng)一的應(yīng)用配置管理方案——ConfigMap。本節(jié)對ConfigMap的概念和用法進行詳細描述。
3.5.1 ConfigMap概述
ConfigMap供容器使用的典型用法如下。
(1)生成為容器內(nèi)的環(huán)境變量。
(2)設(shè)置容器啟動命令的啟動參數(shù)(需設(shè)置為環(huán)境變量)。
(3)以Volume的形式掛載為容器內(nèi)部的文件或目錄。
ConfigMap以一個或多個key:value的形式保存在Kubernetes系統(tǒng)中供應(yīng)用使用,既可以用于表示一個變量的值(例如apploglevel=info),也可以用于表示一個完整配置文件的內(nèi)容(例如server.xml=<?xml...>...)
可以通過YAML配置文件或者直接使用kubectl create configmap命令行的方式來創(chuàng)建ConfigMap。
3.5.2 創(chuàng)建ConfigMap資源對象
1.通過YAML配置文件方式創(chuàng)建
下面的例子cm-appvars.yaml描述了將幾個應(yīng)用所需的變量定義為ConfigMap的用法:
cm-appvars.yaml apiVersion: v1 kind: ConfigMap metadata: name: cm-appvars data: apploglevel: info appdatadir: /var/data
執(zhí)行kubectl create命令創(chuàng)建該ConfigMap:
$kubectl create -f cm-appvars.yaml configmap "cm-appvars" created
查看創(chuàng)建好的ConfigMap:
# kubectl get configmap NAME DATA AGE cm-appvars 2 3s # kubectl describe configmap cm-appvars Name: cm-appvars Namespace: default Labels: <none> Annotations: <none> Data ==== appdatadir: 9 bytes apploglevel: 4 bytes # kubectl get configmap cm-appvars -o yaml apiVersion: v1 data: appdatadir: /var/data apploglevel: info kind: ConfigMap metadata: creationTimestamp: 2016-07-28T19:57:16Z name: cm-appvars namespace: default resourceVersion: "78709" selfLink: /api/v1/namespaces/default/configmaps/cm-appvars uid: 7bb2e9c0-54fd-11e6-9dcd-000c29dc2102
下面的例子cm-appconfigfiles.yaml描述了將兩個配置文件server.xml和logging.properties定義為ConfigMap的用法,設(shè)置key為配置文件的別名,value則是配置文件的全部文本內(nèi)容:
cm-appconfigfiles.yaml apiVersion: v1 kind: ConfigMap metadata: name: cm-appconfigfiles data: key-serverxml: | <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className= "org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className= "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className= "org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server> key-loggingproperties:"handlers =1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli. FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli. FileHandler, java.util.logging.ConsoleHandler\r\n\r\n.handlers= 1catalina.org.apache. juli.FileHandler, java.util.logging.ConsoleHandler\r\n\r\n1catalina.org.apache.juli.FileHandler.level = FINE\r\n1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n1catalina.org.apache.juli.FileHandler.prefix = catalina.\r\n\r\n2localhost.org.apache.juli.FileHandler.level = FINE\r\n2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n2localhost.org.apache.juli.FileHandler.prefix = localhost.\r\n\r\n3manager.org.apache.juli.FileHandler.level = FINE\r\n3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n3manager.org.apache.juli.FileHandler.prefix = manager.\r\n\r\n4host-manager.org.apache.juli.FileHandler.level = FINE\r\n4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n4host-manager.org.apache.juli.FileHandler. prefix = host-manager.\r\n\r\njava.util.logging.ConsoleHandler.level = FINE\r\ njava.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter\r\n\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. handlers = 2localhost.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].[/manager].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. [/manager].handlers = 3manager.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. [/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler\r\n\r\n"
執(zhí)行kubectl create命令創(chuàng)建該ConfigMap:
$kubectl create -f cm-appconfigfiles.yaml configmap "cm-appconfigfiles" created
查看創(chuàng)建好的ConfigMap:
# kubectl get configmap cm-appconfigfiles NAME DATA AGE cm-appconfigfiles 2 14s # kubectl describe configmap cm-appconfigfiles Name: cm-appconfigfiles Namespace: default Labels: <none> Annotations: <none> Data ==== key-loggingproperties: 1809 bytes key-serverxml: 1686 bytes
查看已創(chuàng)建的ConfigMap的詳細內(nèi)容,可以看到兩個配置文件的全文:
# kubectl get configmap cm-appconfigfiles -o yaml apiVersion: v1 data: key-loggingproperties:"handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli. FileHandler, java.util.logging.ConsoleHandler\r\n\r\n.handlers = 1catalina.org.apache. juli.FileHandler, java.util.logging.ConsoleHandler\r\n\r\n1catalina.org.apache.juli. FileHandler.level = FINE\r\n1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n1catalina.org.apache.juli.FileHandler.prefix = catalina.\r\n\r\n2localhost.org.apache.juli.FileHandler.level = FINE\r\n2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n2localhost.org.apache.juli.FileHandler.prefix = localhost.\r\n\r\n3manager.org.apache.juli.FileHandler.level = FINE\r\n3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n3manager.org.apache.juli.FileHandler.prefix = manager.\r\n\r\n4host-manager.org.apache.juli.FileHandler.level = FINE\r\n4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n4host-manager.org.apache.juli.FileHandler. prefix = host-manager.\r\n\r\njava.util.logging.ConsoleHandler.level = FINE\r\njava. util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter\r\n\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. handlers = 2localhost.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].[/manager].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. [/manager].handlers = 3manager.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. [/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler\r\n\r\n" key-serverxml: | <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core. JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans. GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core. ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server> kind: ConfigMap metadata: creationTimestamp: 2016-07-29T00:52:18Z name: cm-appconfigfiles namespace: default resourceVersion: "85054" selfLink: /api/v1/namespaces/default/configmaps/cm-appconfigfiles uid: b30d5019-5526-11e6-9dcd-000c29dc2102
2.通過kubectl命令行方式創(chuàng)建
不使用YAML文件,直接通過kubectl create configmap也可以創(chuàng)建ConfigMap,可以使用參數(shù)--from-file或--from-literal指定內(nèi)容,并且可以在一行命令中指定多個參數(shù)。
(1)通過--from-file參數(shù)從文件中進行創(chuàng)建,可以指定key的名稱,也可以在一個命令行中創(chuàng)建包含多個key的ConfigMap,語法為:
# kubectl create configmap NAME --from-file=[key=]source --from-file=[key=]source
(2)通過--from-file參數(shù)從目錄中進行創(chuàng)建,該目錄下的每個配置文件名都被設(shè)置為key,文件的內(nèi)容被設(shè)置為value,語法為:
# kubectl create configmap NAME --from-file=config-files-dir
(3)使用--from-literal時會從文本中進行創(chuàng)建,直接將指定的key#=value#創(chuàng)建為ConfigMap的內(nèi)容,語法為:
# kubectl create configmap NAME --from-literal=key1=value1--from-literal= key2=value2
下面對這幾種用法舉例說明。
例如,在當前目錄下含有配置文件server.xml,可以創(chuàng)建一個包含該文件內(nèi)容的ConfigMap:
# kubectl create configmap cm-server.xml --from-file=server.xml
configmap "cm-server.xml" created
# kubectl describe configmap cm-server.xml
Name: cm-server.xml
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
server.xml: 6458 bytes
假設(shè)在configfiles目錄下包含兩個配置文件server.xml和logging.properties,創(chuàng)建一個包含這兩個文件內(nèi)容的ConfigMap:
# kubectl create configmap cm-appconf --from-file=configfiles
configmap "cm-appconf" created
# kubectl describe configmap cm-appconf
Name: cm-appconf
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
logging.properties: 3354 bytes
server.xml: 6458 bytes
使用--from-literal參數(shù)進行創(chuàng)建的示例如下:
# kubectl create configmap cm-appenv --from-literal=loglevel=info --from-literal =appdatadir=/var/data configmap "cm-appenv" created # kubectl describe configmap cm-appenv Name: cm-appenv Namespace: default Labels: <none> Annotations: <none> Data ==== appdatadir: 9 bytes loglevel: 4 bytes
容器應(yīng)用對ConfigMap的使用有以下兩種方法。
(1)通過環(huán)境變量獲取ConfigMap中的內(nèi)容。
(2)通過Volume掛載的方式將ConfigMap中的內(nèi)容掛載為容器內(nèi)部的文件或目錄。
3.5.3 在Pod中使用ConfigMap
1.通過環(huán)境變量方式使用ConfigMap
以前面創(chuàng)建的ConfigMap“cm-appvars”為例:
apiVersion: v1 kind: ConfigMap metadata: name: cm-appvars data: apploglevel: info appdatadir: /var/data
在Pod“cm-test-pod”的定義中,將ConfigMap“cm-appvars”中的內(nèi)容以環(huán)境變量(APPLOGLEVEL和APPDATADIR)方式設(shè)置為容器內(nèi)部的環(huán)境變量,容器的啟動命令將顯示這兩個環(huán)境變量的值("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 # 定義環(huán)境變量的名稱 valueFrom: # key“apploglevel”對應(yīng)的值 configMapKeyRef: name: cm-appvars # 環(huán)境變量的值取自cm-appvars: key: apploglevel # key為apploglevel - name: APPDATADIR # 定義環(huán)境變量的名稱 valueFrom: # key“appdatadir”對應(yīng)的值 configMapKeyRef: name: cm-appvars # 環(huán)境變量的值取自cm-appvars key: appdatadir # key為appdatadir restartPolicy: Never
使用kubectl create -f命令創(chuàng)建該Pod,由于是測試Pod,所以該Pod在執(zhí)行完啟動命令后將會退出,并且不會被系統(tǒng)自動重啟(restartPolicy=Never):
# kubectl create -f cm-test-pod.yaml pod "cm-test-pod" created
使用kubectl get pods --show-all查看已經(jīng)停止的Pod:
# kubectl get pods --show-all NAME READY STATUS RESTARTS AGE cm-test-pod 0/1 Completed 0 8s
查看該Pod的日志,可以看到啟動命令“env | grep APP”的執(zhí)行結(jié)果如下:
# kubectl logs cm-test-pod APPDATADIR=/var/data APPLOGLEVEL=info
說明容器內(nèi)部的環(huán)境變量使用ConfigMap cm-appvars中的值進行了正確設(shè)置。
Kubernetes從1.6版本開始,引入了一個新的字段envFrom,實現(xiàn)了在Pod環(huán)境中將ConfigMap(也可用于Secret資源對象)中所有定義的key=value自動生成為環(huán)境變量:
apiVersion: v1 kind: Pod metadata: name: cm-test-pod spec: containers: - name: cm-test image: busybox command: [ "/bin/sh", "-c", "env" ] envFrom: - configMapRef name: cm-appvars # 根據(jù)cm-appvars中的key=value自動生成環(huán)境變量 restartPolicy: Never
通過這個定義,在容器內(nèi)部將會生成如下環(huán)境變量:
apploglevel=info appdatadir=/var/data
需要說明的是,環(huán)境變量的名稱受POSIX命名規(guī)范([a-zA-Z_][a-zA-Z0-9_]*)約束,不能以數(shù)字開頭。如果包含非法字符,則系統(tǒng)將跳過該條環(huán)境變量的創(chuàng)建,并記錄一個Event來提示環(huán)境變量無法生成,但并不阻止Pod的啟動。
2.通過volumeMount使用ConfigMap
在如下所示的cm-appconfigfiles.yaml例子中包含兩個配置文件的定義:server.xml和logging.properties。
cm-appconfigfiles.yaml apiVersion: v1 kind: ConfigMap metadata: name: cm-serverxml data: key-serverxml: | <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core. JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans. GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core. ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server> key-loggingproperties:"handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler\r\n\r\n.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler\r\n\r\n1catalina.org.apache.juli.FileHandler.level = FINE\r\n1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n1catalina.org.apache.juli.FileHandler.prefix = catalina.\r\n\r\n2localhost.org.apache.juli.FileHandler.level = FINE\r\n2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n2localhost.org.apache.juli.FileHandler.prefix = localhost.\r\n\r\n3manager.org.apache.juli.FileHandler.level = FINE\r\n3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n3manager.org.apache.juli.FileHandler.prefix = manager.\r\n\r\n4host-manager.org.apache.juli.FileHandler.level = FINE\r\n4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n4host-manager.org.apache.juli.FileHandler. prefix = host-manager.\r\n\r\njava.util.logging.ConsoleHandler.level = FINE\r\njava.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter\r\n\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. handlers = 2localhost.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].[/manager].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. [/manager].handlers = 3manager.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core. ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost]. [/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler\r\n\r\n"
在Pod“cm-test-app”的定義中,將ConfigMap“cm-appconfigfiles”中的內(nèi)容以文件的形式mount到容器內(nèi)部的/configfiles目錄下。Pod配置文件cm-test-app.yaml的內(nèi)容如下:
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 # 掛載到容器內(nèi)的目錄 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文件名進行掛載
創(chuàng)建該Pod:
# kubectl create -f cm-test-app.yaml pod "cm-test-app" created
登錄容器,查看到在/configfiles目錄下存在server.xml和logging.properties文件,它們的內(nèi)容就是ConfigMap“cm-appconfigfiles”中兩個key定義的內(nèi)容:
# kubectl exec -ti cm-test-app -- bash root@cm-test-app:/# cat /configfiles/server.xml <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> ...... root@cm-test-app:/# cat /configfiles/logging.properties handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler ......
如果在引用ConfigMap時不指定items,則使用volumeMount方式在容器內(nèi)的目錄下為每個item都生成一個文件名為key的文件。
Pod配置文件cm-test-app.yaml的內(nèi)容如下:
apiVersion: v1 kind: Pod metadata: name: cm-test-app spec: containers: - name: cm-test-app image: kubeguide/tomcat-app:v1 imagePullPolicy: Never ports: - containerPort: 8080 volumeMounts: - name: serverxml # 引用Volume的名稱 mountPath: /configfiles # 掛載到容器內(nèi)的目錄 volumes: - name: serverxml # 定義Volume的名稱 configMap: name: cm-appconfigfiles # 使用ConfigMap“cm-appconfigfiles”
創(chuàng)建該Pod:
# kubectl create -f cm-test-app.yaml pod "cm-test-app" created
登錄容器,查看到在/configfiles目錄下存在key-loggingproperties和key-serverxml文件,文件的名稱來自在ConfigMap cm-appconfigfiles中定義的兩個key的名稱,文件的內(nèi)容則為value的內(nèi)容:
# ls /configfiles key-loggingproperties key-serverxml
3.5.4 使用ConfigMap的限制條件
使用ConfigMap的限制條件如下。
◎ ConfigMap必須在Pod之前創(chuàng)建。
◎ ConfigMap受Namespace限制,只有處于相同Namespace中的Pod才可以引用它。
◎ ConfigMap中的配額管理還未能實現(xiàn)。
◎ kubelet只支持可以被API Server管理的Pod使用ConfigMap。kubelet在本Node上通過--manifest-url或--config自動創(chuàng)建的靜態(tài)Pod將無法引用ConfigMap。
◎ 在Pod對ConfigMap進行掛載(volumeMount)操作時,在容器內(nèi)部只能掛載為“目錄”,無法掛載為“文件”。在掛載到容器內(nèi)部后,在目錄下將包含ConfigMap定義的每個item,如果在該目錄下原來還有其他文件,則容器內(nèi)的該目錄將被掛載的ConfigMap覆蓋。如果應(yīng)用程序需要保留原來的其他文件,則需要進行額外的處理。可以將ConfigMap掛載到容器內(nèi)部的臨時目錄,再通過啟動腳本將配置文件復(fù)制或者鏈接到(cp或link命令)應(yīng)用所用的實際配置目錄下。