天天看點

k8s初級實戰08--ConfigMap1 基礎概念2 常見用法3 注意事項4 說明

k8s初級實戰08--ConfigMap

  • 1 基礎概念
  • 2 常見用法
    • 2.1 建立configmap
    • 2.2 使用configmap
  • 3 注意事項
  • 4 說明

1 基礎概念

ConfigMap 是一種 API 對象,用來将非機密性的資料儲存到鍵值對中。使用時, Pods 可以将其用作環境變量、指令行參數或者存儲卷中的配置檔案。

ConfigMap 将環境配置資訊和容器鏡像解耦,便于應用配置的修改。

2 常見用法

2.1 建立configmap

  1. 通過 yaml 建立
    vim configmap.yaml 
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: cm-data01
    data:
      username: config_name
      password: config_pwd
     建立:
    $ kubectl apply -f configmap.yaml
    檢視configmap詳細資訊:
    $ kubectl describe configmaps  cm-data01 
    Name:         cm-data01
    Namespace:    default
    ......
    Data
    ====
    password:
    ----
    config_pwd
    username:
    ----
    config_name
    Events:  <none>
               
  2. 通過指令行file建立
    通過指令行建立data的時候,檔案名稱即為對應資料的key
    $ cat << EOF >username
    > config_name
    > EOF
    $ cat << EOF >password
    > config_pwd
    > EOF
    $ kubectl create configmap cm-data02 --from-file=password --from-file=username 
    configmap/cm-data02 created
               
  3. 通過指令行key-value字元串建立
    $ kubectl create configmap cm-data03 --from-literal=username=config_name03 --from-literal=password=config_pwd03 --dry-run=client -o yaml
    apiVersion: v1
    data:
      password: config_pwd03
      username: config_name03
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: cm-data03
               
  4. 通過env檔案建立
    $ vim config.env 
    username=config_name04
    password=config_pwd04
    $ kubectl create configmap cm-data04 --from-env-file=config.env --dry-run=client -o yaml >cm-data04.yaml
    $ kubectl apply -f cm-data04.yaml 
    configmap/cm-data04 created
    檢視cm-data04 的資料 
    $ kubectl get cm cm-data04 -o go-template='{{.data}}'
    map[password:config_pwd04 username:config_name04]
               
  5. 建立不可變更的configMap

    1.19 版本的k8s 可以通過 immutable: true 來設定不可變更的cm。

    對于大量使用 ConfigMap 的 叢集(至少有數萬個各不相同的 ConfigMap 給 Pod 挂載)而言,禁止更改 ConfigMap 的資料有以下好處:

    1)保護應用,使之免受意外(不想要的)更新所帶來的負面影響。

    2)通過大幅降低對 kube-apiserver 的壓力提升叢集性能,這是因為系統會關閉 對已标記為不可變更的 ConfigMap 的監視操作。

    $ vim cm-data-im.yaml 
    kind: ConfigMap
    apiVersion: v1
    metadata:
    name: cm-data-im
    data:
    username: config_name_im
    password: config_pwd_im
    immutable: true
    
    測試:
    将密碼更新為 password: config_pwd_im+
    $ kubectl apply -f cm-data-im.yaml 
    The ConfigMap "cm-data-im" is invalid: data: Forbidden: field is immutable when `immutable` is set
               
    一旦某 ConfigMap 被标記為不可變更,則 無法 逆轉這一變化,,也無法更改 data 或 binaryData 字段的内容。你隻能删除并重建 ConfigMap。 因為現有的 Pod 會維護一個對已删除的 ConfigMap 的挂載點,建議重新建立 這些 Pods。

2.2 使用configmap

ConfigMap 可以通過三種方式在 Pod 中使用,三種分别方式為:

1)設定環境變量,

2)設定容器指令行參數,

3)在 Volume 中直接挂載檔案或目錄,

4)編寫代碼在 Pod 中運作,使用 Kubernetes API 來讀取 ConfigMap。

  1. 建立pod 使用上述configMap
    $ vim pod-cm-data01.yaml 
    kind: Pod
    apiVersion: v1
    metadata:
      name: cm-data01
    spec:
      containers:
      - name: test-cm01
        image: busybox:1.32
        command: ['sh', '-c', 'sleep 1000000']
        volumeMounts:
        - name: config-volume 
          mountPath: /my-config 
      volumes:
      - name: config-volume
        configMap:
          name: cm-data01
    
    建立pod:
    $ kubectl apply -f pod-cm-data01.yaml
    檢視挂載的資料:
    / # ls
    bin        dev        etc        home       my-config  proc       root       sys        tmp        usr        var
    / # cat /my-config/username 
    config_name/ # 
    / # cat /my-config/password 
    config_pwd/ # 
    
    此時更新cm-data01的password的值為: config_pwd01+, 發現pod中挂載的内容也同步更新了
    $ kubectl  exec cm-data01 -- cat /my-config/password
    config_pwd01+
               
    注意:當卷中使用的 ConfigMap 被更新時,所投射的鍵最終也會被更新。

3 注意事項

  1. ConfigMap 必須在 Pod 引用它之前建立
  2. 使用 envFrom 時,将會自動忽略無效的鍵
  3. Pod 隻能使用同一個命名空間内的 ConfigMap

4 說明

概念->配置->ConfigMap

github feiskyer/kubernetes-handbook/blob/master/concepts/configmap

繼續閱讀