1. 程式人生 > >Kubernetes(k8s)中文文件 名詞解釋:ConfigMap_Kubernetes中文社群

Kubernetes(k8s)中文文件 名詞解釋:ConfigMap_Kubernetes中文社群

ConfigMap

ConfigMap用於儲存配置資料的鍵值對,可以用來儲存單個屬性,也可以用來儲存配置檔案。ConfigMap跟secret很類似,但它可以更方便地處理不包含敏感資訊的字串。

ConfigMap建立

可以使用kubectl create configmap從檔案、目錄或者key-value字串建立等建立ConfigMap。

# 從key-value字串建立ConfigMap
$ kubectl create configmap special-config --from-literal=special.how=very
configmap "special-config" created
$ kubectl get configmap special-config -o go-template='{{.data}}'
map[special.how:very]

# 從env檔案建立
$ echo -e "a=b\nc=d" | tee config.env
a=b
c=d
$ kubectl create configmap special-config --from-env-file=config.env
configmap "special-config" created
$ kubectl get configmap special-config -o go-template='{{.data}}'
map[a:b c:d]

# 從目錄建立
$ mkdir config
$ echo a>config/a
$ echo b>config/b
$ kubectl create configmap special-config --from-file=config/
configmap "special-config" created
$ kubectl get configmap special-config -o go-template='{{.data}}'
map[a:a
 b:b
]

ConfigMap使用

ConfigMap可以通過多種方式在Pod中使用,比如設定環境變數、設定容器命令列引數、在Volume中建立配置檔案等。

注意

  • ConfigMap必須在Pod引用它之前建立
  • 使用envFrom時,將會自動忽略無效的鍵
  • Pod只能使用同一個名稱空間內的ConfigMap

用作環境變數

首先建立ConfigMap:

$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
$ kubectl create configmap env-config --from-literal=log_level=INFO

然後以環境變數方式引用

apiVersion: v1
kind: Pod
metadata:
  name: 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的資料儲存在環境變數中,然後通過$(VAR_NAME)的方式引用環境變數.

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

使用volume將ConfigMap作為檔案或目錄直接掛載

將建立的ConfigMap直接掛載至Pod的/etc/config目錄下,其中每一個key-value鍵值對都會生成一個檔案,key為檔名,value為內容

apiVersion: v1
kind: Pod
metadata:
  name: vol-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中special.how這個key掛載到/etc/config目錄下的一個相對路徑/keys/special.level。如果存在同名檔案,直接覆蓋。其他的key不掛載

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/keys/special.level" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: special.how
          path: keys/special.level
  restartPolicy: Never

當Pod結束後會輸出

very

參考:https://feisky.gitbooks.io/kubernetes/concepts/configmap.html

K8S中文社群微信公眾號