目录
Configmap介绍
什么是configmap
k8s中的存储类型一般分为Configmap、Secret和Volumes。这一节先讲configmap。
Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;
Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内
部指定目录上;容器中应用程序按照原有方式读取容器特定目录上的配置文件。
应用场景
使用 k8s 部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,
configmap 可以将配置信息和 docker 镜像解耦,以便实现镜像的可移植性和可复用
性
使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配
置的话,那么更新配置就很麻烦,使用 configmap 可以友好的进行配置共享。
局限性
ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1
MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数
据库或者文件服务。
Configmap的创建
字面值创建
直接用命令行产生
创建一个configmap,名字叫my-config,其中的值是直接用命令定义的,key1的值是config1,key2的值是config2。
[root@k8s2 configmap]# kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
查看,产生了新的cm
[root@k8s2 configmap]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 5d23h
my-config 2 4s
键值已写进去
[root@k8s2 configmap]# kubectl describe cm my-config
Name: my-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
key2:
----
config2
key1:
----
config1
通过文件创建
通过指定文件创建一个 configmap,–from-file=<文件>
创建my-config-2,文件的名字就是key的名称,文件的内容就是值value
[root@k8s2 configmap]# kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
通过目录创建
创建一个test目录,复制两个文件进去, kubectl create configmap my-config-3 --from-file=test
创建my-config-3,目录中的文件名为key,文件内容是value
[root@k8s2 configmap]# mkdir test
[root@k8s2 configmap]# cp /etc/passwd test/
[root@k8s2 configmap]# cp /etc/fstab test/
[root@k8s2 configmap]# ls test/
fstab passwd
[root@k8s2 configmap]# kubectl create configmap my-config-3 --from-file=test
通过yaml文件创建
[root@k8s2 configmap]# vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
[root@k8s2 configmap]# kubectl apply -f cm1.yaml
Configmap的使用
主要有三种
下面依次进行实验
使用configmap设置环境变量
通过环境变量引入:使用 configMapKeyRef
[root@k8s2 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 #把cm1-config中的db_host这个key改名为key1
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_host
- name: key2 #把cm1-config中的db_port这个key改名为key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never
运行
[root@k8s2 configmap]# kubectl apply -f pod1.yaml
创建pod后查看日志,key1和key2已写入
[root@k8s2 configmap]# kubectl delete pod pod1
另外一种,编辑pod2.yaml文件
[root@k8s2 configmap]# vim pod2.yaml
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
[root@k8s2 configmap]# kubectl apply -f pod2.yaml
创建pod1,查看日志,key和value都过来了,并且是原来的名字
[root@k8s2 configmap]# kubectl delete pod pod2
使用conigmap设置命令行参数
编辑pod3.yaml文件
[root@k8s2 configmap]# vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: busybox
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"] #输出host和port
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
运行
[root@k8s2 configmap]# kubectl apply -f pod3.yaml
查看pod3日志,两个值都有
[root@k8s2 configmap]# kubectl logs pod3
172.25.0.250 3306
删除实验
[root@k8s2 configmap]# kubectl delete pod pod3
通过数据卷使用configmap
把 configmap 做成 volume,挂载到 pod
[root@k8s2 configmap]# vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod4
spec:
containers:
- name: pod4
image: busybox
command: ["/bin/sh", "-c", "cat /config/db_host"] #查看/config/db_host
volumeMounts:
- name: config-volume
mountPath: /config #把cm1-config的数据挂载到pod4的/config
volumes:
- name: config-volume
configMap:
name: cm1-config
restartPolicy: Never
创建pod4,查看日志
[root@k8s2 configmap]# kubectl apply -f pod4.yaml
[root@k8s2 configmap]# kubectl logs pod4
172.25.0.250
删除
[root@k8s2 configmap]# kubectl delete pod pod4
configmap热更新
编写nginx.conf文件
[root@k8s2 configmap]# vim nginx.conf
server {
listen 8000;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
创建nginx.conf
[root@k8s2 configmap]# kubectl create configmap nginxconf --from-file=nginx.conf
编辑nginx.yaml文件
[root@k8s2 configmap]# vim my-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: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
volumes:
- name: config-volume
configMap:
name: nginxconf
创建
[root@k8s2 configmap]# kubectl apply -f my-nginx.yaml
查看创建成功
[root@k8s2 configmap]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-85fb986977-4bpwb 1/1 Running 0 3s
进入容器,此时端口号为80
[root@k8s2 configmap]# kubectl exec my-nginx-85fb986977-4bpwb -- cat /etc/nginx/conf.d/nginx.conf
server {
listen 8000;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
编辑cm,修改端口
[root@k8s2 configmap]# kubectl edit cm nginxconf
修改cm后,过上几秒配置信息会同步到容器,但是容器内运行的服务并不会加载生效,且只有选择volume方式可以热更新,需要手动刷新
方式一:
[root@k8s2 configmap]# kubectl delete pod my-nginx-85fb986977-4bpwb
方式二:
[root@k8s2 configmap]# kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20230115"}}}}}'