如何配置应用程序

今天我们来分享 ConfigMap 资源,分享之前,我们来看看前面我们跑应用程序都是怎么玩的

前面的应用程序中,都是没有写入配置的,顶多用到了卷,用来存储数据

那么在 应用程序中如何传入配置呢?

在 Dockerfile 中使用 ENTRYPOINT 和 CMD 的方式

写一个简单的小案例来模拟一下

image-20220128162418555

大概思路是这样的:

  • 1 简单的写一个脚本 echo.sh,作为 定时 INTER 秒中在页面上输出一串信息,可以传入一个传参数作为具体的定时间
#!/bin/bash

INTER=$1

while :
do
  echo "echo info test  -- "$INTER
  sleep $INTER

done
  • 2 写 Dockerfile ,将 ADD echo.sh ,并且将定时时间传入
FROM ubuntu:latest
ADD echo.sh /bin/echo.sh
ENTRYPOINT ["/bin/echo.sh"]
CMD ["2"]
  • 3 将 Dockerfile build 成 image ,具体 docker hub 的仓库,请使用自己的账号
docker build -t xiaomotong888/echoinfotest
docker push xiaomotong888/echoinfotest
  • 4 写 yaml ,并生成 pod
apiVersion: v1
kind: Pod
metadata:
  name: echoinfo
spec:
  containers:
  - image: xiaomotong888/echoinfotest
    name: echoinfo
  • 5 查看效果

通过上述案例,我们可以看出,咱可以通过在 Dockerfile 中 CMD 的方式加入可执行程序的参数,能够达到我们期望的传参效果

那么接下来我们看看 是否可以在 k8s yaml 清单中也使用类似的方式呢?

使用 k8s 中 yaml 文件中给镜像传入参数

做法和上述类型,涉及到的相关代码用截图的形式展示

  • 将上述清单文件修改一下 ,在 yaml 文件中传入参数,这次修改成 传入 定时 3 秒

此处的 args 如果参数比较多,我们也可以写成每一行写一个参数的形式:

args:
- xiaozhu
- canshu2
- "100"
  • 查看效果

使用 yaml 清单中传入我们需要的参数,目前依然能够满足我们的要求

使用 环境变量的方式

现在我们来使用第三种方式,不使用传参了,咱们在 yaml 清单设定环境变量 INTER,让脚本直接读取环境变量的值即可

  • 1 写一个 echo_env.sh 脚本,读取环境变量
#!/bin/bash

while :
do
  echo "echo info test  -- "$INTER
  sleep $INTER

done
  • 2 写 Dockerfile ,将 ADD echo.sh ,执行
FROM ubuntu:latest
ADD echo_env.sh /bin/echo_env.sh
ENTRYPOINT ["/bin/echo_env.sh"]
  • 3 制作成 镜像
docker build -t xiaomotong888/echoinfotest-env
docker push xiaomotong888/echoinfotest-env
  • 4 写 yaml 清单,设置 环境变量,创建 pod
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?

使用 ConfigMap 的方式

那么在 k8s 中,肯定有更好的方式来解决这样的问题,因此 ConfigMap 就开始大展身手了

咱们使用 ConfigMap 的目的是,可以将服务的配置解耦出来,服务部署到哪个环境,直接去修改 ConfigMap 去做适配即可,不需要修改镜像和 pod,更不需要修改咱们服务程序的源码

想想,这样用是不是又高效了一些呢?

ConfigMap 具体是个啥?

ConfigMap 就是一个存放键值对映射的对象,也是 k8s 中的一种资源,这种映射关系,可以是 key 映射一个值,也可以是映射一个文件

有一点需要注意:

乍一看,是不是以为容器中的服务是直接去读取 ConfigMap 的数据的? nonono

实际上是这样的,画个图来形象的表示一下:

对于 ConfigMap 这个资源 ,容器是无感知的,容器实际上还是读取环境中的 卷 或者 环境变量的方式来获取配置的 , 实际上,容器其实也无需知道 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

那么如何读取 ConfigMap 的数据呢?

我们可以在创建 pod 的 yaml 清单的时候,从指定的 ConfigMap 中读取对应的键值即可,使用的方式可以仿照读取环境变量的方式来用用

  • 写好 yaml 清单,指定 ConfigMap 和 指定对应的 key 值

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

猜你喜欢

转载自blog.csdn.net/m0_37322399/article/details/131748830