日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用

發布時間:2025/1/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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):

kubectl create configmap test-config2 --from-file=./app.properties

結果如圖中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內容如下所示:
這里寫圖片描述
創建命令:

kubectl create configmap test-config3 --from-file=./configs

結果如圖中data內容所示:
這里寫圖片描述

可以看到指定目錄創建時configmap內容中的各個文件會創建一個key/value對,key是文件名,value是文件內容。

那假如目錄中還包含子目錄呢?繼續做實驗:
在上一步的configs目錄下創建子目錄subconfigs,并在subconfigs下面創建兩個配置文件,指定目錄configs創建名為test-config4的configmap:

kubectl create configmap test-config4 --from-file=./configs

結果如下圖所示:
這里寫圖片描述
結果說明指定目錄時只會識別其中的文件,忽略子目錄
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:

apiVersion: v1 kind: Pod metadata:name: dapi-test-pod spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh", "-c", "env" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: special.how- name: LOG_LEVELvalueFrom:configMapKeyRef:name: env-configkey: log_levelrestartPolicy: Never

(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: Never

2.2 在啟動命令中引用

示例:
在命令行下引用時,需要先設置為環境變量,之后可以通過$(VAR_NAME)設置容器啟動命令的啟動參數:

apiVersion: v1 kind: Pod metadata:name: dapi-test-pod spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_LEVEL- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_TYPErestartPolicy: Never

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/。
備注:

刪除configmap后原pod不受影響;然后再刪除pod后,重啟的pod的events會報找不到cofigmap的volume。 pod起來后再通過kubectl edit configmap …修改configmap,pod內部的配置也會自動刷新。 在容器內部修改掛進去的配置文件后,內容可以持久保存,除非殺掉再重啟pod才會刷回原始configmap的內容。 subPath必須要與configmap中的key同名。 mountPath如/tmp/prefix: <1>當/tmp/prefix不存在時(備注:此時/tmp/prefix和/tmp/prefix/無異),會自動創建prefix文件并把value寫進去; <2>當/tmp/prefix存在且是個文件時,里面內容會被configmap覆蓋; <3>當/tmp/prefix存在且是文件夾時,無論寫/tmp/prefix還是/tmp/prefix/都會報錯。

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中使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。