天天看點

k8s存儲之configmapconfigMap 描述資訊Pod 中使用 ConfigMap

目錄

configMap 描述資訊

Ⅰ、使用目錄建立

Ⅱ、使用檔案建立

Ⅲ、使用字面值建立

Pod 中使用 ConfigMap

Ⅰ、使用 ConfigMap 來替代環境變量

Ⅱ、用 ConfigMap 設定指令行參數

Ⅲ、通過資料卷插件使用ConfigMap

Ⅳ、ConfigMap 的熱更新

configmap是專門存儲我們配置檔案的存儲方案

configMap 描述資訊

ConfigMap 功能在 Kubernetes1.2 版本中引入,許多應用程式會從配置檔案、指令行參數或環境變量中讀取配置資訊。ConfigMap API 給我們提供了向容器中注入配置資訊的機制,ConfigMap 可以被用來儲存單個屬性,也可以用來儲存整個配置檔案或者 JSON 二進制等對象。

Ⅰ、使用目錄建立

[[email protected] configmap]# vim dir/game.properties
[[email protected] configmap]# vim dir/ui.properties
[[email protected] configmap]# 
[[email protected] configmap]# 
[[email protected] configmap]# kubectl create configmap game-config --from-file=./dir/
configmap/game-config created
[[email protected] configmap]# 
[[email protected] configmap]# kubectl get cm
NAME          DATA   AGE
game-config   2      16s
[[email protected] configmap]# cat dir/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
[[email protected] configmap]# 
[[email protected] configmap]# cat dir/ui.properties 
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
[[email protected] configmap]# 
           

—from-file 指定在目錄下的所有檔案都會被用在 ConfigMap 裡面建立一個鍵值對,鍵的名字就是檔案名,值就是檔案的内容。

Ⅱ、使用檔案建立

隻要指定為一個檔案就可以從單個檔案中建立 ConfigMap,跟上面的差別就是目錄和檔案的使用

[[email protected] configmap]# kubectl create configmap game-config-2 --from-file=./dir/game.properties 
configmap/game-config-2 created
[[email protected] configmap]# kubectl get cm
NAME            DATA   AGE
game-config     2      3m12s
game-config-2   1      3s
           

—from-file 這個參數可以使用多次,你可以使用兩次分别指定上個執行個體中的那兩個配置檔案,效果就跟指定整個目錄是一樣的。

Ⅲ、使用字面值建立

使用文字值建立,利用 —from-literal 參數傳遞配置資訊,該參數可以使用多次,格式如下:

[[email protected] configmap]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created
[[email protected] configmap]# 
[[email protected] configmap]# kubectl get cm 
NAME             DATA   AGE
game-config      2      9m22s
game-config-2    1      6m13s
special-config   2      5s
[[email protected] configmap]# kubectl describe cm special-config 
Name:         special-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
special.how:
----
very
special.type:
----
charm
Events:  <none>
[[email protected] configmap]# 
           

分析:special-config表示指定的名字;後面的--from-literal表示指定的鍵名=值。

既然上面已經分析了三種建立方式,下面的就是一些使用案例

Pod 中使用 ConfigMap

Ⅰ、使用 ConfigMap 來替代環境變量

測試的cm是一個special-config,這之前建立好了,一個env-config

special-config這個cm是之前建立好的,這裡補充它的對于的yaml檔案如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm
           

下面建立env.yaml

[[email protected] env]# cat  env.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
[[email protected] env]# 
[[email protected] env]# kubectl create -f   env.yaml 
configmap/env-config created
[[email protected] env]# 
[[email protected] env]# kubectl get cm
NAME             DATA   AGE
env-config       1      5s
game-config      2      16m
game-config-2    1      12m
special-config   2      6m50s
           

上面的兩個是我們建立的擁有不同的鍵值對的ConfigMap,給我們下面建立的pod進行比對

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: hub.atguigu.com/library/myapp:v1
      command: [ "/bin/sh", "-c", "env" ]     #列印出我們的壞境變量env
     env:
       - name: SPECIAL_LEVEL_KEY
         valueFrom:[[email protected] configmap]# kubectl create -f  pod.yaml
pod/dapi-test-pod created
[[email protected] configmap]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]     #列印出我們的壞境變量env
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how         #導入的是special-config裡面的special.how的值(very),即此時把這個值賦給SPECIAL_LEVEL_KEY
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.type
      envFrom:                #這個就表示我們上面建立的env-config就被導入了
        - configMapRef:
            name: env-config       #比對上哪個ConfigMap根據這個
  restartPolicy: Never
           

會有三個不同的環境變量,第一個是env-config,它的鍵值對是log_level: INFO

第二個它的鍵名是SPECIAL_LEVEL_KEY,鍵值是very

第三個它的鍵名是SPECIAL_TYPE_KEY,鍵值是charm

總結:上面的就是兩種不同的方式,一種通過env字段,一種通過envFrom,把我們的環境變量注入到我們的pod内部。

k8s存儲之configmapconfigMap 描述資訊Pod 中使用 ConfigMap

總結:上面的就是通過我們的ConifigMap把我們的一個壞境變量注入到我們的pod内部。

Ⅱ、用 ConfigMap 設定指令行參數

其實這個跟上面的測試大同小異,上面是列印出整個pod 的env環境資訊,這裡我們隻是列印自己想要的那個環境資訊

測試的cm是我們的special-config

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm
           

 測試的pod的yaml檔案如下

[[email protected] configmap]# cat pod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
   - name: test-container
     image: 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
[[email protected] configmap]# 
[[email protected] configmap]# kubectl create -f  pod1.yaml 
pod/dapi-test-pod created
[[email protected] configmap]# 
[[email protected] configmap]# kubectl get pod 
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          58s
[[email protected] configmap]# kubectl logs dapi-test-pod 
very charm
[[email protected] configmap]# 
           

Ⅲ、通過資料卷插件使用ConfigMap

cm.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm
           

在資料卷裡面使用這個 ConfigMap,有不同的選項。最基本的就是将檔案填入資料卷,在這個檔案中,鍵就是檔案名,鍵值就是檔案内容。。。

[[email protected] configmap]# cat pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:alpine
      command: [ "/bin/sh", "-c", "sleep 600s" ]
      volumeMounts:        #在目前容器内進行資料卷為config-volume的挂載
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:        #這個config-volume從名字為special-config的導入來的
        name: special-config
  restartPolicy: Never
[[email protected] configmap]# 
[[email protected] configmap]# kubectl create -f  pod2.yaml
pod/dapi-test-pod created
[[email protected] configmap]# 
[[email protected] configmap]# kubectl get pod 
NAME            READY   STATUS    RESTARTS   AGE
dapi-test-pod   1/1     Running   0          3s
[[email protected] configmap]# kubectl exec -it dapi-test-pod sh 
/ # cd /etc/config
/etc/config # ls
special.how   special.type
/etc/config # cat special.how 
very/etc/config # 
/etc/config # cat special.type 
charm/etc/config # 
           

Ⅳ、ConfigMap 的熱更新

[[email protected] configmap]# cat  pod3.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: log-config
[[email protected] configmap]# 
[[email protected] configmap]# kubectl create -f   pod3.yaml
configmap/log-config created
deployment.extensions/my-nginx created
[[email protected] configmap]# 
[[email protected] configmap]# kubectl get pod 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6c59667984-b7htz   1/1     Running   0          36s
           

分析:上面是建立一個Deployment去調用ConfigMap,調用的方式是以volumes的方式挂載進來的挂載的是log-config,挂載的目錄是/etc/config 的目錄中。。也就意味我們去my-nginx容器中,在/etc/config的目錄下會有一個log_level的檔案名,它的内容應該是INFO。

[[email protected] configmap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
INFO[[email protected] configmap]#
           

修改 ConfigMap

kubectl edit configmap log-config

k8s存儲之configmapconfigMap 描述資訊Pod 中使用 ConfigMap

修改 log_level 的值為 DEBUG 等待大概 10 秒鐘時間,再次檢視環境變量的值,發現已經更改至DEBUG了,如果對于我們nginx的應用十分友好,可以達到這樣熱更新狀态。

[[email protected] configmap]# kubectl edit configmaps log-config 
configmap/log-config edited
[[email protected] configmap]# 
[[email protected] configmap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
INFO[[email protected] configmap]# 
[[email protected] configmap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
DEBUG[[email protected] configmap]# 
           

注意:configmap如果以env的方式挂載至容器,修改configmap不會實作熱更新。

ConfigMap 更新後滾動更新 Pod

更新 ConfigMap 目前并不會觸發相關 Pod 的滾動更新,即我們的pod不會更新,也就是pod不會死亡并啟動,即pod的名字不會變,我們可以通過修改 pod annotations 的方式強制觸發滾動更新。

kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations":{"version/config": "20190411" }}}}}'
           

!!! 更新 ConfigMap 後: 使用該 ConfigMap 挂載的 Env 不會同步更新 使用該 ConfigMap 挂載的 Volume 中的資料需要一段時間(實測大概10秒)才能同步更新

總結:上面的所有就是如何通過ConfigMap去儲存我們的一些配置檔案以及一些資料。那這些資料可以通過我們被導入pod内部成為環境變量或者是所謂的檔案,進而達到我們的這種熱更新的目的。但是這些檔案是以明文的方式去儲存的,如果有一些密碼檔案,通過ConfigMap就不适合了。

繼續閱讀