K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用
K8S configmap詳解:從文件創(chuàng)建、從文件夾創(chuàng)建及以volume、env環(huán)境變量的方式在pod中使用
ConfigMap是用來(lái)存儲(chǔ)配置文件的kubernetes資源對(duì)象,所有的配置內(nèi)容都存儲(chǔ)在etcd中。
1.創(chuàng)建ConfigMap
創(chuàng)建ConfigMap的方式有4種:
通過(guò)直接在命令行中指定configmap參數(shù)創(chuàng)建,即--from-literal 通過(guò)指定文件創(chuàng)建,即將一個(gè)配置文件創(chuàng)建為一個(gè)ConfigMap--from-file=<文件> 通過(guò)指定目錄創(chuàng)建,即將一個(gè)目錄下的所有配置文件創(chuàng)建為一個(gè)ConfigMap,--from-file=<目錄> 事先寫好標(biāo)準(zhǔn)的configmap的yaml文件,然后kubectl create -f 創(chuàng)建1.1 通過(guò)命令行參數(shù)–from-literal創(chuàng)建
示例
創(chuàng)建命令:
kubectl create configmap test-config1 --from-literal=db.host=10.5.10.116 --from-listeral=db.port='3306'結(jié)果如圖中data內(nèi)容所示:
這里寫圖片描述
1.2 指定文件創(chuàng)建
示例
配置文件app.properties的內(nèi)容:
這里寫圖片描述
創(chuàng)建命令(可以有多個(gè)–from-file):
結(jié)果如圖中data內(nèi)容所示:
這里寫圖片描述
可以看到指定文件創(chuàng)建時(shí)configmap會(huì)創(chuàng)建一個(gè)key/value對(duì),key是文件名,value是文件內(nèi)容。
假如不想configmap中的key為默認(rèn)的文件名,還可以在創(chuàng)建時(shí)指定key名字:
kubectl create configmap game-config-3 --from-file=<my-key-name>=<path-to-file>1.3 指定目錄創(chuàng)建
示例
configs 目錄下的config-1和config-2內(nèi)容如下所示:
這里寫圖片描述
創(chuàng)建命令:
結(jié)果如圖中data內(nèi)容所示:
這里寫圖片描述
可以看到指定目錄創(chuàng)建時(shí)configmap內(nèi)容中的各個(gè)文件會(huì)創(chuàng)建一個(gè)key/value對(duì),key是文件名,value是文件內(nèi)容。
那假如目錄中還包含子目錄呢?繼續(xù)做實(shí)驗(yàn):
在上一步的configs目錄下創(chuàng)建子目錄subconfigs,并在subconfigs下面創(chuàng)建兩個(gè)配置文件,指定目錄configs創(chuàng)建名為test-config4的configmap:
結(jié)果如下圖所示:
這里寫圖片描述
結(jié)果說(shuō)明指定目錄時(shí)只會(huì)識(shí)別其中的文件,忽略子目錄
1.4 通過(guò)事先寫好configmap的標(biāo)準(zhǔn)yaml文件創(chuàng)建
yaml文件如圖所示:
這里寫圖片描述
結(jié)果如圖中data內(nèi)容所示:
這里寫圖片描述
注意其中一個(gè)key的value有多行內(nèi)容時(shí)的寫法
2.使用ConfigMap
使用ConfigMap有三種方式:
第一種是通過(guò)環(huán)境變量的方式,直接傳遞給pod使用configmap中指定的key使用configmap中所有的key 第二種是通過(guò)在pod的命令行下運(yùn)行的方式(啟動(dòng)命令中) 第三種是作為volume的方式掛載到pod內(nèi)2.1 通過(guò)環(huán)境變量使用
示例:
(1)使用valueFrom、configMapKeyRef、name、key指定要用的key:
(2)還可以通過(guò)envFrom、configMapRef、name使得configmap中的所有key/value對(duì)都自動(dòng)變成環(huán)境變量:
apiVersion: v1 kind: Pod metadata:name: dapi-test-pod spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh", "-c", "env" ]envFrom:- configMapRef:name: special-configrestartPolicy: Never2.2 在啟動(dòng)命令中引用
示例:
在命令行下引用時(shí),需要先設(shè)置為環(huán)境變量,之后可以通過(guò)$(VAR_NAME)設(shè)置容器啟動(dòng)命令的啟動(dòng)參數(shù):
2.3 作為volume掛載使用
(1)把1.4中test-config4所有key/value掛載進(jìn)來(lái):
apiVersion: extensions/v1beta1 kind: Deployment metadata:name: nginx-configmap spec:replicas: 1template:metadata:labels:app: nginx-configmapspec:containers:- name: nginx-configmapimage: nginxports:- containerPort: 80volumeMounts: - name: config-volume4mountPath: /tmp/config4volumes:- name: config-volume4configMap:name: test-config4進(jìn)入容器中/tmp/config4查看:
這里寫圖片描述
可以看到,在config4文件夾下以每一個(gè)key為文件名value為值創(chuàng)建了多個(gè)文件。
(2)假如不想以key名作為配置文件名可以引入items 字段,在其中逐個(gè)指定要用相對(duì)路徑path替換的key:
volumes:- name: config-volume4configMap:name: test-config4items:- key: my.cnfpath: mysql-key- key: cache_hostpath: cache-host進(jìn)入容器中看:
這里寫圖片描述
備注:
刪除configmap后原pod不受影響;然后再刪除pod后,重啟的pod的events會(huì)報(bào)找不到cofigmap的volume; pod起來(lái)后再通過(guò)kubectl edit configmap …修改configmap,過(guò)一會(huì)pod內(nèi)部的配置也會(huì)刷新。 在容器內(nèi)部修改掛進(jìn)去的配置文件后,過(guò)一會(huì)內(nèi)容會(huì)再次被刷新為原始configmap內(nèi)容(3)還可以為以configmap掛載進(jìn)的volume添加subPath字段:
volumeMounts:- name: config-volume5mountPath: /tmp/mysubPath: my.cnf- name: config-volume5mountPath: /tmp/hostsubPath: cache_host- name: config-volume5mountPath: /tmp/portsubPath: cache_port- name: config-volume5mountPath: /tmp/prefixsubPath: cache_prefixvolumes:- name: config-volume5configMap:name: test-config4進(jìn)入容器中看:
這里寫圖片描述
注意在容器中的形式與(2)中的不同,(2)中是個(gè)鏈接,鏈到…data/。
備注:
3.configmap的熱更新研究
更新 ConfigMap 后:
使用該 ConfigMap 掛載的 Env 不會(huì)同步更新 使用該 ConfigMap 掛載的 Volume 中的數(shù)據(jù)需要一段時(shí)間(實(shí)測(cè)大概10秒)才能同步更新ENV 是在容器啟動(dòng)的時(shí)候注入的,啟動(dòng)之后 kubernetes 就不會(huì)再改變環(huán)境變量的值,且同一個(gè) namespace 中的 pod 的環(huán)境變量是不斷累加的,參考 Kubernetes中的服務(wù)發(fā)現(xiàn)與docker容器間的環(huán)境變量傳遞源碼探究。為了更新容器中使用 ConfigMap 掛載的配置,可以通過(guò)滾動(dòng)更新 pod 的方式來(lái)強(qiáng)制重新掛載 ConfigMap,也可以在更新了 ConfigMap 后,先將副本數(shù)設(shè)置為 0,然后再擴(kuò)容。
參考
1.https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
2.https://www.cnblogs.com/breezey/p/6582082.html
3.https://kubernetes.io/docs/concepts/storage/volumes/
4.https://www.kubernetes.org.cn/3138.html
5.https://blog.csdn.net/liukuan73/article/details/79492374
總結(jié)
以上是生活随笔為你收集整理的K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows启动minio bat脚本
- 下一篇: helm离线安装helm-push插件