K8s 中 ConfigMap 使用介绍

  • 在创建时,可以使用多个 --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 自动生成为环境变量。

  • envenvFrom 的区别:前者是可以自定义变量名,但需要重复性操作;后者是不能自定义变量名,但是很便捷。

  • configMapKeyRefconfigMapRef 的区别:前者是需要指定 keyconfigmap,后者是只需要指定 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 中多个容器挂载同一个卷时提供隔离。

  • ConfigMapSecret 作为文件挂载到容器中而不覆盖挂载目录下的文件。

[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值