文章目录
configmap是什么
- configmap用于保存配置数据,以键值对形式存储。
- configmap资源提供了向 Pod 注入配置数据的方法
- 旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
- 典型的使用场景:
填充环境变量的值
设置容器内的命令行参数
填充卷的配置文件
如何创建configmap
创建ConfigMap的方式有4种:
- 使用字面值创建
- 使用文件创建
- 使用目录创建
- 编写configmap的yaml文件创建
使用字面值创建
1.kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
2.kubectl get cm my-config -o yaml
3.kubectl describe cm my-config
字面值创建
使用文件创建
1.kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
2.kubectl get cm my-config-2 -o yaml
3.kubectl describe cm my-config-2
key是文件名称,value是文件内容。
使用目录创建
1.创建目录
mkdir congfigmap
cd congfigmap
mkdir test
cd test
2.拷贝文件
cp /etc/passwd .
cp /etc/hosts .
3.开始创建
cd ..
kubectl create configmap my-config-3 --from-file=test
4.查看
kubectl get cm my-config-3
kubectl get cm my-config-3 -o yaml
编写configmap的yaml文件创建
1.编写文件
vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "192.168.1.250"
db_port: "3306"
2.运行文件
kubectl apply -f cm1.yaml
3.查看
kubectl describe cm cm1-config
如何使用configmap
- 通过环境变量的方式直接传递给pod
- 通过在pod的命令行下运行的方式
- 作为volume的方式挂载到pod内
使用configmap设置环境变量
1.编写文件
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: key1
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_host
- name: key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never
2.运行文件
kubectl apply -f pod1.yaml
3.查看pod运行是否正常以及日志是否有cm1-config信息
kubectl get pod
kubectl logs pod1
使用conigmap设置命令行参数
1.编写文件
vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: busybox
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
2.运行文件
kubectl apply -f pod2.yaml
3.查看pod运行是否正常以及日志信息
kubectl get pod
kubectl logs pod2
通过数据卷使用configmap
1.编写文件
vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
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
2.运行文件
kubectl apply -f pod2.yaml
3.查看pod运行是否正常以及日志信息
kubectl get pod
kubectl logs pod2
configmap热更新
1.编写文件
vim pod3.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: nginx
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /usr/share/nginx/html
volumes:
- name: config-volume
configMap:
name: cm2-config
2.编写测试文件
vim index.html
3.创建cm
kubectl create configmap cm2-config --from-file=index.html
4.查看cm
kubectl get cm
kubectl describe cm cm2-config
5.运行文件
kubectl apply -f pod3.yaml
6.查看pod
kubectl get pod
kubectl get pod -o wide
7.测试
curl 10.244.141.203
更新一下,更改index.html
8.kubectl edit cm cm2-config
9.curl 10.244.141.203
更新稍微有点延迟
10. vim nginx.conf
11.kubectl create configmap cm2-config --from-file=nginx.conf
12.查看cm
kubectl get cm
13.vim pod3.yaml
14.kubectl apply -f pod3.yaml
15.查看pod
kubectl get pod
kubectl get pod -o wide
16.curl 10.244.141.207:8000
17.进入容器
kubectl exec podname -- ls /etc/nginx/conf.d
kubectl exec podname -- cat /etc/nginx/conf.d/nginx.conf
如果更改的是配置文件呢?我们还需要reload操作
更新可以通过两种方式(1)patch命令(2)删除原有的pod
方法一:patch命令
1.修改文件端口号
kubectl edit cm nginx-config
2.发现还是可以访问8000端口
curl 10.244.141.207:8000
3.打补丁
kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210915"}}}}}'
4.更新成功,无法访问8000端口,但是可以访问新ip+8080端口
curl 10.244.141.207:8000
curl 10.244.141.208:8080
方法二:删除原有的pod(适用于有控制器的pod)这里就不演示了
1.kubectl edit cm nginx-config
2.查看pod
kubectl get pod
kubectl get pod -o wide
3.删除pod
kubectl delete pod my-nginx-xxxxxxx-xxxxx
4.重新访问
curl 10.244.141.xxx:8000
curl 10.244.141.xxx:8080
发现依然可以访问8000,并没有更新成功。
patch会将原有pod删除
滚动更新后其ip也会变,访问新的ip和端口,成功!