V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
0x5c0f
V2EX  ›  DevOps

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

  •  
  •   0x5c0f · 65 天前 · 2323 次点击
    这是一个创建于 65 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    19 条回复    2024-07-15 20:05:46 +08:00
    caomingjun
        1
    caomingjun  
       65 天前 via Android
    IvanLi127
        2
    IvanLi127  
       65 天前
    有 docker compose 的话,直接定时任务跑 docker compose pull && docker compose up -d 。

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

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

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

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

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

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

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

    但是貌似单机版的健康检查没什么用,你可以试试 Docker Swarm
    ala2008
        18
    ala2008  
       63 天前
    自动更新挺危险的吧,除非全流程都一个人
    zx900930
        19
    zx900930  
       63 天前
    @chf007 非 docker swarm 的 healthcheck 自愈可以配合镜像:willfarrell/autoheal 实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:36 · PVG 03:36 · LAX 12:36 · JFK 15:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.