ConfigMap配置管理
1. 创建ConfigMap
- 使用字面值创建
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
- 使用文件创建
key的名称是文件名称,value的值是这个文件的内容
kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
- 使用目录创建
使用目录创建,目录中的文件名为key,文件内容是value
kubectl create configmap my-config-3 --from-file=test
- yaml文件创建
vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.52.1"
db_port: "3306"
2. 如何使用configmap
- 通过环境变量传递
只进行值传递
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: key1 #变量名为key1
valueFrom:
configMapKeyRef:
name: cm1-config #从cm1-config
key: db_host #取db_host
- name: key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never
直接包含指定CM
此种方式直接包含指定的cm,cm中的kv对直接引入
vim pod2.yaml
- 在pod内通过命令行传递
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod1
image: busybox
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
- 通过数据卷使用CM
vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod4
spec:
containers:
- name: pod2
image: busybox
command: ["/bin/sh", "-c", "cat /config/db_host"]
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: cm1-config
restartPolicy: Never
3. ConfigMap热更新
kubectl edit cm cm1-config
Pod数据并不会实时更新,需要等待几秒
但是cm更新后并不会出发容器的滚动更新,新的配置不会被重新加载。此时需要手动配置更新或者重建一个新的POD
- 手动配置pod滚动更新cm的值
kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20222222"}}}}}'
-
每次通过修改“version/config”来触发Pod滚动更新。
-
使用configmap挂载的env环境变量是不会更新的。
实例
准备nginx配置文件
vim nginx.conf
server {
listen 8000;#指定端口为8000
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
创建nginx的pod挂载此配置文件
vim nginx.yaml
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: myapp:v1
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
volumes:
- name: config-volume
configMap:
name: nginxconf
应用配置文件测试端口
此时编辑cm中端口的值
kubectl edit cm nginxconf
检测热更新
kubectl exec my-nginx-8599966497-c29vk cat /etc/nginx/conf.d/nginx.conf |grep listen
等待一段时间后,修改后的cm被应用到容器中
但时此时仍然无法访问80端口,应用patch指令更新cm
kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20200219"}}}}}'
pod被重建,新的pod 会应用修改后的cm,80端口可以被访问