V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
koalli
V2EX  ›  程序员

请教可靠、快速、安全的持续集成、持续部署方案

  •  
  •   koalli · 2018-06-10 14:54:33 +08:00 · 4842 次点击
    这是一个创建于 2376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我最近自己的一个 Node.js 小项目准备要部署到服务器上,忽然想到这么一个问题:

    如果我这个小项目要部署要 100 台服务器上(可能更多),我该怎么办?

    首先我想到了公司在用的 Jenkins,由 Jenkins 来进行 iOS、Android、windows 项目的编译打包,同时也承担了服务器的部署。

    我们服务器部署是在 Jenkins 里面配置了目标服务器的 ip、ssh 公钥等信息,通过 ssh 连接目标服务器,发送文件然后在目标服务器执行脚本。

    这样虽然可以实现,但是如果要发布到大量服务器的话这样的方案明显是不可取的,单单是发送文件就得耗费大量的时间,Jenkins 保存服务器 ip、公钥的方式维护起来也会很麻烦。

    我网上查了很多资料好像很少这种案例,然后我就想来请教 v2er 们,大家都是怎么样处理这种问题的?

    如何管理、维护大量的服务器?怎么样可靠、快速、安全的实现这样的持续集成、持续部署?

    第 1 条附言  ·  2018-06-11 17:06:21 +08:00

    感谢回答和关注的朋友们,我早上翻来翻去发现daocloud部署的应用有个自动发布功能,描述里写的是:

    当有镜像构建成功后,自动更新应用到最新构建的版本
    

    感觉如果和Docker一起使用,整个部署流程会变成:

    合并推送代码->自动化测试->构建Docker镜像->推送到Docker Registry

    完了在daocloud里开启了自动发布的所有容器就会全部自己更新了。。

    是不是这样?还是我想得太美了?

    24 条回复    2018-06-11 21:37:28 +08:00
    a7a2
        1
    a7a2  
       2018-06-10 15:20:05 +08:00
    CheungSSH
    不知有无答对
    Vogan
        2
    Vogan  
       2018-06-10 15:36:31 +08:00 via iPhone
    Docker 解决
    expy
        3
    expy  
       2018-06-10 16:29:14 +08:00
    koalli
        4
    koalli  
    OP
       2018-06-10 17:42:00 +08:00
    @a7a2
    这个工具看起来挺强大的,研究看看

    @Vogan
    Docker 集群 /Kubernetes 的方案我有想过,我自己目前的服务器也是安装了 Docker
    xcai
        5
    xcai  
       2018-06-10 18:00:03 +08:00 via Android
    ansible
    swulling
        6
    swulling  
       2018-06-10 18:21:44 +08:00 via iPhone
    传统解决方案 puppet saltstack ansible
    新派解决方案 k8s
    Cbdy
        7
    Cbdy  
       2018-06-10 18:56:56 +08:00 via Android
    k8s
    q397064399
        8
    q397064399  
       2018-06-10 22:06:48 +08:00   ❤️ 2
    没有银弹, 运维本身就是件很复杂 根据需求需要支出大成本代价的事情,
    有的人着重点是安全,有的人着重点是便捷,有的人着重点是快速集成发布,
    上百台的话,如果环境简单,docker 打包 python 脚本部署 并不是不可能的事情,
    但是考虑到服务的可用性,灾备又是另外一套方案,还有服务的分发又是另外一个问题,
    总而言之,实际问题实际解决,没有大一统的方案。
    plko345
        9
    plko345  
       2018-06-10 22:12:36 +08:00 via Android
    问你们家运维啊,运维不就干这个的吗?对运维工程师来讲这种事还是容易实现的
    notreami
        10
    notreami  
       2018-06-10 22:26:08 +08:00
    你需要一个便捷发布管理平台,能支持:批量发布、快速回滚、限流灰度
    Foolt
        11
    Foolt  
       2018-06-10 22:29:57 +08:00
    我前些年看一篇翻译的介绍脸书代码维护的文章,说脸书以前 PHP 代码滚动部署到全部服务器一次要两三个月,后来忘了改成什么方案时间缩短到一两个星期。你可以找来参考。
    koalli
        12
    koalli  
    OP
       2018-06-10 23:08:46 +08:00
    @q397064399
    嗯,一旦服务器数量增加,这种管理方式我觉得会很成问题,如果各台服务器只是做负载均衡那问题就小很多,我们的情况是不同国家 /地区会有各自的几台服务器(有的是物理服务器有的是云主机),这些服务器本身业务逻辑代码都是一致的但是连接到不同的数据库,这种情况下的服务器管理就更复杂了。(也可能是我们的服务端把问题搞复杂了)

    @plko345
    我们家运维没有处理过这么大量的服务器,我们现在的服务器不超过 20 台,后来买的云主机都尽可能高配来减少数量
    reeco
        13
    reeco  
       2018-06-10 23:22:02 +08:00
    要不试下商业的解决方案: https://cn.aliyun.com/product/yunxiao
    Hardrain
        14
    Hardrain  
       2018-06-10 23:24:21 +08:00 via Android
    docker +1
    ywgx
        15
    ywgx  
       2018-06-11 08:28:48 +08:00 via Android
    这个问题是 大量主机如果高效运维管理问题, 批量配置更改,权限管理,基础软件部署,应用分组监控等问题 https://xabcloud.com 了解一下,希望没打扰到大家
    dbak
        16
    dbak  
       2018-06-11 08:41:07 +08:00
    jenkins+ansible+http 服务器(文件下载)
    mritd
        17
    mritd  
       2018-06-11 09:47:55 +08:00 via iPhone
    Gitlab CI +docker 了解一下
    Loyalsoldier
        18
    Loyalsoldier  
       2018-06-11 11:10:08 +08:00
    感觉上面说 Docker 的都没有好好审题……楼主的问题是,服务器和服务器之间怎么方便地连结在一起并且统一管理。Docker 只是统一环境、快速部署代码而已。
    Loyalsoldier
        19
    Loyalsoldier  
       2018-06-11 11:14:42 +08:00
    如果真想要做到全自动发布的话,可以看看阿里云的资源编排 + 容器服务,可以做到根据负载来实时增删服务器。但是这个运维架构需要应用本身是各种微服务,对传统架构不适用。

    如果已有应用是传统的 MVC 模式的话,那么 Ansible + Docker 或者 Python 脚本 + Docker 比较合适。
    nullcoder
        20
    nullcoder  
       2018-06-11 15:53:05 +08:00
    chef.io 了解一下?
    koalli
        21
    koalli  
    OP
       2018-06-11 17:23:45 +08:00
    @mritd
    我现在自己搭建的方案实际上非常接近,bitbucket + docker + daocloud,我理想中的流程是我一旦向 master 分支合并代码后,全自动测试+构建+部署,但是这个部署的目标可能是数量较大的服务器,我需要能控制单台服务器的配置参数,同时还需要一定的服务器监控管理。

    @Loyalsoldier
    Docker 可以从一定程度上来缓解这个问题,实际上就是由 Docker 来做集群资源管理,不再是直接连接对应的云主机去做操作了。我这个问题实际上包含了两个层面,一个是持续集成、持续部署的实施方案,以及多服务器的监控管理维护方案。
    mritd
        22
    mritd  
       2018-06-11 20:33:32 +08:00 via iPhone
    @koalli 对于较大量的服务器控制,那么在使用 docker 的情况下你应给使用编排工具,比如 swarm kubernetes 等,无论哪种都需要一些学习成本,当然我推荐 k8s 不过它的学习成本也更高



    在完成了编排控制后,那么你就可以通过标准的编排工具的 cli 或者 自己对接 api 实现大批量快速的应用部署,滚动升级,回滚等动作


    在此后你将可以处理你的 ci,不论是使用 jenkins 或者 gitlab ci 都可以在 build 完成后通过控制编排工具的方式进行对应操作,当然对于分支触发任务这种动作基本上哪个 ci 都支持


    最后,如果你采用 gitlab ci 这篇文章可能对你有帮助 https://mritd.me/2017/11/28/ci-cd-gitlab-ci/ ,k8s 搭建等博客中也有点 😁
    mritd
        23
    mritd  
       2018-06-11 20:34:46 +08:00 via iPhone
    @koalli 还有资源监控等,上了集群以后有很多方案,还有分布式日志收集等等,具体的你可以查一下
    koalli
        24
    koalli  
    OP
       2018-06-11 21:37:28 +08:00
    @mritd
    抱紧大佬,Swarm 我没玩过,之前在玩 Docker 的时候发现了 Kubernetes,然后跑到 IBM Bluemix 去试用过一段时间。我们公司的运维还在原始阶段(没准我还是理念领先的),我本身不是服务端开发,Docker 也好 Kubernetes 也好我都是自己翻官网文档研究,但是日常工作的时候没有使用场景,感觉相当有用,给好多朋友安利过。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   864 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.