09|如何迁移应用配置?
王炜
你好,我是王炜。
上一节课,我们学习了如何使用 Service 来解决应用的服务发现问题。通过 Service URL,我们可以非常方便地进行服务之间的调用,还能够获得多副本负载均衡的能力。
除了服务发现,在实际的项目中,业务应用要想顺利启动往往还需要一些特殊的环境变量或者一份配置文件,例如记录了数据库连接信息、所依赖的微服务 URL、第三方应用的凭据信息的配置文件。
在应用迁移到 Kubernetes 的过程中,这些配置信息是必不可少的,如何对这些配置信息进行管理以及如何让应用顺利读取到配置信息是一个关键问题。
在这节课,我们就来看看 Kubernetes 应用读取配置信息的最佳实践。我们还是从示例应用出发,看看 Kubernetes 的 Env、ConfigMap 和 Secret 到底是如何解决应用的配置问题的。
如何管理配置?
Kubernetes 环境下如何管理应用配置呢?在回答这个问题之前,我先提一个问题。当业务没有进行容器化,也没有迁移到 Kubernetes 的时候,配置都是怎么管理的?
这个问题的答案可能是非常多样的,不过大致可以总结为以下两种方式:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
在Kubernetes环境下,为业务应用提供配置是一项重要的任务。本文介绍了使用环境变量、ConfigMap和Secret来实现配置管理的最佳实践。首先强调了解耦镜像和配置信息的必要性,然后详细介绍了ConfigMap的使用方法,以及如何将其以文件的形式挂载到容器内部,实现动态配置管理。同时,对Secret进行了介绍,强调了其加密特性和适用场景。通过实际示例和详细解释,读者能够快速了解Kubernetes环境下应用配置的最佳实践,包括环境变量、ConfigMap和Secret的使用方法,以及它们在不同场景下的优劣势。这篇文章内容丰富,适合技术人员快速了解Kubernetes环境下应用配置管理的最佳实践。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》,新⼈⾸单¥59
《云原生架构与 GitOps 实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(11)
- 最新
- 精选
- 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
作者回复: 很完整。
2022-12-29归属地:广东3 - 黄堃健只有通过目录挂载的configmap才具备热更新能力,其余通过环境变量,通过subPath挂载的文件都不能动态更新。 并且有一个延迟。一般就是kubelet的定时更新频率
作者回复: 是的,非常正确。
2022-12-28归属地:广东3 - 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
作者回复: 非常正确!
2022-12-28归属地:广东22 - 大圆圆鐒噬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
作者回复: 正确👍🏻
2023-01-15归属地:陕西1 - RRR只有通过 volume 挂载的 configmap 才能实时更新,被已运行的容器感知到。 如果 env 方式,只能重新构建镜像了
作者回复: 或者通过工作负载的 env 字段覆写
2023-08-20归属地:新加坡 - quietwater老师Secret是Base64编码,安全性低。像数据库的用户名和密码这样要求高安全的配置信息,有什么更好的方法吗?
作者回复: 可以通过加密 Secret 来实现,参考第29讲的内容。
2023-03-18归属地:北京 - 范飞扬有小的拼写错误:“我们使用的是更上层的工作负载,例如 Daeployment”
作者回复: 感谢指正~
2023-02-17归属地:上海 - 李多课后题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
作者回复: 正确👍🏻
2023-01-08归属地:广东 - PeiHongbingapp.py中的如下代码是不是写错了: db_username = os.environ.get('DATABASE_URI') db_password = os.environ.get('DATABASE_URI') db_username对应DATABASE_USERNAME db_password对应DATABASE_PASSWORD
作者回复: 是的,已修正。
2022-12-28归属地:广东 - 橙汁记得configmap在相应修改了某些信息后,热更新会有问题。忘记是啥了,如果热更新失效记得去搜下,别一直死守configmap热更新来回部署删除
作者回复: ConfigMap 作为子路径挂载不会实时更新,另外作为 Env 也无法实时更新,需要重启 Pod。 实时更新还依赖业务程序,业务需要能感知到配置变更并自动载入。
2022-12-28归属地:广东7
收起评论