云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
5442 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

09|如何迁移应用配置?

你好,我是王炜。
上一节课,我们学习了如何使用 Service 来解决应用的服务发现问题。通过 Service URL,我们可以非常方便地进行服务之间的调用,还能够获得多副本负载均衡的能力。
除了服务发现,在实际的项目中,业务应用要想顺利启动往往还需要一些特殊的环境变量或者一份配置文件,例如记录了数据库连接信息、所依赖的微服务 URL、第三方应用的凭据信息的配置文件。
在应用迁移到 Kubernetes 的过程中,这些配置信息是必不可少的,如何对这些配置信息进行管理以及如何让应用顺利读取到配置信息是一个关键问题。
在这节课,我们就来看看 Kubernetes 应用读取配置信息的最佳实践。我们还是从示例应用出发,看看 Kubernetes 的 Env、ConfigMap 和 Secret 到底是如何解决应用的配置问题的。
在课程正式开始之前,你需要确保已经按照第 5 讲的引导在本地 Kind 集群部署了示例应用。

如何管理配置?

Kubernetes 环境下如何管理应用配置呢?在回答这个问题之前,我先提一个问题。当业务没有进行容器化,也没有迁移到 Kubernetes 的时候,配置都是怎么管理的?
这个问题的答案可能是非常多样的,不过大致可以总结为以下两种方式:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 黄堃健
    只有通过目录挂载的configmap才具备热更新能力,其余通过环境变量,通过subPath挂载的文件都不能动态更新。 并且有一个延迟。一般就是kubelet的定时更新频率

    作者回复: 是的,非常正确。

    归属地:广东
    3
  • includestdio.h
    大致分3种使用方式,官网文档介绍的比较详细 1.使用 ConfigMap 数据定义容器环境变量: https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#define-container-environment-variables-using-configmap-data 2.将 ConfigMap 中的所有键值对配置为容器环境变量: https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables 3.在 Pod 命令中使用 ConfigMap 定义的环境变量: https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#use-configmap-defined-environment-variables-in-pod-commands 使用 kubectl create configmap 创建 ConfigMap https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#create-a-configmap-using-kubectl-create-configmap

    作者回复: 很完整。

    归属地:广东
    2
  • PeiHongbing
    课后题1如下: apiVersion: v1 kind: ConfigMap metadata: name: backend-env data: DATABASE_URI: pg-service DATABASE_USERNAME: postgres DATABASE_PASSWORD: postgres --- apiVersion: apps/v1 kind: Deployment metadata: name: backend labels: app: backend spec: replicas: 1 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: flask-backend image: lyzhang1999/backend:latest imagePullPolicy: Always ports: - containerPort: 5000 envFrom: - configMapRef: name: backend-env

    作者回复: 非常正确!

    归属地:广东
    2
    2
  • 大圆圆鐒噬
    Create secret for PSQL init sql scritps, kubectl create secret generic ads-db-secret --from-file createdb.sql --dry-run=client -o yaml apiVersion: v1 data: createdb.sql: Q1JFQVRFIFRBQkxFIHRleHQgKAogICAgaWQgc2VyaWFsIFBSSU1BUlkgS0VZLAogICAgdGV4dCBWQVJDSEFSICggMTAwICkgVU5JUVVFIE5PVCBOVUxMCik7Cg== kind: Secret metadata: creationTimestamp: null name: ads-db-secret

    作者回复: 正确👍🏻

    归属地:陕西
    1
  • RRR
    只有通过 volume 挂载的 configmap 才能实时更新,被已运行的容器感知到。 如果 env 方式,只能重新构建镜像了

    作者回复: 或者通过工作负载的 env 字段覆写

    归属地:新加坡
  • quietwater
    老师Secret是Base64编码,安全性低。像数据库的用户名和密码这样要求高安全的配置信息,有什么更好的方法吗?

    作者回复: 可以通过加密 Secret 来实现,参考第29讲的内容。

    归属地:北京
  • 范飞扬
    有小的拼写错误:“我们使用的是更上层的工作负载,例如 Daeployment”

    作者回复: 感谢指正~

    归属地:上海
  • 李多
    课后题2: // 直接通过文件生成 # cat local-config.yaml service=conf port=8081 # k create configmap local-config --from-file=local-config.yaml configmap/local-config created # k get configmap local-config -o yaml apiVersion: v1 data: local-config.yaml: | service=conf port=8081 kind: ConfigMap metadata: creationTimestamp: "2023-01-08T04:09:55Z" name: local-config namespace: default resourceVersion: "372705" uid: c88ae816-99f1-4d4f-8fe5-2a528916bde7 // 此外,还有利用 kustomization ,从文件中生成配置。我理解的 kustomization 类似于 helm,可以用模板对配置进行组装或者修改。这里就不过多演示 kustomize 了,只是感觉 从 kustomize 生成配置是不是挺重要的,我也没在生产环境中用过。 # cat <<EOF >./kustomization.yaml configMapGenerator: - name: local-game-config files: - local-config.yaml EOF # k apply -k . configmap/local-game-config-c65b9b9f5t created p# k get configmap local-game-config-c65b9b9f5t -o yaml apiVersion: v1 data: local-config.yaml: | service=conf port=8081 kind: ConfigMap metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"local-config.yaml":"service=conf\nport=8081\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"local-game-config-c65b9b9f5t","namespace":"default"}} creationTimestamp: "2023-01-08T04:12:45Z" name: local-game-config-c65b9b9f5t namespace: default resourceVersion: "373080" uid: 33feff4b-eec2-45db-ad92-77065f67fb22 参考:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#create-a-configmap-using-kubectl-create-configmap

    作者回复: 正确👍🏻

    归属地:广东
  • PeiHongbing
    app.py中的如下代码是不是写错了: db_username = os.environ.get('DATABASE_URI') db_password = os.environ.get('DATABASE_URI') db_username对应DATABASE_USERNAME db_password对应DATABASE_PASSWORD

    作者回复: 是的,已修正。

    归属地:广东
  • 橙汁
    记得configmap在相应修改了某些信息后,热更新会有问题。忘记是啥了,如果热更新失效记得去搜下,别一直死守configmap热更新来回部署删除

    作者回复: ConfigMap 作为子路径挂载不会实时更新,另外作为 Env 也无法实时更新,需要重启 Pod。 实时更新还依赖业务程序,业务需要能感知到配置变更并自动载入。

    归属地:广东
    7
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部