目錄
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内部。

總結:上面的就是通過我們的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
修改 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就不适合了。