Kubernetes的ConfigMap解析

ConfigMap功能在Kubernetes1.2版本的時候就有了,許多應用程序會從配置文件、命令行參數或環境變量中讀取配置信息。這些配置信息須要與docker image解耦,你總不能每修改一個配置就重作一個image吧?ConfigMap API給咱們提供了向容器中注入配置信息的機制,ConfigMap能夠被用來保存單個屬性,也能夠用來保存整個配置文件或者JSON二進制大對象。javascript

ConfigMap概覽

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

  1. 設置環境變量的值
  2. 在容器裏設置命令行參數
  3. 在數據卷裏面建立config文件

用戶和系統組件二者均可以在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 

建立ConfigMaps

可使用該命令,用給定值、文件或目錄來建立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這個參數可使用屢次,你可使用兩次分別指定上個實例中的那兩個配置文件,效果就跟指定整個目錄是同樣的。

使用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/

相關文章
相關標籤/搜索