Kubernetes的ConfigMap解析


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可以被用來:

  1. 設置環境變量的值
  2. 在容器里設置命令行參數
  3. 在數據卷里面創建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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM