ConfigMap功能在Kubernetes1.2版本的時候就有了,許多應用程序會從配置文件、命令行參數或環境變量中讀取配置信息。這些配置信息須要與docker image解耦,你總不能每修改一個配置就重作一個image吧?ConfigMap API給咱們提供了向容器中注入配置信息的機制,ConfigMap能夠被用來保存單個屬性,也能夠用來保存整個配置文件或者JSON二進制大對象。javascript
ConfigMap API資源用來保存key-value pair配置數據,這個數據能夠在pods裏使用,或者被用來爲像controller同樣的系統組件存儲配置數據。雖然ConfigMap跟Secrets相似,可是ConfigMap更方便的處理不含敏感信息的字符串。 注意:ConfigMaps不是屬性配置文件的替代品。ConfigMaps只是做爲多個properties文件的引用。你能夠把它理解爲Linux系統中的/etc
目錄,專門用來存儲配置文件的目錄。下面舉個例子,使用ConfigMap配置來建立Kuberntes Volumes,ConfigMap中的每一個data項都會成爲一個新文件。java
kind: ConfigMap
apiVersion: v1
metadata:
creationTimestamp: 2016-02-18T19:14:38Z name: example-config namespace: default data: example.property.1: hello example.property.2: world example.property.file: |- property.1=value-1 property.2=value-2 property.3=value-3
data
一欄包括了配置數據,ConfigMap能夠被用來保存單個屬性,也能夠用來保存一個配置文件。 配置數據能夠經過不少種方式在Pods裏被使用。ConfigMaps能夠被用來:git
用戶和系統組件二者均可以在ConfigMap裏面存儲配置數據。github
其實不用看下面的文章,直接從kubectl create configmap -h
的幫助信息中就能夠對ConfigMap究竟如何建立略知一二了。sql
Examples:
# Create a new configmap named my-config based on folder bar kubectl create configmap my-config --from-file=path/to/bar # Create a new configmap named my-config with specified keys instead of file basenames on disk kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt # Create a new configmap named my-config with key1=config1 and key2=config2 kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
可使用該命令,用給定值、文件或目錄來建立ConfigMap。docker
kubectl create configmap
好比咱們已經有個了包含一些配置文件,其中包含了咱們想要設置的ConfigMap的值:api
$ ls docs/user-guide/configmap/kubectl/ game.properties ui.properties $ cat docs/user-guide/configmap/kubectl/game.properties enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 $ cat docs/user-guide/configmap/kubectl/ui.properties color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
使用下面的命令能夠建立一個包含目錄中全部文件的ConfigMap。ruby
$ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl
—from-file
指定在目錄下的全部文件都會被用在ConfigMap裏面建立一個鍵值對,鍵的名字就是文件名,值就是文件的內容。bash
讓咱們來看一下這個命令建立的ConfigMap:ide
$ kubectl describe configmaps game-config
Name: game-config
Namespace: default
Labels: <none> Annotations: <none> Data ==== game.properties: 158 bytes ui.properties: 83 bytes
咱們能夠看到那兩個key是從kubectl指定的目錄中的文件名。這些key的內容可能會很大,因此在kubectl describe的輸出中,只可以看到鍵的名字和他們的大小。 若是想要看到鍵的值的話,可使用kubectl get
:
$ kubectl get configmaps game-config -o yaml
咱們以yaml
格式輸出配置。
apiVersion: v1
data:
game.properties: |
enemies=aliens
lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:34:05Z name: game-config namespace: default resourceVersion: "407" selfLink: /api/v1/namespaces/default/configmaps/game-config uid: 30944725-d66e-11e5-8cd0-68f728db1985
剛纔使用目錄建立的時候咱們—from-file
指定的是一個目錄,只要指定爲一個文件就能夠從單個文件中建立ConfigMap。
$ kubectl create configmap game-config-2 --from-file=docs/user-guide/configmap/kubectl/game.properties $ kubectl get configmaps game-config-2 -o yaml
apiVersion: v1
data:
game-special-key: |
enemies=aliens
lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:54:22Z name: game-config-3 namespace: default resourceVersion: "530" selfLink: /api/v1/namespaces/default/configmaps/game-config-3 uid: 05f8da22-d671-11e5-8cd0-68f728db1985
—from-file
這個參數可使用屢次,你可使用兩次分別指定上個實例中的那兩個配置文件,效果就跟指定整個目錄是同樣的。
使用文字值建立,利用—from-literal
參數傳遞配置信息,該參數可使用屢次,格式以下;
$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm $ kubectl get configmaps special-config -o yaml
apiVersion: v1
data:
special.how: very
special.type: charm
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T19:14:38Z name: special-config namespace: default resourceVersion: "651" selfLink: /api/v1/namespaces/default/configmaps/special-config uid: dadce046-d673-11e5-8cd0-68f728db1985
使用ConfigMap來替代環境變量
ConfigMap能夠被用來填入環境變量。看下下面的ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default data: special.how: very special.type: charm
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default data: log_level: INFO
咱們能夠在Pod中這樣使用ConfigMap:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "env" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type envFrom: - configMapRef: name: env-config restartPolicy: Never
這個Pod運行後會輸出以下幾行:
SPECIAL_LEVEL_KEY=very SPECIAL_TYPE_KEY=charm log_level=INFO
用ConfigMap設置命令行參數
ConfigMap也能夠被使用來設置容器中的命令或者參數值。它使用的是Kubernetes的$(VAR_NAME)替換語法。咱們看下下面這個ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default data: special.how: very special.type: charm
爲了將ConfigMap中的值注入到命令行的參數裏面,咱們還要像前面那個例子同樣使用環境變量替換語法${VAR_NAME)
。(其實這個東西就是給Docker容器設置環境變量,之前我建立鏡像的時候常常這麼玩,經過docker run的時候指定-e參數修改鏡像裏的環境變量,而後docker的CMD命令再利用該$(VAR_NAME)經過sed來來修改配置文件或者做爲命令行啓動參數。)
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type restartPolicy: Never
運行這個Pod後會輸出:
very charm
經過數據卷插件使用ConfigMap
ConfigMap也能夠在數據卷裏面被使用。仍是這個ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default data: special.how: very special.type: charm
在數據卷裏面使用這個ConfigMap,有不一樣的選項。最基本的就是將文件填入數據卷,在這個文件中,鍵就是文件名,鍵值就是文件內容:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "cat /etc/config/special.how" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config restartPolicy: Never
運行這個Pod的輸出是very
。
咱們也能夠在ConfigMap值被映射的數據卷裏控制路徑。
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config items: - key: special.how path: path/to/special-key restartPolicy: Never
運行這個Pod後的結果是very
。
http://rootsongjc.github.io/blogs/kubernetes-configmap-introduction/