企业案例:Zadig 为什么能用的爽

开发 开发工具
IT 领域的演变,就是运维人员通过不断向上接手开发人员眼中“跟开发无关的杂活”,来不断为开发人员减负。开发人员在得到了解放后,可以将视角更多的聚焦在自己开发的业务系统上,释放出自己的创造力。但是运维人员也要不断的优化现有的基础设施架构,以及构建简单易用的平台化工程来给开发人员使用。平台化工程或许是未来 CI/CD 的一个趋势和演进方向吧。

​传统 CI/CD 处理的问题

说到 CI/CD 的工具,IT 圈内名声最响亮的可能就会是传统的老牌 CI/CD 的王者之一:Jenkins。说到它基本上 IT 人都知道。在曾经云计算时代,乃至更久远的时代,因为那个时候软件架构还没有拆分成微服务,很多都是主机部署。所以 Jenkins 靠着一套 Pipeline 和自由风格流水线,打遍天下无敌手。

Jenkins 之所以能够这么纵横宇内有很大的一部分原因就是:开放,CI/CD,使用简单,能够走完一整套交付流程。

开放:意味着有着开放包容的api和插件,能够面临各种场合。

CI/CD:意味着能够完整的走完一整套交付,包含代码的拉取,制品的生成存储以及服务的部署。

但是随着技术的不断迭代,Jenkins 终将有一天不再适合新的环境。各位请继续往下看嘞。

图片

云原生时代 CI/CD 面临的挑战

在云原生时代,万物皆可云原生。随着微服务的盛行,业务逻辑的服务拆分,容器化的兴起,编排容器逐步成为了业务主流规范。进入到这一阶段,新的挑战也就随之而来。例如:

  • 以前服务少,Jenkins 能够一把梭哈,现在服务多起来了,每个服务都要一个Jenkins Job,尽管都是一样的逻辑,复制粘贴,但是数量多了也终将是一个麻烦事。如果十个,百个呢?
  • 现在每个服务都要用 Jenkins 去做 CI/CD,那么我要封装很多的 pipeline,还有 Dockerfile,这种有规律的文件为什么不能抽象化,每次都要自己写。
  • 每次使用都是通过 kubelet 加 shell 命令去做的构建部署,这样合理吗?
  • 环境众多,开发、测试、预发、压测、生产,每个项目总有那么最少两三个环境吧,这个时候环境多了如何管理呢?
  • 通过 K8s 的标准编排,很多服务配置文件都会以 ConfigMap,Secret 的形式存在,不同环境的配置都会不一致,那么如何去做统一管理呢?
  • 研发人员的感知态如何做到?研发人员需要知道这个服务上了 K8s 是否启动成功,包含日志,事件信息,部署 Job 是否成功。这些能提供吗?
  • 发版服务的时候,如何才能合理管理版本呢?
  • 开发测试找你要环境,你该如何快速部署相应呢?

以上种种就是服务迁移 K8s 后所要面临的部分问题。Jenkins 很好,但是在新趋势的到来后,个人还是感觉心有力而力不足。

或许你会说可以使用 Jenkins+ArgoCD 来弥补相互之间的差距啊。但是我始终还是觉得,Jenkins+ArgoCD 并非是最理想的状态。

Jenkins+ArgoCD

Jenkins 可以做 CI,ArgoCD 可以做 CD,两者相辅相成,可以实现基本的 K8s 环境的 CI/CD。类似示例图如下:

图片

两者结合固然是可以做到持续集成和持续发布的,但是我们还是要结合实际出发。我没有说不好,只是具体还要看使用场景和能够解决哪些问题。

现有很多 IT 公司都会有云资产,很多的正式环境都会放置在云端。这个时候就会有分歧——环境问题。

或许我开发测试使用本地机房,但是我云端因为是生产环境,会单独独立区分环境。那么按照环境区分原则,我会有 2 套环境,开发测试一套 Jenkins+ArgoCD,正式环境一套 Jenkins+ArgoCD。那么这个时候如果说公司对环境更为重视还会有预发,压测环境,那么又是一套 Jenkins+ArgoCD。好家伙,几套环境,上线一个服务都会在以上环境中乘以 3 的操作,直接带来的感觉就是:

  • 效能降低
  • 环境治理困难
  • 服务配置文件难以管理

以上就是后续会面临的问题,还有一些问题就是,通过 Jenkins+ArgoCD 仅仅只能做到 CI/CD,更多的呢,能够做到吗?这里好像还要打一个问号。

为什么 Zadig 用的爽?

Zadig 就是专门用来做效能的一款开源 CI/CD 平台。我十分认可 Zadig 的使命:工程师是数字经济最重要的资产,Zadig 让工程师专注企业创新。他可以完美的解决我们迁移 K8s 后的一系列问题。如果加以规划和使用,可以用如下流程图来概括:

图片

详细部署图如下:

图片

通过一定的规划后可以实现 CI/CD 环境,一套主导所有。

这个时候可以算下成本,假设你环境之间是这样区分的:

其中正式环境 Jenkins 存在 slave 1 台,4核16G 云主机,包月:412元/月

其中压测,预发环境 Jenkins 存在 slave 1 台,4核16G 云主机,包月:412元/月

开发测试环境,4 个 slave , 4 核 16G,本地机房虚拟机,共计消耗资源:16核,64G

如果统一了,那么降本增效不就出来了吗?

这个时候可能有人会说,小伙子是托儿,哈哈别急,让我慢慢道来。

Zadig 能解决企业数字化转型的什么难题?

现有主机环境问题?

很多企业在转型刚刚开始期间,或者说业务场景需要,会有部分业务存在容器部署。如果这个时候让你迁移,肯定不会一股脑的往 K8s 上塞,会慢慢的进行优化,这个时候 Zadig 支持主机环境的CI/CD,并且依靠 K8s 的弹性资源,能够根据需求创建 Job 执行构建部署任务,但是天下没有什么最好,只有更好,如果你微服务是多实例可能还真有点问题。那就是需要创建 2 个 Job。

图片

弥补 Jenkins Job 单服务 2 任务的情况(一个构建打包,一个部署,通过 Git 修改协调(ArgoCD))

如果客官您使用的是 ArgoCD 那么我相信你肯定是基于 GitLab 去做的,Jenkins 肯定是在正式环境有 2 个 Job,一个负责构建上传镜像,另一个就是拉取 Git 仓库进行服务的更改。这个时候会显得很冗余,那么 Zadig 提供良好的构建部署的划分,只需要你运行工作流的时候轻轻点击是否构建即可。

图片

提供完善的分支,PR 构建

好的 CI/CD 产品肯定是会对 Git PR 去做相关的适配的,Zadig 同样如此,能够在没有合并之前提前进行测试,无需完成合并。

图片

环境复制,开发测试,提升效能

在微服务横行的今天,很多时候指不定那天就同时接了好几个需求去做,那么这个时候开发需要环境,测试需要环境,怎么保证环境不冲突呢?那就是给他们一个新环境,但是提供新环境需要投入人力成本进去,有没有什么办法快速构建一套环境出来开发测试,后续不使用的时候销毁?

以前可能有点麻烦,但是随着业务容器化加上 K8s 的弹性扩缩容,这个就很好实现了,只需要找到相应的镜像,YAML 更新到新的 Namespace 就可以了,但是这还是不够优雅。

Zadig 提供环境的全量复制操作,一键就是一个基准环境,配合 Istio 进行子环境测试,直接解放双手,原地起飞。

Istio 子环境参考:自测联调环境 | Zadig 文档 [1]

图片

环境托管功能,一个工作流,一个构建发布所有托管环境

同项目,一直迭代,每个环节的服务都是一样的,为什么一定要区分开呢,通过相应的权限控制,一套构建,部署所有的服务不香吗?

图片

环境配置(Ingress,ConfigMap,Secret)

项目中的配置等也有着较好的管理空间,可以直接抽象成为一个变量,每个环节的配置不同,但是引用的配置名相同,就可以实现环境之间的平滑迁移,比如:

  • 上线中间件等连接依赖问题(ConfigMap  +  Service + Endpoint + CoreDNS)a. Service  ExternalNameb. Service None  +  Endpoints
  • 项目外部访问接口问题(Ingress)
  • 中间件连接账号密码问题(Secret + env)

图片

YAML,Dockerfile,Helm,服务构建模板管理

Zadig 有着良好的抽象能力,能够直接优化比较重复的动作,就比如 CI/CD 经常遇到的镜像 Dockerfile,YAML 等,通过抽象成为模板实现配置的统一和规范化管理。

图片

YAML 模板化

图片

Helm 模板化

这里偷懒没搞,其实我不太熟 Helm

Dockerfile 模板化

图片

构建配置模板化

我个人提供两种思路:

  • 服务模板化:所有的服务配置一次构建,后续上线新的服务,构建镜像的时候直接引用模板
  • 语言模板化:按照语言区分进行构建模板的抽象,构建模板主要信息如下:a. 构建产物所需要的应用,比如:Go,Java,NodeJSb. 构建产物所需要配置的命令

图片


Harbor 整合,配合正式环境的发布

可以通过对 Harbor 的整合,实现不同环境的发布,就比如:正式环境只需要托管,无需配置其他的构建信息,工作流执行构建上传到指定的 Harbor,正式环境不需要打包更新,直接更换镜像制品。

图片

版本管理(发版的 tag 交付物追踪)

每个服务的 tag 制品发版管理,出现问题可快速回退相应的版本。

图片

研发人员感知态

开发人员启动发版工作流后,执行成功会有相关的 IM 推送,例如常见的:

  • 企业微信
  • 钉钉
  • 飞书

部署逻辑这里,需要等待相关的探针就绪之后才会让工作流进入下一步。

拓展功能点

测试功能的原生接入

图片

代码扫描的支持

图片

自定义工作流,连接万物

如果前面还有没能够解决老板您的问题,可以尝试用自定义工作流,自己编码业务实现逻辑,然后通过自定义工作流实现。以下我就举一个 RDS 慢日志查询的例子。

图片

如果说,正式环境使用了云上的数据库,以阿里云为例,查询慢日志。规范起见,开发人员是没有阿里云账号的,运维人员有,但是运维人员一般都会基于 RDS 做相关的慢 SQL 监控,如果有那么就需要去检索慢 SQL 条目。

一般这个时候会不断找运维同学提供,但是如果说可以通过一条工作流实现,那么运维同学的负担就会降低,可以去做更多的事情。

图片

以上是我提供的一个思路,当然自定义工作流可以使用的场景可不仅仅是这样,还有更多的场景需要大家一起发掘,也希望大家能够不断的输入场景给 Zadig。

CI/CD 可观测性

CI/CD 可观测性也是很核心的一点,它可以让研发大佬清晰的知晓公司的研发效能如何,构建规律如何,测试情况如何。很多时候都能够从这里读出一些后续工作方向出来,Zadig 的这个概览也是我十分喜爱的一个点,毕竟是自己打下的江山不是吗?

图片

总结

IT 领域的演变,就是运维人员通过不断向上接手开发人员眼中“跟开发无关的杂活”,来不断为开发人员减负。开发人员在得到了解放后,可以将视角更多的聚焦在自己开发的业务系统上,释放出自己的创造力。但是运维人员也要不断的优化现有的基础设施架构,以及构建简单易用的平台化工程来给开发人员使用。平台化工程或许是未来 CI/CD 的一个趋势和演进方向吧。

参考链接

[1] https://docs.koderover.com/zadig/v1.15.0/env/self-test-env/

作者介绍

我叫唐启涛。目前就职于广州某公司,哈哈,刚刚入职没有多久,然后岗位应该算是运维还是运维开发,我也不知道。因为我工牌是运维开发,但是我企业微信又是运维,不过这个不重要,以下是我作为一个“Zadig 过来人”带来的一些使用分享、以及方案选型对比,希望对后续大家公司的 CI/CD 优化有所帮助。

责任编辑:武晓燕 来源: KodeRover
相关推荐

2012-05-15 09:55:37

AppWeb苹果

2012-05-15 09:07:27

App

2020-09-02 15:00:36

Linux命令软件

2023-09-14 13:23:42

Llama-2模型参数

2018-06-04 15:17:10

编程语言中文编程

2022-08-26 08:00:19

企业架构IT

2011-02-21 09:34:44

2011-03-09 17:20:43

SSL VPNVPN

2021-10-03 15:10:54

reduxsagaresolve

2022-02-16 10:23:46

边缘计算5G数据

2018-08-15 08:07:06

2018-06-08 15:27:59

云计算企业存储

2023-05-05 16:26:33

2017-08-31 17:43:06

云端迁移云计算

2017-07-11 09:06:16

企业SD-WAN广域网

2012-04-17 12:34:44

Platform

2012-02-17 16:37:20

云计算

2017-02-09 09:08:59

2016-10-17 23:20:41

2016-07-25 18:03:35

小企业大数据
点赞
收藏

51CTO技术栈公众号