K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用
K8S configmap詳解:從文件創建、從文件夾創建及以volume、env環境變量的方式在pod中使用
ConfigMap是用來存儲配置文件的kubernetes資源對象,所有的配置內容都存儲在etcd中。
1.創建ConfigMap
創建ConfigMap的方式有4種:
通過直接在命令行中指定configmap參數創建,即--from-literal 通過指定文件創建,即將一個配置文件創建為一個ConfigMap--from-file=<文件> 通過指定目錄創建,即將一個目錄下的所有配置文件創建為一個ConfigMap,--from-file=<目錄> 事先寫好標準的configmap的yaml文件,然后kubectl create -f 創建1.1 通過命令行參數–from-literal創建
示例
創建命令:
kubectl create configmap test-config1 --from-literal=db.host=10.5.10.116 --from-listeral=db.port='3306'結果如圖中data內容所示:
這里寫圖片描述
1.2 指定文件創建
示例
配置文件app.properties的內容:
這里寫圖片描述
創建命令(可以有多個–from-file):
結果如圖中data內容所示:
這里寫圖片描述
可以看到指定文件創建時configmap會創建一個key/value對,key是文件名,value是文件內容。
假如不想configmap中的key為默認的文件名,還可以在創建時指定key名字:
kubectl create configmap game-config-3 --from-file=<my-key-name>=<path-to-file>1.3 指定目錄創建
示例
configs 目錄下的config-1和config-2內容如下所示:
這里寫圖片描述
創建命令:
結果如圖中data內容所示:
這里寫圖片描述
可以看到指定目錄創建時configmap內容中的各個文件會創建一個key/value對,key是文件名,value是文件內容。
那假如目錄中還包含子目錄呢?繼續做實驗:
在上一步的configs目錄下創建子目錄subconfigs,并在subconfigs下面創建兩個配置文件,指定目錄configs創建名為test-config4的configmap:
結果如下圖所示:
這里寫圖片描述
結果說明指定目錄時只會識別其中的文件,忽略子目錄
1.4 通過事先寫好configmap的標準yaml文件創建
yaml文件如圖所示:
這里寫圖片描述
結果如圖中data內容所示:
這里寫圖片描述
注意其中一個key的value有多行內容時的寫法
2.使用ConfigMap
使用ConfigMap有三種方式:
第一種是通過環境變量的方式,直接傳遞給pod使用configmap中指定的key使用configmap中所有的key 第二種是通過在pod的命令行下運行的方式(啟動命令中) 第三種是作為volume的方式掛載到pod內2.1 通過環境變量使用
示例:
(1)使用valueFrom、configMapKeyRef、name、key指定要用的key:
(2)還可以通過envFrom、configMapRef、name使得configmap中的所有key/value對都自動變成環境變量:
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 在啟動命令中引用
示例:
在命令行下引用時,需要先設置為環境變量,之后可以通過$(VAR_NAME)設置容器啟動命令的啟動參數:
2.3 作為volume掛載使用
(1)把1.4中test-config4所有key/value掛載進來:
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進入容器中/tmp/config4查看:
這里寫圖片描述
可以看到,在config4文件夾下以每一個key為文件名value為值創建了多個文件。
(2)假如不想以key名作為配置文件名可以引入items 字段,在其中逐個指定要用相對路徑path替換的key:
volumes:- name: config-volume4configMap:name: test-config4items:- key: my.cnfpath: mysql-key- key: cache_hostpath: cache-host進入容器中看:
這里寫圖片描述
備注:
刪除configmap后原pod不受影響;然后再刪除pod后,重啟的pod的events會報找不到cofigmap的volume; pod起來后再通過kubectl edit configmap …修改configmap,過一會pod內部的配置也會刷新。 在容器內部修改掛進去的配置文件后,過一會內容會再次被刷新為原始configmap內容(3)還可以為以configmap掛載進的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進入容器中看:
這里寫圖片描述
注意在容器中的形式與(2)中的不同,(2)中是個鏈接,鏈到…data/。
備注:
3.configmap的熱更新研究
更新 ConfigMap 后:
使用該 ConfigMap 掛載的 Env 不會同步更新 使用該 ConfigMap 掛載的 Volume 中的數據需要一段時間(實測大概10秒)才能同步更新ENV 是在容器啟動的時候注入的,啟動之后 kubernetes 就不會再改變環境變量的值,且同一個 namespace 中的 pod 的環境變量是不斷累加的,參考 Kubernetes中的服務發現與docker容器間的環境變量傳遞源碼探究。為了更新容器中使用 ConfigMap 掛載的配置,可以通過滾動更新 pod 的方式來強制重新掛載 ConfigMap,也可以在更新了 ConfigMap 后,先將副本數設置為 0,然后再擴容。
參考
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
總結
以上是生活随笔為你收集整理的K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows启动minio bat脚本
- 下一篇: helm离线安装helm-push插件