今天我们来分享 ConfigMap 资源,分享之前,我们来看看前面我们跑应用程序都是怎么玩的
前面的应用程序中,都是没有写入配置的,顶多用到了卷,用来存储数据
那么在 应用程序中如何传入配置呢?
写一个简单的小案例来模拟一下
大概思路是这样的:
#!/bin/bash
INTER=$1
while :
do
echo "echo info test -- "$INTER
sleep $INTER
done
FROM ubuntu:latest
ADD echo.sh /bin/echo.sh
ENTRYPOINT ["/bin/echo.sh"]
CMD ["2"]
docker build -t xiaomotong888/echoinfotest
docker push xiaomotong888/echoinfotest
apiVersion: v1
kind: Pod
metadata:
name: echoinfo
spec:
containers:
- image: xiaomotong888/echoinfotest
name: echoinfo
通过上述案例,我们可以看出,咱可以通过在 Dockerfile 中 CMD 的方式加入可执行程序的参数,能够达到我们期望的传参效果
那么接下来我们看看 是否可以在 k8s yaml 清单中也使用类似的方式呢?
做法和上述类型,涉及到的相关代码用截图的形式展示
此处的 args 如果参数比较多,我们也可以写成每一行写一个参数的形式:
args:
- xiaozhu
- canshu2
- "100"
使用 yaml 清单中传入我们需要的参数,目前依然能够满足我们的要求
现在我们来使用第三种方式,不使用传参了,咱们在 yaml 清单设定环境变量 INTER,让脚本直接读取环境变量的值即可
#!/bin/bash
while :
do
echo "echo info test -- "$INTER
sleep $INTER
done
FROM ubuntu:latest
ADD echo_env.sh /bin/echo_env.sh
ENTRYPOINT ["/bin/echo_env.sh"]
docker build -t xiaomotong888/echoinfotest-env
docker push xiaomotong888/echoinfotest-env
apiVersion: v1
kind: Pod
metadata:
name: echoinfo-k8s-env
spec:
containers:
- image: xiaomotong888/echoinfotest-env
name: echoinfo-k8s-env
env:
- name: INTER
value: "5"
果然,这三种方式都是 ok 的,朋友们看到这里是不是觉得已经满足自己的需求了?
但是要注意的是,这个可是硬编码,要么是在生成的镜像中写死,要么是在 yaml 清单中写死,那么如果我现在要调整一下我的定时时间,是不是又要重新做一个镜像,或者重新做一个 pod?
那么在 k8s 中,肯定有更好的方式来解决这样的问题,因此 ConfigMap 就开始大展身手了
咱们使用 ConfigMap 的目的是,可以将服务的配置解耦出来,服务部署到哪个环境,直接去修改 ConfigMap 去做适配即可,不需要修改镜像和 pod,更不需要修改咱们服务程序的源码
想想,这样用是不是又高效了一些呢?
ConfigMap 就是一个存放键值对映射的对象,也是 k8s 中的一种资源,这种映射关系,可以是 key 映射一个值,也可以是映射一个文件
有一点需要注意:
乍一看,是不是以为容器中的服务是直接去读取 ConfigMap 的数据的? nonono,
实际上是这样的,画个图来形象的表示一下:
对于 ConfigMap 这个资源 ,容器是无感知的,容器实际上还是读取环境中的 卷 或者 环境变量的方式来获取配置的 , 实际上,容器其实也无需知道 ConfigMap 的存在,单纯一点,挺好
创建一个 ConfigMap 的资源,我们可以用我们熟悉的方式,直接写一个 yaml 清单,然后使用 kubectl create -f xxx.yaml
的方式来创建一个 cm 资源
此处的 cm 是 ConfigMap 的简写
我们也可以使用命令行的方式来创建一个 ConfigMap 来供我们使用,例如我们还是延续上面的例子,我们在 ConfigMap 中加入一个键值的映射关系 INTER=10
kubectl create configmap echo-config --from-literal=INTER=10
此处这里可以看到是使用 kubectl create configmap 来创建 ConfigMap ,我们创建资源的时候,若需要添加多个键值对,我们也可以追加写上:
--from-literal=xxx=xxx --from-literal=xx=xx
然后可以通过如下命令查看一下 cm 的详情
kubectl get cm
kubectl describe cm cm-name
上述的信息我们可以看到,echo-config 资源里面的信息包含了我们的键值对 INTER=10
可以查看一下该 cm 对应的 yaml 资源是怎样的
kubectl describe cm echo-config -o yaml
如果需要加的键值对比较多,那么我们一个一个这么写,也不是办法,太戳了
我们可以使用参数 –from-file 来指定 key 和文件,例如使用下面的指令
kubectl create configmap my-config --from-file=key1=config.json
当然,我们也可以是 –from-file 后面指定一个目录,那么 k8s 会去指定目录下读取文件,按照 k8s 的命令规范读取问题,若没有指定 key ,那么文件名就是 key
画一个图来示意一下
对于一个 ConfigMap 我们可以设定多个文件,多个直接的 key 和 value
我们可以在创建 pod 的 yaml 清单的时候,从指定的 ConfigMap 中读取对应的键值即可,使用的方式可以仿照读取环境变量的方式来用用
echoinfotest_configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: echoinfo-k8s-configmap
spec:
containers:
- image: xiaomotong888/echoinfotest-env
name: echoinfo-k8s-env
env:
- name: INTER
valueFrom:
configMapKeyRef:
name: echo-config
key: INTER
还记的我们的写在 echo-config 里面的 INTER 的值是多少吗?
咱们创建好 pod 之后,查看一下对应 pod 的日志,我们就可以看到,打印的是
echo info test -- 10
echo info test -- 10
echo info test -- 10
很明显,打印的是 10 ,数据是从我们的 ConfigMap 读出来的数据,没毛病,老铁
我们现在在 pod 运行的时候,咱们去修改一下 cm
kubectl edit cm echo-config
若需要让我们的 pod 能够读取到 这个 8 秒的定时时间,我们可以删除掉 pod ,然后再创建一个 pod ,我们也可以使用 RC/RS 的方式 ,通过修改副本数来使 pod 达到重启的目的,后续可以分享重启 pod 的其他方式
今天就到这里,学习所得,若有偏差,还请斧正
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0RK65w1-1689479652770)(https://gitee.com/common_dev/mypic/raw/master/%E6%B5%B7%E6%8A%A5.png)]
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774