【k8s 系列】k8s 学习二十三,ConfigMap 如何配置应用程序

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 今天我们来分享 ConfigMap 资源,分享之前,我们来看看前面我们跑应用程序都是怎么玩的前面的应用程序中,都是没有写入配置的,顶多用到了卷,用来存储数据

【k8s 系列】k8s 学习二十三,如何配置应用程序

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

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

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

在 Dockerfile 中使用 ENTRYPOINT 和 CMD 的方式

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

image.png

大概思路是这样的:

  • 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/echoinfotest4 写 yaml ,并生成 pod

apiVersion: v1
kind: Pod
metadata:
  name: echoinfo
spec:
  containers:
  - image: xiaomotong888/echoinfotest
    name: echoinfo
  • 5 查看效果

image.png

image.png

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

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

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

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

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

image.png

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

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

image.png

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

使用 环境变量的方式

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

image.png

  • 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"]
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"
  • 查看效果

image.png

image.png

果然,这三种方式都是 ok 的,朋友们看到这里是不是觉得已经满足自己的需求了?

但是要注意的是,这个可是硬编码,要么是在生成的镜像中写死,要么是在 yaml 清单中写死,那么如果我现在要调整一下我的定时时间,是不是又要重新做一个镜像,或者重新做一个 pod?

使用 ConfigMap 的方式

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

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

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

ConfigMap 具体是个啥?

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

有一点需要注意:

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


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

image.png

对于 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

image.png

上述的信息我们可以看到,echo-config 资源里面的信息包含了我们的键值对 INTER=10

可以查看一下该 cm 对应的 yaml 资源是怎样的

kubectl describe cm echo-config -o yaml

image.png

如果需要加的键值对比较多,那么我们一个一个这么写,也不是办法,太戳了

那么我们可以一个键对应一个文件,例如我们可以这样

我们可以使用参数 --from-file 来指定 key 和文件,例如使用下面的指令

kubectl create configmap my-config --from-file=key1=config.json

image.png

当然,我们也可以是 --from-file 后面指定一个目录,那么 k8s 会去指定目录下读取文件,按照 k8s 的命令规范读取问题,若没有指定 key ,那么文件名就是 key

画一个图来示意一下

image.png

对于一个 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 的值是多少吗?

image.png

咱们创建好 pod 之后,查看一下对应 pod 的日志,我们就可以看到,打印的是

echo info test  -- 10
echo info test  -- 10
echo info test  -- 10

很明显,打印的是 10 ,数据是从我们的 ConfigMap 读出来的数据,没毛病,老铁

我们现在在 pod 运行的时候,咱们去修改一下 cm

kubectl edit cm echo-config

image.png

若需要让我们的 pod 能够读取到 这个 8 秒的定时时间,我们可以删除掉 pod ,然后再创建一个 pod ,我们也可以使用 RC/RS 的方式  ,通过修改副本数来使 pod 达到重启的目的,后续可以分享重启 pod 的其他方式


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
28天前
|
弹性计算 Kubernetes 安全
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
143 8
|
23天前
|
Kubernetes 开发者 容器
"Kubernetes的生死抉择:揭秘Pod容器重启策略如何决定应用命运的惊天大戏"
【8月更文挑战第20天】Kubernetes (k8s) 是一个强大的容器编排平台,其中Pod是最小的运行单元。Pod的重启策略确保服务连续性,主要有Always(总是重启)、OnFailure(失败时重启)和Never(从不重启)。默认策略为Always。根据不同场景,如Web服务、批处理作业或一次性任务,可以选择合适的策略。K8s还支持健康检查等高级机制来控制容器重启。合理配置这些策略对维护应用稳定性至关重要。
61 4
|
24天前
|
存储 Kubernetes 数据处理
在K8S中,什么是有状态应用和无状态应用?
在K8S中,什么是有状态应用和无状态应用?
|
5天前
|
Kubernetes Docker Python
如何在K8s中使用Python应用
一文带你了解如何在K8s中使用Python应用
15 4
|
19天前
|
Kubernetes 负载均衡 数据中心
在K8S中,在主机和容器上部署应用程序有什么区别?
在K8S中,在主机和容器上部署应用程序有什么区别?
|
19天前
|
Kubernetes 网络性能优化 调度
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
|
19天前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
21天前
|
存储 Kubernetes 开发工具
k8s练习--StorageClass详细解释与应用
本文档详细介绍如何在Kubernetes中使用StorageClass动态创建PersistentVolume (PV),以简化大量PV的手动配置工作。StorageClass作为一种动态存储供给机制,
|
22天前
|
Kubernetes 监控 开发者
|
28天前
|
Kubernetes Cloud Native API
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
34 1