网站首页 > 精选文章 / 正文
在一般应用部署中,都是将程序和配置信息分离,这样可以保证程序可以被各个环境复用。
在容器场景中,将应用打包成镜像后,可以通过环境变量或者文件挂载的方式,在创建容器时把配置注入进去。
在Kubernetes场景中,则使用configMap实现应用与配置分离。使用configMap的方式有多种,有的方式修改了configMap的配置,无需重启Pod即可生效,有的方式需要重启Pod才生效。看看你用的是哪一种吧。
1、使用方式
使用configMap做程序和配置分离,那么首先就要定义configMap,然后部署configMap。
1.1、定义configMap
apiVersion: v1
kind: ConfigMap
metadata:
name: democm
namespace: demo
data:
db_name: demodb
db_host: 172.19.132.23
configMap有3种使用方式:env方式 、envFrom方式 、volumes方式。
1.2、env方式
这种方式是将configMap的key-value注入到容器的环境变量里,程序里使用时,使用env里定义的name即可获取到对应的值。使用方式如下:
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-1
namespace: demo
labels:
app: pod-cm-1
spec:
containers:
- name: pod-cm-1
image: busybox
imagePullPolicy: IfNotPresent
tty: true
# 会出现在容器的环境变量里,程序里要使用env#name可以获取到对应的值
env:
- name: db_name_app
valueFrom:
configMapKeyRef:
name: democm
key: db_name
- name: db_host_app
valueFrom:
configMapKeyRef:
name: democm
key: db_host
1.3、envFrom方式
这种方式也是将configMap的key-value注入到容器的环境变量里,使用方法与env方式类似,只不过在程序使用时,是直接使用configMap定义的key,即可获取到对应的值。使用方式如下:
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-2
namespace: demo
labels:
app: pod-cm-2
spec:
containers:
- name: pod-cm-2
image: busybox
imagePullPolicy: IfNotPresent
tty: true
# 程序里使用configmap的key
envFrom:
- configMapRef:
name: democm
1.4、volumes方式
这种方式是以卷挂载的方式,将configMap的key-value写入到文件里,key是文件名,value是文件内容。
使用方式如下:
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-3
namespace: demo
labels:
app: pod-cm-3
spec:
nodeName: k8s-worker-2
containers:
- name: pod-cm-3
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 8080
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
volumes:
- name: workdir
configMap:
name: democm
optional: true
观察volume卷下面的内容:
进入到容器的/usr/share/nginx/html目录下,可以看到configMap定义的key-value会出现此目录下,并且会有一个类似时间的文件。进入到文件夹里,可以看到对应的db_host和db_name文件。
如果configMap变化之后,对应的会生成新的文件
2、实践
2.1、编排部署configMap
编排部署configMap,查看部署后的configMap信息
[root@k8s-master configmap]# kubectl apply -f configmap.yaml
configmap/democm created
[root@k8s-master configmap]# kubectl get cm -n demo
NAME DATA AGE
democm 2 11s
[root@k8s-master configmap]# kubectl describe cm democm -n demo
Name: democm
Namespace: demo
Labels: <none>
Annotations: <none>
Data
====
db_host:
----
172.19.132.23
db_name:
----
demodb
Events: <none>
2.2、env方式
从这里可以看到env方式定义的yaml里的env已经被放入到容器的环境变量里的,只不过env里的值是从configMap里取的。
[root@k8s-master configmap]# kubectl exec -it pod-cm-1 -n demo -- /bin/sh
/ #
/ # evn
/bin/sh: evn: not found
/ # env
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod-cm-1
SHLVL=1
HOME=/root
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
db_host_app=172.19.132.23
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
db_name_app=demodb
2.3、envFrom方式
从这里可以看到envFrom方式是直接把configMap的key-value放入到容器的环境变量里的。
[root@k8s-master configmap]# kubectl apply -f pod_configmap_2.yaml
pod/pod-cm-2 created
[root@k8s-master configmap]# kubectl exec -it pod-cm-2 -n demo -- /bin/sh
/ #
/ # env
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=pod-cm-2
SHLVL=1
HOME=/root
db_name=demodb
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
db_host=172.19.132.23
2.4、volumes方式
这种方式可以看到,volumes方式并没有把configMap的值放入到环境变量。
[root@k8s-master configmap]# kubectl apply -f pod_configmap_3.yaml
pod/pod-cm-3 created
[root@k8s-master configmap]# kubectl exec -it pod-cm-3 -n demo -- /bin/sh
# env
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=pod-cm-3
HOME=/root
PKG_RELEASE=1~bookworm
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.25.2
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
NJS_VERSION=0.8.0
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
但是可以看到configMap的key-value被写入到了文件里。
# cd /usr/share/nginx/html
# ls
db_host db_name
# cat db_host
172.19.132.23
# cat db_name
demodb
2.5、修改configMap值
修改configMap值,然后重新部署configMap,继续观察这3种方式。
用命令kubectl exec -it pod-cm-xxxxxx -n demo -- /bin/sh进入到容器后,可以观察到:
- env方式和envFrom方式方式对应的值没有变化,需要重启Pod后才生效。
- volumes方式的值会自动变化。
3、总结
- 本文总结了configMap使用的3种方式:env方式、envFrom方式、volumes方式。
- env方式和envFrom方式方式说白了是往容器里注入了环境变量,在容器启动的时候,就已经注入了,无法修改。每次修改configMap的key-value,需要重启Pod才能生效。
- volumes方式的方式,实际上把configMap的key-value写入到了容器对应的volume卷下,而且每次configMap变更,都会把最新值写入到volume卷下,这样容器每次都能取到最新值。
本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!
原文链接:为啥有的configMap要重启Pod才生效 - 不焦躁的程序员、为啥有的configMap要重启Pod才生效
Tags:yaml map
猜你喜欢
- 2025-05-03 大模型直接搜索图片内容!群晖部署AI相册管理工具 immich(二)
- 2025-05-03 这样构建 K8s 中间件运维平台,运维真的能少遭很多罪……
- 2025-05-03 构建 Kubernetes中间件运维平台:标准化、可视化与全栈运维
- 2025-05-03 flutter集成 百度地图 ^2.0.1版本 | 绕坑必备
- 2025-05-03 涨薪技术|Kubernetes(k8s)之yaml语法大全
- 2025-05-03 步步为营把k8s pvc存储从一个ceph集群迁移到另一个
- 2025-05-03 opsone运维管理平台的独门绝技系列之一
- 2025-05-03 教你 7 步快速构建 GitLab 持续集成环境
- 2025-05-03 Kubernetes中的PV、PVC、Configmap介绍
- 2025-05-03 kubernetes环境手动部署 Prometheus 监控系统安装文档