跳到主要内容

第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的配置

1725446821908-4cca6246-6c08-4716-b15c-fdafb1a017f2.png

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