這里寫目錄標題
- 什么是 ConfigMap
- 創建 ConfigMap
- 基于目錄創建 ConfigMap
- 創建 conf 目錄,里面放置兩個文件
- 基于目錄下的所有文件創建 ConfigMap
- 查看當前創建的 ConfigMap
- 基于文件創建 ConfigMap
- 創建測試文件 game-cfg
- 基于單個文件創建 ConfigMap
- 查看當前創建的 ConfigMap
- 使用帶有 key 的命令創建 ConfigMap
- 查看當前創建的 ConfigMap
- 多次使用使用 --from-file 傳入參數,用以從多個文件創建 ConfigMap
- 查看當前創建的 ConfigMap
- 基于 ENV 文件創建 ConfigMap
- 創建測試用的 key-value 文件
- 創建 ConfigMap
- 查看當前創建的 ConfigMap
- 基于字符值創建 ConfigMap
- 利用字符值創建 ConfigMap
- 刪除已創建的 ConfigMap
- ConfigMap 實踐
- 使用 valueFrom 定義容器的環境變量
- 先以字符值的形式創建 ConfigMap
- 查看當前創建的 ConfigMap
- 使用 valueFrom 從 ConfigMap 中定義變量
- 創建 pod
- 查看 pod 日志
- 使用 envFrom 定義容器的環境變量
- 使用 envFrom 從 ConfigMap 由定義變量
- 創建 Pod
- 查看 Pod 日志
- 以文件的形式掛載 Configmap
- 創建測試文件
- 使用帶有 key 的命令創建 ConfigMap
- 查看 ConfigMap
- 編寫文件,將名為 spec-config 的 configMap 掛載到容器的/etc/config 目錄下
- 創建 Pod
- 查看創建結果
- 登錄容器,查看掛載情況
- 刪除 Pod
- 自定義文件名掛載 ConfigMap
- 編寫 Pod 文件
- 登錄容器,查看掛載情況
- 指定掛載的文件權限
- 編寫 Pod 文件,指定文件權限
- 登錄容器,查看掛載情況
- 利用 SubPath 解決掛載覆蓋的問題
- 創建測試用的配置文件
- 使用帶有 key 的命令創建 configMap
- 查看 configMap
- 創建 Pod 文件,掛載文件
什么是 ConfigMap
在傳統架構中,配置文件往往被保存在宿主機上,程序啟動是可以指定某個配置文件,但是使用容器部署時,容器所在的節點并不固定,所以不能使用這種方式,此處在構建鏡像時,如果把配置文件也放在容器里面,那么配置文件一旦有更改的話,也是一件非常麻煩的事情。所以k8s 抽象了一個 configMap的概念,將配置與 pod 和組件分開,這有助于保持工作負載的可移植性,使配置更易于更改和管理。比如在生產環境中,可以將 Nginx、Redis 等應用的配置文件存儲在 ConfigMap 上,然后將其掛載即可使用
相對于 secret,configMap 更傾向于存儲和共享非敏感、未加密的配置信息,假如是集群中使用敏感信息,最好使用 secret
- ConfigMap 用來在鍵值對數據庫(etcd)中保存非加密數據。一般用來保存配置文件
- ConfigMap 可以用作環境變量、命令行參數或者存儲卷
- ConfigMap 將環境配置信息與 容器鏡像 解耦,便于配置的修改
- ConfigMap 在設計上不是用來保存大量數據的
- ConfigMap 中保存的數據不可超過 1 MiB
創建 ConfigMap
ConfigMap 可以用目錄(目錄下有多個文件)、單個文件或字符值的方式創建,使用 kubectl 創建一個 ConfigMap 的命令格式如下:
kubectl create configmap < map-name >< data-source >
命令字 | 含義 |
---|---|
map-name | configMap 的名稱 |
data-source | 數據源,可以使數據的目錄、文件或字符值 |
key | 文件名或秘鑰 |
value | 文件內容或字符值 |
基于目錄創建 ConfigMap
創建 conf 目錄,里面放置兩個文件
[root@k8s-master ~]# mkdir /conf
[root@k8s-master ~]# echo "This is file01" > /conf/file01.conf
[root@k8s-master ~]# echo "This is file02" > /conf/file02.conf
基于目錄下的所有文件創建 ConfigMap
[root@k8s-master ~]# ku create configmap game-config-1 --from-file=/conf/
注意:
ConfigMap 是按namespace 隔離的,不同的namespace 之間的configMap 的名稱可以相同,但是不能跨namespace 進行訪問,創建ConfigMap 時,可以使用-n 選項指定資源所在的namespace
查看當前創建的 ConfigMap
[root@k8s-master ~]# ku get cm game-config-1 -oyaml
注意:
由于該 ConfigMap 是直接基于目錄創建的,沒有指定 ConfigMap 中的 key 名,因此默認是按照目錄下的文件名作為 configMap 數據中的 key 名
基于文件創建 ConfigMap
創建測試文件 game-cfg
[root@k8s-master ~]# echo "This is game-cfg file" > /conf/game.cfg
基于單個文件創建 ConfigMap
[root@k8s-master ~]# ku create cm game-config-2 --from-file=/conf/game.cfg
查看當前創建的 ConfigMap
[root@k8s-master ~]# ku get cm game-config-2 -o yaml
注意:
由于沒有指定 ConfigMap 的 key,因此使用文件名作為 key
使用帶有 key 的命令創建 ConfigMap
[root@k8s-master ~]# ku create cm game-config-3 --from-file=self-key=/conf/game.cfg
查看當前創建的 ConfigMap
[root@k8s-master ~]# ku get cm game-config-3 -o yaml
多次使用使用 --from-file 傳入參數,用以從多個文件創建 ConfigMap
[root@k8s-master ~]# ku create cm game-config-4 --from-file=self01-key=/conf/file01.conf --from-file=self02-key=/conf/file02.conf
查看當前創建的 ConfigMap
[root@k8s-master ~]# ku get cm game-config-4 -o yaml
基于 ENV 文件創建 ConfigMap
假如有一個文件 game-env-file.cfg,里面存儲的 key=value 形式的數據,此類文件可以當做某個應用的環境變量配置,此時可以使用–from-env-file 從 ENV 文件創建 configMap
創建測試用的 key-value 文件
[root@k8s-master ~]# vim /conf/game.env-file.cfg
name01=zhangsan
name02=lisi
name03=wangwu
創建 ConfigMap
[root@k8s-master ~]# ku create cm game-config-env-file --from-env-file=/conf/game.env-file.cfg
查看當前創建的 ConfigMap
[root@k8s-master ~]# ku get cm game-config-env-file -o yaml
基于字符值創建 ConfigMap
有時候配置的并不是很多,只有幾個 key=value 的參數,可以直接使用 kubectl create configmap--from-lietal
參數來定義命令行的字符值
備注:
lietal:文字的;逐字的
利用字符值創建 ConfigMap
[root@k8s-master ~]# ku create configmap spec-config-1 --from-literal=spec.user01=zhangsan --from-literal=spec.user02=lisi
刪除已創建的 ConfigMap
[root@k8s-master ~]# ku delete configmap sepc-config-1
ConfigMap 實踐
在 kubernetes 中,用戶可以使用環境變量引用 configMap 中的數據,當容器啟動時,kubernetes會將 ConfigMap 數據作為環境變量注入到容器的進程中。為了使用 ConfigMap 中的數據,用戶需要在 pod的規范(spec)中定義一個env 字段,并指定 ConfigMap 中的“鍵值對
使用 valueFrom 定義容器的環境變量
大部分情況下,ConfigMap 定義的都是配置文件,而不是環境變量,因此需要將 ConfigMap 的文件掛載到 Pod 中,然后 Pod 中的容器就可以引用,此時可以通過 Pod 的 volume 字段進行掛載
先以字符值的形式創建 ConfigMap
[root@k8s-master ~]# ku create configmap spec-config-2 --from-literal=name01=zhangsan --from-literal=name02=lisi
查看當前創建的 ConfigMap
[root@k8s-master ~]# ku get cm spec-config-2 -o yaml
使用 valueFrom 從 ConfigMap 中定義變量
[root@k8s-master ~]# vim env-valuefrom.yamlapiVersion: v1
kind: Pod
metadata:name: env-valuefrom
spec:containers:- name: env-valuefromimage: busybox:v1command: [ "/bin/sh","-c","env" ]env:- name: my-name01valueFrom:configMapKeyRef:key: name01name: spec-config-2- name: my-name02valueFrom:configMapKeyRef:key: name02name: spec-config-2restartPolicy: Never
創建 pod
[root@k8s-master ~]# ku create -f env-valuefrom.yaml
查看 pod 日志
[root@k8s-master ~]# ku logs env-valuefrom
使用 envFrom 定義容器的環境變量
k8s 從 1.6 的版本開始,引入了一個新的字段 envFrom,實現了在 Pod 中將 configMap 中所有定義的key=value 自動生成為環境變量
使用 envFrom 時,環境變量的名字是 ConfigMap 中數據的 key 名
備注:valueFrom和envfrom的區別
- 通過 valueFrom 來配置環境變量,Pod 的環境變量名與 configMap 中定義的變量名不必相同valueFrom 是指定變量進行映射
- 通過 envFrom 會把 ConfigMap 的所有鍵值對都映射到 Pod 的環境變量中去envFrom 配置的環境變量和 Pod 的環境變量名是相同的
使用 envFrom 從 ConfigMap 由定義變量
[root@k8s-master ~]# vim env-envfrom.yamlapiVersion: v1
kind: Pod
metadata:name: env-envfrom
spec:containers:- name: env-envfromimage: busybox:v1command: [ "/bin/sh","-c","env" ]envFrom:- configMapRef:name: spec-config-2restartPolicy: Never
[root@k8s-master ~]# ku describe cm spec-config
創建 Pod
[root@k8s-master ~]# ku create -f env-envfrom.yaml
查看 Pod 日志
[root@k8s-master ~]# ku logs env-envfrom
以文件的形式掛載 Configmap
大部分情況下,ConfigMap 定義的都是配置文件,而不是環境變量,因此需要將 ConfigMap 的文件掛載到 Pod 中,然后 Pod 中的容器就可以引用,此時可以通過 Pod 的 volume 字段進行掛載
創建測試文件
[root@k8s-master ~]# mkdir /etc/conf
[root@k8s-master ~]# echo "This is game-cfg file" > /etc/conf/game.cfg
[root@k8s-master ~]# echo "This is info-cfg file" > /etc/conf/info.cfg
使用帶有 key 的命令創建 ConfigMap
[root@k8s-master ~]# ku create cm spec-config02 --from-file=app01.conf=/etc/conf/game.cfg --from-file=app02.conf=/etc/conf/info.cfg
查看 ConfigMap
[root@k8s-master ~]# ku get cm spec-config02 -o yaml
編寫文件,將名為 spec-config 的 configMap 掛載到容器的/etc/config 目錄下
[root@k8s-master ~]# vim dapi-test1-pod.yaml apiVersion: v1
kind: Pod
metadata:name: dapi-test1-pod
spec:containers:- name: dapi-test1-podimage: nginx:1.7.9ports:- containerPort: 80volumeMounts:- name: config-volumemountPath: /etc/confvolumes:- name: config-volumeconfigMap:name: spec-config02items:
創建 Pod
[root@k8s-master ~]# ku create -f dapi-test1-pod.yaml
注意:
容器的/etc/config 目錄會被覆蓋掉
查看創建結果
[root@k8s-master ~]# ku get pods
登錄容器,查看掛載情況
[root@k8s-master ~]# ku exec -it dapi-test1-pod -- bash
root@dapi-test1-pod:/# ls /etc/conf/
root@dapi-test1-pod:/# ls -l /etc/conf/
刪除 Pod
[root@k8s-master ~]# ku delete -f dapi-test1-pod.yaml
自定義文件名掛載 ConfigMap
很多情況下,需要更改掛載的文件名,可以使用 path 字段指定 ConfigMap 掛載的文件名,比如將文件 app2.conf 掛載到/etc/conf 下,并重命名為 app2.cfg
編寫 Pod 文件
[root@k8s-master ~]# vim dapi-test2-pod.yamlkind: Pod
metadata:name: dapi-test2-pod
spec:containers:- name: dapi-test2-podimage: nginx:1.7.9ports:- containerPort: 80volumeMounts:- name: config-volumemountPath: /etc/confvolumes:- name: config-volumeconfigMap:name: spec-config02items:- key: app01.confpath: app01.cfg- key: app02.confpath: app02.cfg
登錄容器,查看掛載情況
[root@k8s-master ~]# ku exec -it dapi-test2-pod -- bash
root@dapi-test2-pod:/# ls -l /etc/conf/
指定掛載的文件權限
編寫 Pod 文件,指定文件權限
[root@k8s-master ~]# vim dapi-test3-pod.yamlapiVersion: v1
kind: Pod
metadata:
apiVersion: v1
kind: Pod
metadata:name: dapi-test3-pod
spec:containers:- name: dapi-test3-podimage: nginx:1.7.9ports:- containerPort: 80volumeMounts:- name: config-volumemountPath: /etc/confvolumes:- name: config-volumeconfigMap:name: spec-config02items:- key: app01.confpath: app01.cfgmode: 0644- key: app02.confpath: app02.cfgdefaultMode: 0666
登錄容器,查看掛載情況
[root@k8s-master ~]# ku exec -it dapi-test3-pod -- bash
root@dapi-test3-pod:/# ls -l /etc/conf/
root@dapi-test3-pod:/# ls -l /etc/conf/..data/
利用 SubPath 解決掛載覆蓋的問題
當掛載 ConfigMap 或 Secret 到容器內部時,會覆蓋容器中的目錄,也就是是說,在容器中的對應的錄中,就只剩下我們掛載進去的文件,此目錄中其他的文件都會丟失。從而導致容器無法正常運行。為解決掛載覆蓋的問題,需要使用 SubPath 的方式進行掛載
創建測試用的配置文件
[root@k8s-master ~]# mkdir /etc/conf
[root@k8s-master ~]# vim /etc/conf/nginx.conf
user nginx;
#This is my ngin-config
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {worker_connections 1024;
}
http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main ' - [] "" '' "" ''"" ""';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;
}
使用帶有 key 的命令創建 configMap
[root@k8s-master ~]# ku create cm nginx-config --from-file=nginx.conf=/etc/conf/nginx.conf
查看 configMap
[root@k8s-master ~]# ku get cm nginx-config -o yaml
創建 Pod 文件,掛載文件
[root@k8s-master ~]# vim dapi-test4-pod.yamlapiVersion: v1
kind: Pod
metadata:name: dapi-test4-pod
spec:containers:- name: dapi-test4-podimage: nginx:1.7.9ports:- containerPort: 80volumeMounts:- name: nginx-configmountPath: /etc/nginx/nginx.confsubPath: nginx.confvolumes:- name: nginx-configconfigMap:name: nginx-configitems:- key: nginx.confpath: nginx.conf