可以通过单个ConfigMap定义环境变量,也通过多个ConfigMap定义环境变量和将ConfigMap作为卷挂载成文件使用等。valueFrom通常用于使用ConfigMap的单个Key设置环境变量,但实际使用时更常用的是把ConfigMap里面所有的数据都作为环境变量,此时可以使用envFrom参数。
一、使用valueFrom定义单个环境变量¶
1.创建工作目录
[root@k8s-master01 ~]# mkdir -p configmap/conf
2.编写配置文件
[root@k8s-master01 ~]# vim configmap/conf/game.conf
lives=3
secret.code=true
3.创建ConfigMap
[root@k8s-master01 conf]# kubectl create cm gameenvcm --from-env-file=/root/configmap/conf/game.conf
4.验证
[root@k8s-master01 conf]# kubectl get cm
NAME DATA AGE
cmfromdir 2 25m
cmfromfile 1 20m
cmspecialname 1 10m
cmspecialname2 2 7m51s
gameenvcm 2 11s
kube-root-ca.crt 1 26h
[root@k8s-master01 conf]# kubectl get cm gameenvcm -oyaml
apiVersion: v1
data:
lives: "3"
secret.code: "true"
kind: ConfigMap
metadata:
creationTimestamp: "2022-12-03T08:39:30Z"
name: gameenvcm
namespace: default
resourceVersion: "36100"
uid: 62346419-855c-48de-8f78-9b17bb5da665
[root@k8s-master01 ~]# kubectl describe cm gameenvcm
Name: gameenvcm
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
lives:
----
3
secret.code:
----
true
BinaryData
====
Events: <none>
5.编写一个deployment的Yaml文件
[root@k8s-master01 conf]# vim dp-cm.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-cm
name: dp-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-cm
template:
metadata:
labels:
app: dp-cm
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
name: nginx
env:
- name: TEST_ENV
value: testenv
- name: LIVES
valueFrom:
configMapKeyRef:
name: gameenvcm
key: lives
上面内容分析
env:
#手动创建
- name: TEST_ENV
value: testenv
#基于valueFrom单个定义环境变量
- name: LIVES
valueFrom:
configMapKeyRef:
name: gameenvcm
key: lives
6.创建一个deployment
[root@k8s-master01 conf]# kubectl create -f dp-cm.yaml
deployment.apps/dp-cm created
注意:创建的deployment要和configMap位于同一命名空间,且名为gameenvcm的configMap要真实存在,否则Pod起不来
7.验证
[root@k8s-master01 conf]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
dp-cm 1/1 1 1 27s
[root@k8s-master01 conf]# kubectl get po
NAME READY STATUS RESTARTS AGE
dp-cm-6d84dc5fcb-vzrfw 1/1 Running 0 82s
8.查看env
[root@k8s-master01 conf]# kubectl exec dp-cm-6d84dc5fcb-vzrfw -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=dp-cm-6d84dc5fcb-vzrfw
NGINX_VERSION=1.14.2
NJS_VERSION=0.5.0
PKG_RELEASE=1~buster
TEST_ENV=testenv
LIVES=3
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
NGINX_PORT=tcp://10.0.239.136:80
NGINX_PORT_80_TCP_PORT=80
KUBERNETES_SERVICE_HOST=10.0.0.1
KUBERNETES_PORT=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
NGINX_SERVICE_HOST=10.0.239.136
NGINX_PORT_80_TCP=tcp://10.0.239.136:80
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
NGINX_SERVICE_PORT=80
NGINX_PORT_80_TCP_PROTO=tcp
NGINX_PORT_80_TCP_ADDR=10.0.239.136
HOME=/root
二、使用envFrom定义多个环境变量¶
1.创建工作目录
[root@k8s-master01 ~]# mkdir -p configmap/conf
2.编写配置文件
[root@k8s-master01 ~]# vim configmap/conf/game.conf
lives=3
secret.code=true
3.创建ConfigMap
[root@k8s-master01 conf]# kubectl create cm gameenvcm --from-env-file=/root/configmap/conf/game.conf
4.验证
[root@k8s-master01 conf]# kubectl get cm
NAME DATA AGE
cmfromdir 2 25m
cmfromfile 1 20m
cmspecialname 1 10m
cmspecialname2 2 7m51s
gameenvcm 2 11s
kube-root-ca.crt 1 26h
[root@k8s-master01 conf]# kubectl get cm gameenvcm -oyaml
apiVersion: v1
data:
lives: "3"
secret.code: "true"
kind: ConfigMap
metadata:
creationTimestamp: "2022-12-03T08:39:30Z"
name: gameenvcm
namespace: default
resourceVersion: "36100"
uid: 62346419-855c-48de-8f78-9b17bb5da665
[root@k8s-master01 ~]# kubectl describe cm gameenvcm
Name: gameenvcm
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
lives:
----
3
secret.code:
----
true
BinaryData
====
Events: <none>
5.编写一个deployment的Yaml文件
[root@k8s-master01 conf]# vim dp-cm.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-cm
name: dp-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-cm
template:
metadata:
labels:
app: dp-cm
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
name: nginx
envFrom:
- configMapRef:
name: gameenvcm
prefix: fromCm_
env:
- name: TEST_ENV
value: testenv
上面内容分析
#使用envFrom定义名为gameenvcm的configmap的全部环境变量并在键前面添加前缀fromCm_
envFrom:
- configMapRef:
name: gameenvcm
prefix: fromCm_
#手动创建
env:
- name: TEST_ENV
value: testenv
6.创建一个deployment
[root@k8s-master01 conf]# kubectl create -f dp-cm.yaml
deployment.apps/dp-cm created
注意:创建的deployment要和configMap位于同一命名空间,且名为gameenvcm的configMap要真实存在,否则Pod起不来
7.验证
[root@k8s-master01 conf]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
dp-cm 1/1 1 1 27s
[root@k8s-master01 conf]# kubectl get po
NAME READY STATUS RESTARTS AGE
dp-cm-6f94dbf6f6-xb2jn 1/1 Running 0 82s
8.查看env
[root@k8s-master01 conf]# kubectl exec dp-cm-6f94dbf6f6-xb2jn -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=dp-cm-6f94dbf6f6-xb2jn
NGINX_VERSION=1.14.2
fromCm_secret.code=true
fromCm_lives=3
TEST_ENV=testenv
KUBERNETES_PORT=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
KUBERNETES_SERVICE_HOST=10.0.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
HOME=/root
注意:使用envFrom时,环境变量的名字是ConfigMap中数据的key名。prefix参数是将ConfigMap中的key添加一个前缀,比如key名是self-key,加了prefix就是fromCm_self-key,prefix为可选参数。另外需要注意,当使用ConfigMap或者Secret定义Pod变量时,如果ConfigMap和Secret内容有变化,而Pod没有重启的话,Pod里面的变量就不会更新。