目录
一、基本介绍
二、创建管理的4种方式
2.1 使用字面值创建
2.2 使用文件创建
2.3 使用目录创建
2.4 编写configmap 的yaml文件
三、使用创建的变量
3.1 通过环境变量的方式直接传递给pod
3.2 通过在pod的命令行下运行的方式
3.3 作为volume的方式挂载到pod内
四、ConfigMap的热更新
一、基本介绍
官网指南:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/
ConfigMap配置管理:
• ConfigMap用于保存配置数据,以键值对形式存储;
• ConfigMap资源提供了向 Pod 注入配置数据的方法;
• 旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
典型的使用场景:
• 填充环境变量的值;
• 设置容器内的命令行参数;
• 填充卷的配置文件。
二、创建管理的4种方式
四种创建方式:
• 使用字面值创建;
• 使用文件创建;
• 使用目录创建;
• 编写configmap的yaml文件创建
2.1 使用字面值创建
##使用键值对的形式创建面变量
[root@server1 configmap]# kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
##查看所存在的环境变量
[root@server1 configmap]# kubectl get cm
##查看指定命名空间的值
[root@server1 configmap]# kubectl get cm -n kube-system
##查看细节
[root@server1 configmap]# kubectl describe cm
##删除
[root@server1 configmap]# kubectl delete configmap my-config
图 1 使用字面值进行创建
2.2 使用文件创建
##通过指定文件创建
[root@server1 configmap]# kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
##查看指定信息
[root@server1 configmap]# kubectl describe cm my-config-2
图 2 使用文件创建
2.3 使用目录创建
##创建测试目录
[root@server1 configmap]# mkdir test
[root@server1 configmap]# cp /etc/resolv.conf ./test/
[root@server1 configmap]# cp /etc/fstab ./test/
##使用文件创建
[root@server1 configmap]# kubectl create configmap my-config-file --from-file=./test/
图 3 使用文件目录创建
2.4 编写configmap 的yaml文件
[root@server1 configmap]# vim cm.yml
[root@server1 configmap]# cat cm.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
[root@server1 configmap]# kubectl apply -f cm.yml
configmap/cm1-config created
[root@server1 configmap]# kubectl get cm
NAME DATA AGE
cm1-config 2 5s
kube-root-ca.crt 1 11m
my-config-2 1 10m
my-config-file 2 5m4s
[root@server1 configmap]# kubectl describe cm cm1-config
图 4 使用Yml文件创建
三、使用创建的变量
三种方式:
• 通过环境变量的方式直接传递给pod;
• 通过在pod的命令行下运行的方式;
• 作为volume的方式挂载到pod内。
3.1 通过环境变量的方式直接传递给pod
##编写配置文件
[root@server1 configmap]# cat cm-env.yml
apiVersion: v1
kind: ConfigMap ##设置cm的环境变量
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
command: ["/bin/sh", "-c", "env"]
env: ##给环境变量命名
- name: key1
valueFrom: ##key1的值来自于cm的cm1-config中key为db_host的
configMapKeyRef:
name: cm1-config
key: db_host
- name: key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never
##应用配置文件
[root@server1 configmap]# kubeclt apply -f cm-env.yml
##查看运行结果
[root@server1 configmap]# kubectl logs pod1
图5 通关替换key进行环境变量的传递
直接继承原来的key,不做改变:
[root@server1 configmap]# cat cm-env-dir.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: busybox
command: ["/bin/sh", "-c", "env"]
envFrom: ##直接指定环境变量的来源
- configMapRef:
name: cm1-config
restartPolicy: Never
图 6 直接继承创建时的环境变量
3.2 通过在pod的命令行下运行的方式
[root@server1 configmap]# vim cm-dir.yml
[root@server1 configmap]# kubectl apply -f cm-dir.yml
configmap/cm1-config unchanged
pod/pod1 created
[root@server1 configmap]# kubectl logs pod1
172.25.0.250 3306
[root@server1 configmap]# cat cm-dir.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"] ##在pod内直接执行
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
图 7 通过命令行方式的结果
3.3 作为volume的方式挂载到pod内
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: busybox
command: ["/bin/sh", "-c", "cat /config/*"]
volumeMounts: ##挂载的位置
- name: config-volume
mountPath: /config
volumes: ##卷的内容
- name: config-volume ##卷的名字
configMap: ## 挂在的内容为cm中关键字为cm1-config 的值
name: cm1-config
restartPolicy: Never
图 8 通过卷挂载的方式的结果
##应用中的使用
[root@server1 configmap]# kubectl apply -f cm-volum.yml
[root@server1 configmap]# kubectl logs pod2
[root@server1 configmap]# vim cm-nginx.yml
[root@server1 configmap]# kubectl apply -f cm-nginx.yml
[root@server1 configmap]# kubectl exec -it pod1 -- bash ##连接应用,查看配置
[root@server1 configmap]# cat cm-nginx.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: nginx
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: cm1-config
图 9 对应用文件的挂载
四、ConfigMap的热更新
##编写服务配置文件
[root@server1 configmap]# cat cm-in.yml
apiVersion: v1
kind: ConfigMap ##编写CM的格式
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts: ##通过挂载的方式,讲CM变量挂到POD内
- name: config-volume
mountPath: /etc/nginx/conf.d
volumes:
- name: config-volume
configMap:
name: nginx-config ##挂载的容器名
##编写CM
[root@server1 configmap]# cat server.conf
server {
listen 8000;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
##以文件的方式讲CM写入
[root@server1 configmap]# kubectl create configmap nginx-config --from-file=server.conf
##查看具体信息
[root@server1 configmap]# kubectl describe cm nginx-config
##启动POD,查看信息
[root@server1 configmap]# kubectl apply -f cm-in.yml
[root@server1 configmap]# kubectl get pod
##查看IP,进行测试
[root@server1 configmap]# kubectl get pod -o wide
[root@server1 configmap]# curl 10.244.1.95
[root@server1 configmap]# curl 10.244.1.95:8000
##查看服务器内配置
[root@server1 configmap]# kubectl exec my-nginx-7db4c4f989-pl6c8 -- cat /etc/nginx/conf.d/server.conf
图 10 查看挂载后的访问结果
图 11 对配置文件内的内容进行查看
##更改内容(这里讲端口改为8080)
[root@server1 configmap]# kubectl edit cm nginx-config
configmap/nginx-config edited
##查看修改后的配置文件
[root@server1 configmap]# kubectl exec my-nginx-6c4c97b5bc-5pxqm -- cat /etc/nginx/conf.d/server.conf
图 12 查看配置文件是否更改
图 13 查看配置是否生效
将没有生效的配置文件及逆行滚动更新
##触发滚动更新
[oot@server1 configmap]# kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20220420"}}}}}'
##查看新的POD
[root@server1 configmap]# kubectl get pod -o wide
##使用新的IP惊醒访问
[root@server1 configmap]# curl 10.244.1.95:8080