前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两种方法轻松上手 ConfigMap,用作容器云服务的配置中心

两种方法轻松上手 ConfigMap,用作容器云服务的配置中心

作者头像
create17
发布2021-01-04 14:54:47
2.5K0
发布2021-01-04 14:54:47
举报

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

k8s:v1.13.5

一、背景

将 spring boot 项目部署在 k8s 上,需要打镜像,为了实现配置文件可配置,就需要将配置文件与镜像解耦。

之前我们都是使用的 k8s 部署的 spring cloud configserver 组件来当作 spring boot 项目的配置中心。在项目中引入 spring-cloud-starter-config 依赖,配置上 configserver 的内部域名即可。

但有一个痛点就是:configserver 不稳定,有时候会造成其他 pod 应用重启,所以想使用别的方案,那就是 k8s 中的 configMap 。

二、K8s ConfigMap

ConfigMap 顾名思义,是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件。

如下述代码所示,metadata.name 为 configMap 的名称,namespace 为作用域,需要与用到的 pod 作用域保持一致,否则 pod 会因为找不到 configMap 起不来。

以下是一个 configMap 的内容,data 里面有两项,一个是 TENANTID ,一个是 application-test.yml 内容。后续会将它们配置在 deploy 里面,让其在 pod 运行时生效。

代码语言:javascript
复制
kind: ConfigMap
apiVersion: v1
metadata:
  name: spring-boot-demo-configmap
  namespace: public
  labels:
    app: spring-boot-demo-app
data:
  TENANTID: "0000"
  application-test.yml: |-
    spring:
      application:
        name: spring-boot-demo

说说 k8s configmap 的相关命令:

代码语言:javascript
复制
# 创建 configmap,yaml 文件内容为标题二所示:
kubectl apply -f spring-boot-demo-configmap.yaml

# 获取指定作用域下的 configmap 列表
kubectl get configmaps -n public

# 编辑 configmap
kubectl edit configmap -n public spring-boot-demo-configmap

# 删除 configmap
kubectl delete configmap -n public spring-boot-demo-configmap

三、将 ConfigMap 的某些数据挂载为文件

我想让 pod 容器中的 spring boot 项目读取上面 configmap 中 application-test.yml 的内容,这个应该怎么操作呢?

基于以上,将 configMap 创建好之后,我们可以选择将 application-test.yml 的内容挂载到 pod 中,让 spring boot 项目可读,这样就实现了我们的目的。

在一般情况下,使用 configmap 挂载文件时,会先覆盖掉挂载目录,然后再将 congfigmap 中的内容作为文件挂载进行。如果不想对原来的文件夹下的文件造成覆盖,只是将 configmap 中的每个 key,按照文件的方式挂载到目录下,可以使用 mountPath + subpath 参数。

以下是 deployment 里面的部分代码:

代码语言:javascript
复制
spec:
  template:
    spec:
      volumes:
        - name: conf
          configMap:
            name: spring-boot-demo-configmap  # 指定要使用的configmap名称
      containers:
        - name: spring-boot-demo-app
          volumeMounts:
            - name: conf   # 与上面的volumes.name保持一致
              mountPath: /spring-boot-demo/conf/application-test.yml
              subPath: application-test.yml
              readOnly: true

当 subPath 配合 mountPath 使用时,application-test.yml 为文件名,即 pod 容器中只生成了 /spring-boot-demo/conf/ 目录,目录之下为文件,会挂载出一个名为 application-test.yml 的文件(subPath 筛选只挂载 application-test.yml 文件),设置 readOnly 为 true ,表示只读。

四、将 ConfigMap 的某些数据配置成环境变量

针对多租户等场景,我们可能就需要用到环境变量了。那么如何将 ConfigMap 的某些数据配置成环境变量呢?

以下是 deployment 里面的部分代码:

代码语言:javascript
复制
spec:
  template:
    spec:
      volumes:
        - name: conf
          configMap:
            name: spring-boot-demo-configmap  # 指定要使用的configmap名称
      containers:
        - name: spring-boot-demo-app
          env:
              - name: TENANT   # 传入pod中的变量名
              valueFrom:
                configMapKeyRef:
                  name: data-center-management-configmap
                  key: TENANTID  # configmap中的key

通过 valueFrom.configMapKeyRef 可以指定使用哪个 configmap 的 哪个 key 来当做环境变量传入 pod 容器中,这样,spring boot 项目可以直接通过 ${TENANT} 使用。

五、小结

本文介绍了两种使用 configMap 的方法:

  • 将 configMap 作为一种环境变量
  • 将 configMap 挂载为文件

按照这样总结下来,configMap 还挺好用。相对来说,k8s 的 configMap 要比 k8s 部署的 spring cloud configserver 稳定得多。configMap 可以直接将配置内容挂载成文件到你的 pod 容器中,供 spring boot 项目加载使用。

但也有不方便的地方,那就是没有实现热加载。即:如果修改 configMap 后,需要重启服务才会使新配置生效。不过在生产环境上也没事,我们可以将服务调整为双副本嘛。

如果各位小伙伴们,也正在挑选容器云服务的配置中心的话,不妨试试 k8s 的 configmap,或者有更好的方案,也可以在评论中和我们分享一下。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据实战演练 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、K8s ConfigMap
  • 三、将 ConfigMap 的某些数据挂载为文件
  • 四、将 ConfigMap 的某些数据配置成环境变量
  • 五、小结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档