摘要:内部长期使用来管理代码。审核通过并且成功后,触发静态测试单元测试镜像构建镜像部署集成测试等测试通过后,创建一个从到的,由负责人进行审核。从图中我们可以看到,部分是一个单元测试,预发布部署,集成测试,,提交代码的循环过程。
UCloud内部长期使用 Gitlab 来管理代码。虽然Gitlab作为一套开源平台已很优秀,但我们对于其能为CI/CD提供的敏捷性并不十分满意,内部实践中的代码发布周期仍需按天计算。为此,我们打造了一个基于Kubernetes的内部容器服务平台(名为KUN),用于托管内部服务,并将Gitlab对接到KUN平台,从而借助Kubernetes的云原生优势,获得更好的CI/CD效果。这套系统运行一年内,Gitlab的Pipeline一共触发了994次,执行了约20000+次Job,在测试环境和正式环境一共进行了7000+次部署,即每天部署约20次。以下是该项目的一些实践经验。
CI即Continuous Integration(持续集成),指代码集成到主干之前必须通过自动化测试,只要有一个测试用例失败,就不能集成。目的是让产品快速迭代的同时还能保持高质量。
CD有两种意思:
两者的区别,在于是否自动部署到生产环境。对UCloud而言,肯定要以后者,也就是持续部署为目标。
我们采用的Gitlab分支管理模型在接入KUN平台前后并未发生变化,故简述如下:
下面以一个实例来介绍CI/CD开发流程。StepFlow是UCloud新近推出的一款可视化工作流产品,通过StepFlow用户可以灵活便捷地定义自己的工作流,快速实现业务功能。整套StepFlow系统由多个模块组成,并全部部署在Kubernetes集群上。
在实例中,我们需要开发其中名为optimize-allocate 的一个feature:
则开发流程为:
1. 首先,在 Gitlab 上创建了编号为80的Issue,跟进这个optimize-allocate的feature;
2. 从dev分支创建一个新分支,名为feature/80-optimize-allocate,在该分支上进行开发;
3. 在feature/80-optimize-allocate上开发完成,进行commit,此时会触发静态测试、单元测试、Review等Pipeline Job;
4. 测试通过后,创建一个从feature/80-optimize-allocate到dev的merge request,由负责人进行审核。审核通过并且merge成功后,触发静态测试、单元测试、镜像构建、镜像部署、集成测试等Pipeline Job;
5. 测试通过后,创建一个从dev到master的mergerequest,由负责人进行审核。审核通过并且merge成功后,负责人创建tag v1.1.1,然后触发静态测试、单元测试、镜像构建、镜像部署、集成测试等Pipeline Job;
注:版本号tag是有命令规范的,v{x}.{y}.{z}代表着v{主版本}.{次版本}.{小修订版本}
Gitlab 8.0版本以后,默认集成并开启了Gitlab-CI,是可以提供一定CI能力的,我们以此搭建持续集成的流水线,其中有Pipeline、Stage和Job三个层级需要设计。
Pipeline
Gitlab 会检测一个项目的根目录下的 .Gitlab-CI.yml 文件,用户可在该文件中定义 CI/CD Pipeline,一个 Pipeline 代表了 CI/CD 的整个过程。代码发生变化时(比如 push、tag、merge等),将触发一个 Pipeline 的运行。
Stage
一个 Pipeline 包含多个 Stage,比如“静态检查”、“单元测试”、“构建镜像”等等,这些 Stage 一个接一个顺序执行。
Job
每一个 Stage 可以包含多个 Job,同一个 Stage 的所有 Job 同时执行。每个Job需指定若干个重要属性如image, stage, tags, service等。
在StepFlow例子中,针对要开发的feature,其Pipeline设计如下,包括静态检查、单元测试和最后的两个手动 Code Review:
当其需要发布到公共测试环境(类似预发布环境),则设计另一个Pipeline,包括:执行完整的静态检查, 单元测试, 预发布镜像 build, 预发布部署, 预发布集成测试。
而合并 master 之后触发 prod 环境的另一个 Pipeline,包括静态检查、生产环境镜像的 build、生产环节的部署、最后集成测试:
我们将Gitlab Runner和Gitlab-CI配合使用,负责具体 Job 的运行。Gitlab Runner Kubernetes Executor 提供了在 Kubernetes 中运行 Job 的能力。运行原理如下:
为了使用 CI/CD 将代码变成最终运行在 Kubernetes 中的服务,必不可少的一步就是容器镜像的构建。由于CI Job本身就是以容器的形式运行的,所以需要在容器中构建出 Docker 镜像。
已有的方法,包括把 Host 上的 Docker Socket 挂载到 Pod 里面去(Docker Socket Mounting),或者是在 Pod 再启动一个 Docker Daemon(Docker-in-Docker),然而,前者有安全风险,后者需要 Pod 具备特权,两种方法都不适合。
Kaniko(https://github.com/GoogleContainerTools/kaniko)是 Google开源的一个工具,可以实现在 docker 容器里面制作 docker 镜像,并且不需要任何特权。
但是原生的 Kaniko 镜像由于缺少一些必要的工具,无法和Gitlab CI集成。为此我们修改了Kaniko镜像,添加了整个busybox工具包进去,以支持其作为一个CI Job来运行。然后就可以把Gitlab往内部容器服务平台KUN对接了。代码示例如下:
# use Docker:$ cd /path/to/project && docker build -t uhub.service.ucloud.cn/myimage:0.0.1 -f deploy/Dockerfile && docker push uhub.service.ucloud.cn/myimage:0.0.1# use Kaniko:$ /kaniko/executor -c /path/to/project -f deploy/Dockerfile -d uhub.service.ucloud.cn/myimage:0.0.1
KUN中CI/CD的整个流程如上图所示。从图中我们可以看到,CI部分是一个单元测试,预发布部署,集成测试,Debug,提交代码的循环过程。在CI过程中预发布的部署是通过CD系统来实现的,CI其中一个步骤是生成部署文件,然后按照项目、资源集、版本等参数提交到CD后端系统。CD系统提供了页面入口,当部署文件推送到CD系统后,用户可以在页面查找对应的部署文件。如果需要部署,在页面点击“部署”按钮即可实现部署。
YAML编辑器
为方便用户使用,我们为KUN开发了专门的YAML编辑器,相比用普通的文本编辑器写YAML,可以提供智能模板补全、搜索替换等能力。
上图展示了一个使用案例,目前页面编辑器支持的功能有:
部署系统
为了在Gitlab CI Job中把服务部署到Kubernetes上,我们研发了部署系统。在CI Pipeline的最后一步,用户生成一个YAML文件,定义需要部署到Kubernetes上的资源,然后使用部署系统提供的一个工具镜像,该镜像会调用部署系统的API,将YAML提交给部署系统。接下来部署系统将使用用户的权限,调用Kubernetes API实现真正的部署。
目前部署系统主要包含两部分功能:
1. 资源集管理:
2. 部署任务
当完成上述所有工作,Gitlab能很好嵌入KUN平台,运行在Kubernetes上的各模块就可像齿轮一样有序运转,从而获得CI/CD上的良好效果。
前面提到的StepFlow项目,从一开始就实施了这样一套 CI/CD,效率获得了很大提升,每个编译Job耗时约3分钟,其他Job耗时在1分钟以内。
CI/CD是提供高质量互联网服务必不可少的一环。Gitlab和Kubernetes都是非常优秀的开源软件,在此基础上,我们根据自己的实际情况,结合两者打造了一套高效的CI/CD平台,努力提升研发效率,为用户提供更优质的服务。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/40616.html
摘要:宋体自年被开源以来,很快便成为了容器编排领域的标准。宋体年月,乐心医疗的第一个生产用集群正式上线。所以于年推出后,乐心医疗的运维团队在开会讨论之后一致决定尽快迁移到。Kubernetes 自 2014 年被 Google 开源以来,很快便成为了容器编排领域的标准。因其支持自动化部署、大规模可伸缩和容器化管理等天然优势,已经被广泛接纳。但由于 Kubernetes 本身的复杂性,也让很多企业的...
摘要:扩展性好当集群的资源严重不足而导致排队等待时,可以很容易的添加一个到集群中,从而实现扩展。用法,选择尽可能使用这个节点镜像,填写,这个容器镜像是我们的运行环境。更新文件,这里我们只是将中的镜像更换成最新构建出的镜像。基于Jenkins的CI/CD实践[TOC]一、概要提到K8S环境下的CI/CD,可以使用的工具有很多,比如Jenkins、Gitlab CI、新兴的drone等,考虑到大多公司...
摘要:从开始,部署管理的集群时,默认情况下会启用授权群集端点功能。我们将首先在中创建一个新项目,该项目将使用功能与我们的集群集成。完成后单击创建项目。这不仅意味着已被设为默认值,还能够触发构建。例如,负载均衡选项卡显示已部署的以及创建的主机名。 介 绍 在这篇文章中,我们将介绍如何将GitLab的Auto DevOps功能与Rancher管理的Kubernetes集群连接起来,利用Ranch...
摘要:容器云将支持应用的一键式部署交付,提供负载均衡,私有域名绑定,性能监控等应用生命周期管理服务。本容器云平台,对接持续集成发布系统。 前言 在移动互联网时代,新的技术需要新技术支持环境、新的软件交付流程和IT架构,从而实现架构平台化,交付持续化,业务服务化。容器将成为新一代应用的标准交付件,容器云将帮助企业用户构建研发流程和云平台基础设施。缩短应用向云端交付的周期,降低运营门槛。加速向互...
摘要:容器云将支持应用的一键式部署交付,提供负载均衡,私有域名绑定,性能监控等应用生命周期管理服务。本容器云平台,对接持续集成发布系统。 前言 在移动互联网时代,新的技术需要新技术支持环境、新的软件交付流程和IT架构,从而实现架构平台化,交付持续化,业务服务化。容器将成为新一代应用的标准交付件,容器云将帮助企业用户构建研发流程和云平台基础设施。缩短应用向云端交付的周期,降低运营门槛。加速向互...
阅读 2156·2019-08-30 15:54
阅读 1905·2019-08-30 13:49
阅读 614·2019-08-29 18:44
阅读 789·2019-08-29 18:39
阅读 1059·2019-08-29 15:40
阅读 1483·2019-08-29 12:56
阅读 3082·2019-08-26 11:39
阅读 3030·2019-08-26 11:37