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

采用 CI/CD 方式部署的服务,如何私有化部署到客户内网

  •  
  •   jackleeforce3615 · 2021-06-21 10:05:02 +08:00 · 4778 次点击
    这是一个创建于 1256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们有一个产品采用脚手架 full-stack-fastapi-postgresql 开发,在内部部署的时候都是用 gitlab + gitlab runner + docker swarm 部署。现在有需求要部署到客户内网,一下子傻眼了,难道要在客户内容搭建一套 gitlab ci 环境 然后把代码推送到客户的gitlab 来进行部署么?

    32 条回复    2021-06-23 23:19:33 +08:00
    zlink
        1
    zlink  
       2021-06-21 10:08:18 +08:00
    vpn ?
    youyi1996
        2
    youyi1996  
       2021-06-21 10:09:46 +08:00
    都上 docker 了为啥不导出镜像拷贝到客户那边?
    killva4624
        3
    killva4624  
       2021-06-21 10:12:58 +08:00
    - 客户端内网服务器如果可以连接外网,可以考虑做一套或者找现成的轮子,实现自动轮询最新配置+自动变更(比如 Azure IoT );
    killva4624
        4
    killva4624  
       2021-06-21 10:14:37 +08:00
    - 如果客户端不能连接外网,那就找客户要一个连接外网的内网的服务器做中转,从这个服务器上连接 CI 和客户内网的部署环节,比如 Rundeck
    Actrace
        5
    Actrace  
       2021-06-21 10:20:20 +08:00
    @killva4624 😂,有点腿裤子放屁的感觉。
    liuxu
        6
    liuxu  
       2021-06-21 10:21:29 +08:00
    不用,这个方案我搞过,gitlab runner 有个 shell 模式,runner 在服务器内网安装,原理其实是 runner 定时每秒请求 gitlab 获取 event 执行 ci,只要内网有机器能访问到 gitlab 就行
    wengych
        7
    wengych  
       2021-06-21 10:22:36 +08:00
    @liuxu 还要依赖于 registry...
    jackleeforce3615
        8
    jackleeforce3615  
    OP
       2021-06-21 10:27:53 +08:00
    @zlink 这个估计悬,可能还得升级公司基础设施( VPN 网速不够)

    @youyi1996 感谢回复,这样镜像导出来好像没办法用 `docker swarm` 部署。

    @killva4624 感谢回复,你说的这两个方案 我消化理解一下。
    jackleeforce3615
        9
    jackleeforce3615  
    OP
       2021-06-21 10:30:17 +08:00
    @wengych 是 我们内网部署的时候有一台 `artifactory `,`gitlab-ci.yaml` 里面执行脚本把镜像 push 到 `artifactory`上面。然后执行 docker-swarm 命令拉取镜像部署。 现在看来感觉这个 registry 要放到外网。
    jackleeforce3615
        10
    jackleeforce3615  
    OP
       2021-06-21 10:31:47 +08:00
    @liuxu 你的意思是在客户内网安装 `runner`, 只要客户内网 `runner ` 可以访问到我公司的 `gitlab` 就可以是把?
    jackleeforce3615
        11
    jackleeforce3615  
    OP
       2021-06-21 10:32:08 +08:00
    回复怎么不能支持 markdown .
    liuxu
        12
    liuxu  
       2021-06-21 10:33:18 +08:00
    securityCoding
        13
    securityCoding  
       2021-06-21 10:42:35 +08:00
    我们上了 k8s+helm ,helm 防火墙开放白名单
    流程标准化后没那么累
    defunct9
        14
    defunct9  
       2021-06-21 10:53:45 +08:00
    开 ssh,让我上去看看。(刚弄完一套 gitlab + 2 处 git + harbor + argocd,网络一样复杂,穿越了 3 个机房)
    pelloz
        15
    pelloz  
       2021-06-21 10:54:35 +08:00
    我问一下,客户服务器没有 k8s 或者 docker 的环境,也没有相应的运维资源去支持,你们都是怎么解决私有化部署的?
    bthulu
        16
    bthulu  
       2021-06-21 10:59:53 +08:00
    @liuxu 内网是不能访问外网的, 根本就连不到 gitlab
    clf
        17
    clf  
       2021-06-21 11:02:00 +08:00
    runner 在内网就行了,runner 开权限连 gitlab 就 OK 。runner 就是实际打包的机器。

    镜像要不要推送到镜像仓库看你们需求。
    killva4624
        18
    killva4624  
       2021-06-21 11:07:26 +08:00
    @Actrace 去年刚做过一个类似的场景,国内某大型企业,内网准入极其苛刻,前期研发手动 VPN 变更,后期为了大规模部署真是绞尽脑汁……
    ljhrot
        19
    ljhrot  
       2021-06-21 11:16:14 +08:00
    建议放弃在内网折腾 CI/CD 的想法,大规模服务可以尝试使用 ansible 部署,就是包括基础环境和服务应用,做稳定版本的部署和升级就行了
    wengych
        20
    wengych  
       2021-06-21 11:18:48 +08:00   ❤️ 1
    代码交付还是二进制交付,代码交付可以做 repo mirror,然后客户方面内网部署一套独立的 gitlab 和 cicd
    如果是二进制交付,做一个白名单入口把 repository 开放给客户,客户主机可以用 puppet/ansible 之类的工具做配置管理。
    ghwolf007
        21
    ghwolf007  
       2021-06-21 11:31:05 +08:00
    内网完全物理隔离的情况我碰到过,之前用过搭 gitlab 的方式 很操蛋,后面转 k8s+helm 了, 镜像导出导入,helm install 一把梭
    robinlovemaggie
        22
    robinlovemaggie  
       2021-06-21 13:17:51 +08:00
    邮寄硬盘——简单粗暴无脑解决私有化部署各种的弊端
    miao1007
        23
    miao1007  
       2021-06-21 13:31:16 +08:00 via iPhone
    内外网应该有 dmz 才对啊
    qizhca
        24
    qizhca  
       2021-06-21 15:38:28 +08:00
    如果是国电那种一区二区的内网,好像没有物理接触去部署以外更好的解决方案
    lework1234
        25
    lework1234  
       2021-06-21 17:16:39 +08:00
    docker-compose 一把梭
    Rush9999
        26
    Rush9999  
       2021-06-21 18:07:17 +08:00   ❤️ 1
    docker export -o *.tar CONTAINER
    liuxu
        27
    liuxu  
       2021-06-21 21:48:50 +08:00
    @bthulu 你不是楼主,是在给谁设置限制
    lfzyx
        28
    lfzyx  
       2021-06-21 22:38:32 +08:00
    招个 devops 运维工程师能解决
    adoal
        29
    adoal  
       2021-06-21 23:31:02 +08:00 via iPhone
    需方内外网严格隔离、需方外包给外面单位开发而不是养自研团队、CI/CD,这三项不能流畅地兼顾,至少要放弃一项
    julyclyde
        30
    julyclyde  
       2021-06-22 13:52:34 +08:00
    用反弹的
    saltsstack 、gitlab-runner 之类的
    wengych
        31
    wengych  
       2021-06-22 14:46:53 +08:00
    @adoal 定期邮寄光盘吧
    jackleeforce3615
        32
    jackleeforce3615  
    OP
       2021-06-23 23:19:33 +08:00
    大家都给了很好的思路,感谢!
    实际上我们这个产品刚开发完毕,还没有客户来当小白鼠。以后可能各种网络情况的客户都会碰到吧。

    根据大家的回复,我整理了一下思路:
    如果是客户可以访问外网的:

    1.外网部署一个 gitlab + docker-registry( artifactory )
    2.公司内网 gitlab 的项目与外网 gitlab 做成 mirror 。
    3.内网代码提交触发 CI 制作镜像, 并推到外网的 docker-registry 上,同时触发外网 gitlab mirror 项目的 CI, 这个 CI 在客户侧的 gitlab runner 上面执行,拉取镜像下来部署。

    如果客户不可以访问外网。估计只能导出容器或者镜像到客户侧部署了吧。 这是最操蛋也是最无奈的做法。

    不过考虑到我们这个产品不止有我们自创的镜像,还依赖一些公共服务镜像,如 redis,postgresql,traefik 等等,估计得逼客户开放外网。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3303 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:05 · PVG 20:05 · LAX 04:05 · JFK 07:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.