一、描述信息
ConfigMap 功能在 Kubernetes1.2 版本中引入仁热,許多應(yīng)用程序會從配置文件榜揖、命令行參數(shù)或環(huán)境變量中讀取配置信息。ConfigMap API 給我們提供了向容器中注入配置信息的機制,ConfigMap 可以被用來保存單個屬性举哟,也可以用來保存整個配置文件或者 JSON 二進制大對象
應(yīng)用場景:鏡像往往是一個應(yīng)用的基礎(chǔ)思劳,還有很多需要自定義的參數(shù)或配置,例如資源的消耗妨猩、日志的級別等等潜叛,這些配置可能會有很多,因此不能放入鏡像中册赛,Kubernetes中提供了Configmap來實現(xiàn)向容器中提供配置文件或環(huán)境變量來實現(xiàn)不同配置钠导,從而實現(xiàn)了鏡像配置與鏡像本身解耦,使容器應(yīng)用做到不依賴于環(huán)境配置森瘪。
二牡属、什么是ConfigMap
利用ConfigMap可以解耦部署與配置的關(guān)系,對于同一個應(yīng)用部署文件扼睬,可以利用valueFrom字段引用一個在測試環(huán)境和生產(chǎn)環(huán)境都有的ConfigMap(當然配置內(nèi)容不相同逮栅,只是名字相同),就可以降低環(huán)境管理和部署的復(fù)雜度窗宇。
ConfigMap有三種用法:
- 生成為容器內(nèi)的環(huán)境變量
- 設(shè)置容器啟動命令的參數(shù)
- 掛載為容器內(nèi)部的文件或目錄
ConfigMap的缺點
- ConfigMap必須在Pod之前創(chuàng)建
- ConfigMap屬于某個NameSpace措伐,只有處于相同NameSpace的Pod才可以應(yīng)用它
- ConfigMap中的配額管理還未實現(xiàn)
- 如果是volume的形式掛載到容器內(nèi)部,只能掛載到某個目錄下军俊,該目錄下原有的文件會被覆蓋掉
- 靜態(tài)Pod不能用ConfigMap
ConfigMap 的創(chuàng)建
1侥加、使用目錄創(chuàng)建
$ 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
$ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl
game-config :configmap的名稱
--from-file:指定一個目錄,目錄下的所有內(nèi)容都會被創(chuàng)建出來粪躬。以鍵值對的形式
—from-file指定在目錄下的所有文件都會被用在 ConfigMap 里面創(chuàng)建一個鍵值對担败,鍵的名字就是文件名,值就是文件的內(nèi)容
kubectl get cm 查看configmap文件
kubectl get cm game-config -o yaml 查看詳細信息
kubectl describe cm
2镰官、使用文件創(chuàng)建
只要指定為一個文件就可以從單個文件中創(chuàng)建 ConfigMap
$ kubectl create configmap game-config-2 --from-file=docs/user-guide/configmap/kubectl/game.properties
$ kubectlget configmaps game-config-2 -o yaml
—from-file
這個參數(shù)可以使用多次提前,你可以使用兩次分別指定上個實例中的那兩個配置文件,效果就跟指定整個目錄是一樣的
2泳唠、使用字面值創(chuàng)建
使用文字值創(chuàng)建狈网,利用—from-literal參數(shù)傳遞配置信息,該參數(shù)可以使用多次笨腥,格式如下
$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
$ kubectlget configmaps special-config -o yaml #查看
--from-literal=special.how=very
指定鍵名為special.how 鍵值為very
三拓哺、Pod 中使用 ConfigMap
1、使用 ConfigMap 來替代環(huán)境變量
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
#special.how: very 鍵名:鍵值
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
#將兩個ConfigMap文件注入到pod環(huán)境中
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: #第一種導入方案
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config #從那個configMap文件導入
key: special.how #導入的是那個鍵的鍵名脖母,就是將special.how鍵的鍵值賦予
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.type
envFrom: #第二種導入方案
- configMapRef:
name: env-config
restartPolicy: Never
2士鸥、用 ConfigMap 設(shè)置命令行參數(shù)
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
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","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
3、通過數(shù)據(jù)卷插件使用ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
在數(shù)據(jù)卷里面使用這個 ConfigMap镶奉,有不同的選項础淤。最基本的就是將文件填入數(shù)據(jù)卷,在這個文件中哨苛,鍵就是文件名鸽凶,鍵值就是文件內(nèi)容
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","cat /etc/config/special.how"]
volumeMounts: #容器下進行volum掛載
- name: config-volume #掛載的名稱為config-volume,與下邊相呼應(yīng)
mountPath: /etc/config
volumes:
- name: config-volume #名稱為config-volume
configMap: #從configMap導入
name: special-config #導入的configMap名稱
restartPolicy: Never
四建峭、ConfigMap 的熱更新
#創(chuàng)建一個configMap
apiVersion: v1
kind: ConfigMap
metadata:
name: log-config
namespace: default
data:
log_level: INFO
---
#創(chuàng)建Deployment對configMap進行調(diào)用玻侥,調(diào)用的方式是以volum方式進行掛載
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: hub.atguigu.com/library/myapp:v1
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: log-config
$ kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2`cat/etc/config/log_level
INFO
修改 ConfigMap
$ kubectl edit configmap log-config
修改log_level的值為DEBUG等待大概 10 秒鐘時間,再次查看環(huán)境變量的值
$ kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2`cat /tmp/log_levelDEBUG
ConfigMap 更新后滾動更新 Pod
更新 ConfigMap 目前并不會觸發(fā)相關(guān) Pod 的滾動更新亿蒸,可以通過修改 pod annotations 的方式強制觸發(fā)滾動更新
$ kubectl patch deployment my-nginx --patch'{"spec": {"template": {"metadata": {"annotations":{"version/config": "20190411" }}}}}'
這個例子里我們在.spec.template.metadata.annotations中添加version/config凑兰,每次通過修改version/config來觸發(fā)滾動更新
更新 ConfigMap 后:
- 使用該 ConfigMap 掛載的 Env 不會同步更新
- 使用該 ConfigMap 掛載的 Volume 中的數(shù)據(jù)需要一段時間(實測大概10秒)才能同步更新
ENV 是在容器啟動的時候注入的,啟動之后 kubernetes 就不會再改變環(huán)境變量的值边锁,且同一個 namespace 中的 pod 的環(huán)境變量是不斷累加的姑食,參考 Kubernetes中的服務(wù)發(fā)現(xiàn)與docker容器間的環(huán)境變量傳遞源碼探究。為了更新容器中使用 ConfigMap 掛載的配置茅坛,可以通過滾動更新 pod 的方式來強制重新掛載 ConfigMap音半,也可以在更新了 ConfigMap 后,先將副本數(shù)設(shè)置為 0贡蓖,然后再擴容曹鸠。
Configmap的更新
$ kubectl edit configmap <map-name>
confgimap更新后,如果是以文件夾方式掛載的斥铺,會自動將掛載的Volume更新彻桃。如果是以文件形式掛載的,則不會自動更新晾蜘。
但是對多數(shù)情況的應(yīng)用來說邻眷,配置文件更新后,最簡單的辦法就是重啟Pod(殺掉再重新拉起)笙纤。如果是以文件夾形式掛載的耗溜,可以通過在容器內(nèi)重啟應(yīng)用的方式實現(xiàn)配置文件更新生效。即便是重啟容器內(nèi)的應(yīng)用省容,也要注意configmap的更新和容器內(nèi)掛載文件的更新不是同步的抖拴,可能會有延時,因此一定要確保容器內(nèi)的配置也已經(jīng)更新為最新版本后再重新加載應(yīng)用腥椒。
參考:
https://www.cnblogs.com/LiuQizhong/p/11599467.html
https://www.cnblogs.com/xiangsikai/p/11424321.html
https://www.cnblogs.com/cocowool/p/kubernetes_configmap_secret.html