第10章 ConfigMap配置管理
1.ConfigMap介绍
1)为什么要用configMap?
将配置文件和POD解耦,为了方便修改配置而不需要重新制作镜像,将配置文件单独的存储在k8s的数据库里,然后相应的Pod只需要挂在并引用即可。
2)congiMap里的配置文件是如何存储的?
键值对
key:value
文件名:配置文件的内容
3)configMap创建方式
第一种:直接在资源配置清单里定义配置内容,如果这个配置文件特别长,就不太好看
第二种:通过命令行创建configmap,配置文件以文件读取的形式存进去
创建一个configmap 名字叫:cni-conf.json 值=/opt/cni-conf.json
4)configMap的配置文件如何传递到POD里
变量传递
数据卷挂载
5)使用configMap的限制条件
1.ConfigMap必须在Pod之前创建,Pod才能引用他
2.ConfigMap受限于命名空间限制,只有处于同一个命名空间中的Pod才可以被引用
2.命令行创建configMap
2.1 创建命令
kubectl create configmap --help
kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=nginx.cookzhang.com
kubectl get cm
kubectl describe cm nginx-config
关键参数:
kubectl create configmap nginx-config \ #创建名为nginx-config的configmap资源类型
--from-literal=nginx_port=80 \ #创建变量,key为nginx_port,value值为80
--from-literal=server_name=nginx.cookzhang.com #创建变量,key为server_name,value值为nginx.cookzhang.com
2.2 POD环境变量形式引用configMap
kubectl explain pod.spec.containers.env.valueFrom.configMapKeyRef
cat >nginx-cm.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-cm
spec:
containers:
- name: nginx-pod
image: nginx:1.14.0
ports:
- name: http
containerPort: 80
env:
- name: NGINX_PORT
valueFrom:
configMapKeyRef:
name: nginx-config
key: nginx_port
- name: SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: server_name
EOF
kubectl create -f nginx-cm.yaml
关键参数:
valueFrom: 引用变量
configMapKeyRef: 引用congfigmap
name: nginx-config 引用的congfigmap名称
key: nginx_port 应用congfigmap里的具体的key
2.3 查看pod是否引入了变量
[root@node1 ~/confimap]# kubectl exec -it nginx-cm /bin/bash
root@nginx-cm:~# echo ${NGINX_PORT}
80
root@nginx-cm:~# echo ${SERVER_NAME}
nginx.cookzhang.com
root@nginx-cm:~# printenv |egrep "NGINX_PORT|SERVER_NAME"
NGINX_PORT=80
SERVER_NAME=nginx.cookzhang.com
注意:
变量传递的形式,修改confMap的配置,POD内并不会生效
因为变量只有在创建POD的时候才会引用生效,POD一旦创建好,环境变量就不变了
3.文件形式创建configMap
3.1 创建配置文件:
cat >www.conf <<EOF
server {
listen 80;
server_name www.cookzy.com;
location / {
root /usr/share/nginx/html/www;
index index.html index.htm;
}
}
EOF
创建configMap资源:
kubectl create configmap nginx-www --from-file=www.conf=./www.conf
查看cm资源
kubectl get cm
kubectl describe cm nginx-www
3.2 编写pod并以存储卷挂载模式引用configMap的配置
cat >nginx-cm-volume.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-cm
spec:
containers:
- name: nginx-pod
image: nginx:1.14.0
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginx-www
mountPath: /etc/nginx/conf.d/
volumes:
- name: nginx-www
configMap:
name: nginx-www
items:
- key: www.conf
path: www.conf
EOF
关键参数:
volumes: #定义存储卷
- name: nginx-www #名称
configMap: #引用configMap资源
name: nginx-www #引用名为nginx-www的configMap资源
items: #引用configMap里的具体的内容
- key: www.conf #引用名为nginx-www的configMap里的key为www.conf的值
path: www.conf #使用key名称作为挂载文件名
3.3 测试效果
1.进到容器内查看文件
kubectl exec -it nginx-cm /bin/bash
cat /etc/nginx/conf.d/www.conf
2.动态修改
configMap
kubectl edit cm nginx-www
3.再次进入容器内观察配置会不会自动更新
注意:
修改configmap之后,Pod的挂载并不会立刻更新,要等一会才行变
ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。
cat /etc/nginx/conf.d/www.conf
nginx -T
4.配置文件内容直接以数据格式直接存储在configMap里
4.1 创建config配置清单:
cat >nginx-configMap.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: default
data:
www.conf: |
server {
listen 80;
server_name www.cookzy.com;
location / {
root /usr/share/nginx/html/www;
index index.html index.htm;
}
}
blog.conf: |
server {
listen 80;
server_name blog.cookzy.com;
location / {
root /usr/share/nginx/html/blog;
index index.html index.htm;
}
}
EOF
4.2 应用并查看清单:
kubectl create -f nginx-configMap.yaml
kubectl get cm
kubectl describe cm nginx-config
4.3 创建POD资源清单并引用configMap
cat >nginx-cm-volume-all.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-cm
spec:
containers:
- name: nginx-pod
image: nginx:1.14.0
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d/
volumes:
- name: nginx-config
configMap:
name: nginx-config
items:
- key: www.conf
path: www.conf
- key: blog.conf
path: blog.conf
EOF
4.4 应用并查看:
kubectl create -f nginx-cm-volume-all.yaml
kubectl get pod
kubectl describe pod nginx-cm
进入容器内并查看:
kubectl exec -it nginx-cm /bin/bash
ls /etc/nginx/conf.d/
cat /etc/nginx/conf.d/www.conf
4.5 测试动态修改configMap会不会生效
kubectl edit cm nginx-config
kubectl exec -it nginx-cm /bin/bash
ls /etc/nginx/conf.d/
cat /etc/nginx/conf.d/www.conf
5.独立挂载存储卷中的某个键值
前面我们已经了解了如何在POD中挂载configmap持久卷,但是目前的挂载方式有个问题,那就是不管你挂载的是configmap里的所有文件还是部分文件,都会将挂载点目录下原有的文件隐藏,也就是说,如果我目前这种挂载形式做不到即保留原有目录下的文件,还能单独将configmap里的某个键值以文件形式挂载进去。
但是不用担心,如果我们想达到以上的需求,可以使用subPath字段来解决这个问题。
spec:
volumes:
- name: tomcat-config
configMap:
name: tomcat-config
containers:
- name: tomcat
image: tomcat-app:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
volumeMounts:
- name: tomcat-config
mountPath: /usr/local/tomcat/conf/server.xml
subPath: server.xml
以上的案例使用了subPath字段,实现的效果是/usr/local/tomcat/conf/目录下其他的配置文件依然会保留,而server.xml文件也会使用configmap里的键值挂载上去。
6.关于configmap更新后POD如何重启的问题
通过实验我们知道,如果更新了configmap,POD里挂载文件也会被更新,但是POD里运行的应用因为已经启动过了,所以即使configmap被更新了,POD里的服务还是没有识别到最新的配置。
这种情况一般分为几种情况:
- POD里的应用不支持热加载,那么这种情况即使configmap被更新了也没用,我们只能删除POD然后重新创建,因为POD创建的时候会去读取configmap
- POD里的应用支持热加载,但是需要向POD里的应用发起重载指令,比如nginx -s reload
- POD里的应用支持监控并自动触发热加载,这样的情况是最好的,我们不需要关心,POD的应用自己就能识别变化的配置并自动重启。
7.configmap一些注意
- 以挂载卷方式引用的configmap必须先于POD被创建,也就是说,这个POD启动时,configmap必须已经创建好了。
- 必须处于同一个命名空间的configmap才能被命名空间引用。
- configmap更新到POD里有一定延迟
- 一个confimap资源里可以有多个键值,这些键值也可以被单独的引用
- configmap只负责挂载配置,并不负责重启POD里的应用
8.
更新: 2024-09-06 09:35:06