K8s 中 ConfigMap 使用介绍
Posted 愿许浪尽天涯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s 中 ConfigMap 使用介绍相关的知识,希望对你有一定的参考价值。
K8s 中 ConfigMap 使用介绍
一、ConfigMap 简介
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。 官方文档:ConfigMap
1.使用 ConfigMap 的限制条件
- ConfigMap 需要在 Pod 启动前创建出来。
- 只有当 ConfigMap 和 Pod 处于同一 NameSpace(命名空间)时,Pod 才可以引用它。
- 当 Pod 对 ConfigMap 进行挂载(VolumeMount)操作时,在容器内部只能挂载为目录,并不能挂载为文件。
- 同时,当挂载已经存在的目录时,且目录内含有其它文件,ConfigMap 会将其覆盖掉。
二、ConfigMap 使用介绍
1.ConfigMap 的创建
1)使用目录创建
kubectl create configmap nginx-html --from-file=/etc/nginx/html
--from-file
:指定在目录下的所有文件都会被用在 ConfigMap 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。
2)使用文件创建
[root@localhost ~]# kubectl create configmap index-html --from-file=/etc/nginx/html/index.html
- 在创建时,可以使用多个
--from-file
命令,如:kubctl create configmap index-html --from-file=1.txt --from-file=2.txt
3)使用字面值创建
kubectl create configmap dashboard --from-literal=dashboard.username=root --from-literal=dashboard.password=123123
- 一般来说使用文件创建的方法用的还是比较多的;因为某些场景下可能需要将配置文件,挂载到容器内部。
- 当然,我们也可以使用数据卷挂载的方式,来实现容器与配置文件的解耦。
2.Pod 中使用 ConfigMap
1)使用 ConfigMap 来替代环境变量
[root@localhost ~]# vim 1.yaml
apiVersion: v1 # API 版本 (使用 kubectl explain ConfigMap(具体类型) 即可查看到对应版本号)
kind: ConfigMap # 类型为 ConfigMap
metadata:
name: cm-01 # ConfigMap 的名称 (绑定时需要用到)
data:
hostname: "河北彭于晏" # Key 和 Value
password: "123123"
---
apiVersion: v1
kind: Pod
metadata:
name: zhangsan
spec:
containers:
- name: zhangsan
image: busybox
command: # 执行的命令 (下面的命令是查看系统的变量)
- /bin/sh
- -c
- env
env: # 配置环境变量
- name: HostName # 变量名
valueFrom:
configMapKeyRef:
name: cm-01 # ConfigMap 名称 (要和上面对应)
key: hostname # ConfigMap 里边的 Key (要和上面对应)
- name: Password
valueFrom:
configMapKeyRef:
name: cm-01
key: password
restartPolicy: Never # 当容器退出后. 不会进行重启操作
[root@localhost ~]# kubectl create -f 1.yaml
[root@localhost ~]# kubectl get | grep zhangsan
[root@localhost ~]# kubectl logs zhangsan | egrep 'HostName|Password'
2)使用 ConfigMap 配置命令行参数
[root@localhost ~]# vim 2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-01
data:
hostname: "河北彭于晏"
password: "123123"
---
apiVersion: v1
kind: Pod
metadata:
name: zhangsan
spec:
containers:
- name: zhangsan
image: busybox
command:
- /bin/sh
- -c
- echo $(hostname) $(password)
envFrom: # 1.6 版本后新增字段
- configMapRef:
name: cm-01
restartPolicy: Never
[root@localhost ~]# kubectl create -f 2.yaml # 启动前需要先将 1.yaml 文件 delete (因为 Pod 名称一样)
[root@localhost ~]# kubectl get | grep zhangsan
[root@localhost ~]# kubectl logs zhangsan
- 在 K8s 1.6 版本后引入新字段
envFrom
,可以实现 ConfigMap 中所有的key:value
自动生成为环境变量。 env
和envFrom
的区别:前者是可以自定义变量名,但需要重复性操作;后者是不能自定义变量名,但是很便捷。configMapKeyRef
和configMapRef
的区别:前者是需要指定key
和configmap
,后者是只需要指定configMap
即可。
3)通过数据卷插件使用 ConfigMap
[root@localhost ~]# kubectl create configmap nginx-html --from-file=/etc/nginx/html/
[root@localhost ~]# vim nginx-html.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: html # 挂载数据卷 (要跟下面的 name 名字相同)
mountPath: /var/www/html # 容器内的挂载路径
volumes:
- name: html # 创建一个数据卷
configMap: # ConfigMap 方式
name: nginx-html # 要跟创建的 ConfigMap 相同 (绑定关系)
[root@localhost ~]# kubectl create -f nginx-html.yaml
[root@localhost ~]# kubectl get pod | grep nginx
[root@localhost ~]# kubectl exec -it nginx -- /bin/bash
这里出现了个问题:当我们对 ConfigMap
修改时,挂载到容器内的配置会不会一同修改呢。
请看下面操作:
[root@localhost ~]# kubectl edit configmap nginx-html
[root@localhost ~]# kubectl describe configmap nginx-html | grep -C 8 Data
- 这也就是所谓热更新。可以看到 ConfigMap 的功能还是很不错的。
还有一个点就是,如果我们修改 ConfigMap
对应的配置文件,容器内的配置还会更新吗。
其实是不会的,请看下面的结构:
index.html --> ConfigMap --> Container # 所以修改 index.html 文件并不会使 Container 实现热更新
4)SubPath 作用
- 同一个 Pod 中多个容器挂载同一个卷时提供隔离。
- 将
ConfigMap
和Secret
作为文件挂载到容器中而不覆盖挂载目录下的文件。
[root@localhost ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: zhangsan
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: sub-volume
mountPath: /zhangsan
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
volumeMounts:
- name: sub-volume
mountPath: /zhangsan
volumes:
- name: sub-volume
hostPath: # 数据卷的类型为:挂载到宿主机指定目录
path: /zhangsan
[root@localhost ~]# kubectl create -f nginx.yaml
[root@localhost ~]# kubectl get pod | grep zhangsan
[root@localhost ~]# kubectl exec -it zhangsan -c nginx -- /bin/bash # 当 Pod 内有多个容器时. 需要使用 -c 指定容器
当我们想要实现在同一数据卷,但数据相互隔离的操作时,就需要用到 subpath
[root@localhost ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: zhangsan
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: sub-volume
mountPath: /zhangsan
subPath: nginx # 这里的名字会在挂载目录下创建一个相同名字的目录
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
volumeMounts:
- name: sub-volume
mountPath: /zhangsan
subPath: tomcat # 这里的名字会在挂载目录下创建一个相同名字的目录
volumes:
- name: sub-volume
hostPath:
path: /zhangsan
[root@localhost ~]# kubectl create -f nginx.yaml
[root@localhost ~]# kubectl get pod | grep zhangsan
[root@localhost ~]# kubectl exec -it zhangsan -c nginx -- /bin/bash
以上是关于K8s 中 ConfigMap 使用介绍的主要内容,如果未能解决你的问题,请参考以下文章