ConfigMap功能在Kubernetes1.2版本的時候就有了,許多應用程序會從配置文件、命令行參數或環境變量中讀取配置信息。這些配置信息需要與docker image解耦,你總不能每修改一個配置就重做一個image吧?ConfigMap API給我們提供了向容器中注入配置信息的機制,ConfigMap可以被用來保存單個屬性,也可以用來保存整個配置文件或者JSON二進制大對象。
ConfigMap概覽
ConfigMap API資源用來保存key-value pair配置數據,這個數據可以在pods里使用,或者被用來為像controller一樣的系統組件存儲配置數據。雖然ConfigMap跟Secrets類似,但是ConfigMap更方便的處理不含敏感信息的字符串。 注意:ConfigMaps不是屬性配置文件的替代品。ConfigMaps只是作為多個properties文件的引用。你可以把它理解為Linux系統中的/etc
目錄,專門用來存儲配置文件的目錄。下面舉個例子,使用ConfigMap配置來創建Kuberntes Volumes,ConfigMap中的每個data項都會成為一個新文件。
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可以被用來:
- 設置環境變量的值
- 在容器里設置命令行參數
- 在數據卷里面創建config文件
用戶和系統組件兩者都可以在ConfigMap里面存儲配置數據。
其實不用看下面的文章,直接從kubectl create configmap -h
的幫助信息中就可以對ConfigMap究竟如何創建略知一二了。
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
創建ConfigMaps
可以使用該命令,用給定值、文件或目錄來創建ConfigMap。
kubectl create configmap
使用目錄創建
比如我們已經有個了包含一些配置文件,其中包含了我們想要設置的ConfigMap的值:
$ 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。
$ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl
—from-file
指定在目錄下的所有文件都會被用在ConfigMap里面創建一個鍵值對,鍵的名字就是文件名,值就是文件的內容。
讓我們來看一下這個命令創建的ConfigMap:
$ 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
這個參數可以使用多次,你可以使用兩次分別指定上個實例中的那兩個配置文件,效果就跟指定整個目錄是一樣的。
使用Literal值創建
使用文字值創建,利用—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
Pod中使用ConfigMap
使用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/