Docker 转 k8s 求助

2021-12-10 08:48:28 +08:00
 Davic1

原来是用单机容器部署的, 现在要上 k8s,遇到两个问题

  1. 原来容器里要读取配置文件, 放在 K8S 上是直接把所有配置项写在 ConfigMap 里吗? (把镜像里配置文件对应的值替换为环境变量, 然后用 ConfigMap 设置环境变量?)

  2. 原来的容器(A)会依赖另一个容器做日志读取(B), 那在 K8S 里是分成两个 Deployment, 分别部署 A 和 B 还是用一个 Deployment 呢

4511 次点击
所在节点    Kubernetes
17 条回复
chenset
2021-12-10 08:58:40 +08:00
1. 配置中心 /随镜像打包 /ConfigMap/目录共享
2. 两种都可以, 看自己需求 或者使用 DaemonSet

这些都不是唯一解的
qping
2021-12-10 09:26:28 +08:00
2. 放一个 deployment 的好处是,启动的时候 deployment 会同时启动两个, 如果需要多个 AAAAA 依赖于一个 B 就分成两个 deploy 吧
xx6412223
2021-12-10 10:22:03 +08:00
1 不同环境的镜像应该一致,配置不一致,K8S 最佳实践就是放 CM 里,为了不改变代码,可以错 volumeMount
2 一个 Deployment 就是一个微服务,如果 AB 不是一一对应,就多个 Deployment
basefas
2021-12-10 10:24:29 +08:00
需要看下原来的日志采集容器有没有特殊规则或者使用,否则可以考虑部署 k8s 集群的日志采集工具统一采集
qq1009479218
2021-12-10 10:27:39 +08:00
1. 如果读取的是文件配置的话,不用环境变量,把文件内容写进 configMap ,挂载到容器的对应目录就行
2. 看 B 是不是只为 A 提供服务,如果是的话,建议一个 Deployment ,当然,两种都行

和一楼说的一样,确实可以随意一点,怎么快怎么来,怎么简单怎么来
zhanggg
2021-12-10 10:31:58 +08:00
1. ConfigMap mount 到 deploy 里成为一个文件,这样在 deploy 里起的 pod 能直接读到文件(也可以直接把配置写进 deploy 的 env 配置,程序通过 env 读
2. 如果你的依赖指的就是 A 生成的日志 B 读取,且 B 的功能仅有读日志功能,那建议放在一个 deploy 里面,通过一个 volumn 挂载到两个 pod 里面去,这样相当于直接有了共享目录
Alliot
2021-12-10 10:35:53 +08:00
第一题 configMap 或者 volume 或者配置中心
第二题 为了灵活可以用边车模式 一个 deployment 里面跑两个容器 和 docker 之前无异。
Davic1
2021-12-10 12:08:44 +08:00
@xx6412223 挂在 ConfigMap 相比于通过它给环境变量赋值来说有什么缺点吗
Davic1
2021-12-10 12:11:21 +08:00
@zhanggg thx, 请问下挂载 ConfigMap 与程序通过 env 来读 有什么缺点吗
goushenggege
2021-12-10 13:45:57 +08:00
1 是的
2 有多种方式,甚至用边车都可以
fisherwei
2021-12-10 14:37:46 +08:00
@Davic1
configmap 有两种用法
1 、把 configmap 每一项当作一个文件映射为 pod 内的某个路径的某个文件(这文件是只读的)
2 、把 configmap 每一项当作一个 env 注入 pod

没有什么优缺点,看你的 pod 内跑的应用是怎么设计的。
amrom
2021-12-10 15:02:27 +08:00
虽然方案有很多组合,但是我比较倾向于以下:
1. 全部配置以 configmap 存在
2. 一个 deployment 对应一个服务,服务间的日志共享用 pv 实现
swulling
2021-12-10 15:13:44 +08:00
一个 Pod 里可以放多个容器~
az467
2021-12-11 01:25:14 +08:00
1.使用 SubPath 是不会更新,但是 Env 也不会更新啊。而且修改配置之后一般都是要重启的吧……
2.如果 A 和 B 合起来对外提供一个服务,那就用一个 Deployment 。
dayeye2006199
2021-12-11 03:13:49 +08:00
ConfigMap 变更之后需要重启服务,有几种办法;
1. 手动模式 kubectl rollout restart xxxxx 重新启动 deployment
2. 需要将 deployment 指向一个新的 configmap 才能触发更新;例如老的 configmap 叫 config1 ,新的更改了里面的部分值之后,重命名成 config2 ,然后 deployment 里面指向 config2 。


一些做 release 管理的工具,例如 kustomize 用的是方法 2 ; helm 用的是生成一个 configmap hash 的 annotation 放在 deployment 上;每次 configmap 内容变更之后,这个 annotation 也会变更,所以会触发 deployment 自动更新
zhanggg
2021-12-13 10:03:41 +08:00
@Davic1 看你程序怎么读文件,你可以理解为如果你的程序跑在独立系统,你程序读配置是走 env 还是配置文件
Davic1
2021-12-13 13:33:01 +08:00
@zhanggg 程序是读的配置文件. 现状是配置文件不论是路径还是内容均已硬编码. 基于此我们就先暂停了它的上线要求.
也谢谢你的回答~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/821235

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX