请教一个关于容器化部署的问题

2024-07-13 23:18:20 +08:00
 0x5c0f

  我们目前只是单纯的容器化项目,然后在服务器上跑,也是单节点, 我想请教下大家,我应该如何在服务器上去监听容器仓库中的镜像是有新版本,然后服务器上主动拉取更新。 我们没有用像 k8s 这样的编排和集群工具,目前的也只是单纯的用容器在跑。
  目前我正在使用的方式就是写了一个脚本,定时去监听仓库中镜像的 Digest 值然后和服务器上比对,不一致就拉取更新,但是这个脚本识别的不是特别准确,特别是在更新后的健康状态判断的时候有没有什么方法或者其他工具推荐的,最好是轻一点,k8s 这种,以我们目前的资源是完全跑不起来的,加上这玩意实际上我也不太会。

4453 次点击
所在节点    DevOps
19 条回复
caomingjun
2024-07-13 23:37:39 +08:00
IvanLi127
2024-07-14 00:28:59 +08:00
有 docker compose 的话,直接定时任务跑 docker compose pull && docker compose up -d 。

这感觉这样朴实无华
yinmin
2024-07-14 01:11:32 +08:00
自动更新镜像,前车之鉴: https://v2ex.com/t/981818
zx900930
2024-07-14 07:48:42 +08:00
生产环境千万别整什么自动更新镜像版本,业务镜像一定要使用固定版本号!
除非是某些不影响业务需要频繁更新的中间件。
这个时候纯容器部署(非 k8s )下用 watchtower ,并且打好 label 只更新自己打了标签的那几个容器!
k8s 下可以用 argoCD 或者其它 CD 工具。
fsdrw08
2024-07-14 09:47:39 +08:00
如果用 podman ,那就很简单了,因为 podman 支持自动更新镜像,podman run 的时候加个 label io.containers.autoupdate=registry 就行

参考: https://www.redhat.com/sysadmin/podman-auto-updates-rollbacks
0x5c0f
2024-07-14 10:22:30 +08:00
@fsdrw08 谢谢,这是一个很好方案,不过我们目前都是 docker ,只能在后面新启节点的时候试跑一下了
0x5c0f
2024-07-14 10:28:54 +08:00
@zx900930 关于这个问题,我们目前其实更新的也不是特别频繁,就是比较麻烦,得每次让我守着开发更新,弄成自动更新实际上是不会有什么问题的,只要更新,那么内容一定是经过完整性测试的。只是这个自动执行的步骤需要判定。至于大家说的 watchtower ,这个我也关注过,但是这个东西是肯定不适合生产环境的。
ETiV
2024-07-14 10:43:59 +08:00
手写过,但不是定时检查,而是通过 gitlab cicd pipeline ,最后部署阶段的时候做:

两组服务,A&B 交替启动:

新版本来了的时候判断一下,比如当前 B 在运行中,就修改 A 的 tag ,准备启动 A 。
A 启动成功了去修改 nginx proxy_pass 的配置,test OK 后 nginx reload ,再等待 B 的端口没有连接后杀掉它。
zx900930
2024-07-14 10:59:31 +08:00
@0x5c0f 版本发布后的健康状态可以自己写 healthcheck ,然后用 autoheal 容器监控实现类似 k8s 的 readiness/liveness probe 的自愈功能。
julyclyde
2024-07-14 13:47:28 +08:00
你心里想的:
自动更新应用程序版本

你提问的:
自动更新镜像的版本

这俩事差十万八千里呢
VirgilChen97
2024-07-14 17:15:53 +08:00
千万不要自动更新,发布还是要人工操作,同时看是否有异常。自动拉取更新,你不关注的话线上出问题你都不知道。如果新版本有问题,也无法及时回滚,同时还有可能被自动更新工具再次更新成新的有问题的版本
guanzhangzhang
2024-07-14 17:52:27 +08:00
consul 的 nomad ?
chf007
2024-07-14 19:09:49 +08:00
如果是部署的第三方应用,就不该自动更新,为什么这么执着自动更新呢?一般来讲出问题的概率比较大。

从你的描述上来看,说的不明不白,但是感觉你是想部署自已的业务应用吧,在其它地方打好了镜像,但是服务器是内网或什么原因没办法从其它地方触发拉取镜像的动作,所以想着在服务器上自动更新。这种是个笨办法啊。还是想想内网穿透的什么方案。
0x5c0f
2024-07-15 09:13:21 +08:00
@julyclyde 应用打包为镜像,自动更新镜像就是更新应用,为什么这个会有你说的差异?
0x5c0f
2024-07-15 09:15:38 +08:00
@chf007 这并不是第三方应用,就是我们自己的项目,整体应该就是一个很标准的 CI/CD ,CI 是 jenkins 完成,CD 目前我是自己写的一个脚本实现的,只是检查健康状态时不是特别准确,我想看看还有没有其他方案来实现 CD 的功能
0x5c0f
2024-07-15 09:27:00 +08:00
@ETiV 如果是这样的话,会不会导致整体结果变得很慢,我把这两个拆分开来,是为了可以手动操作生产环境的更新,也可以通过定是任务自动去判定。目前脚本支持远程触发,也支持定时任务触发,只是健康检查的时候总是判断不太准确。关于两组服务交替启动,我们实际上并不特别需要高可用,我现在只是需要完善整个 CI/CD 流程,就想问一下有没有更好一点的方案或者工具实现。
chf007
2024-07-15 09:58:49 +08:00
dockerfile 中是有健康检查的语句的,要自已实现

但是貌似单机版的健康检查没什么用,你可以试试 Docker Swarm
ala2008
2024-07-15 16:23:25 +08:00
自动更新挺危险的吧,除非全流程都一个人
zx900930
2024-07-15 20:05:46 +08:00
@chf007 非 docker swarm 的 healthcheck 自愈可以配合镜像:willfarrell/autoheal 实现

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

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

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

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

© 2021 V2EX