大禹流水线Jenkins多集群支持

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 大禹流水线Jenkins多集群支持

背景

关于大禹

  大禹是交付场景下的All-in-One生产力平台。基于GTS交付过程中的实际问题,大禹提供了面向2B&2G交付场景的生产力工具,让原厂小二、生态伙伴、客户基于同一平台项目协作。大禹包括项目、协同、研运、质量等板块。
  研运质量板块已具备完整的DevOps功能,提供架构设计、开发、测试、部署、运维等能力,赋能项目中的业务应用研发,支撑定开类项目的交付。

遇到的问题

  大禹研运板块主要服务对象是阿里云GTS交付项目,大部分项目的代码及二方包托管在大禹或公共云上。还有部分在弹内开发的项目代码托管在弹内GitLab、构建时依赖弹内的maven仓库,这类项目也有通过大禹构建及部署的诉求。大禹部署在阿里云售卖区不能访问弹内网络,并且由于安全原因不能通过打通网络来访问。
  除上述网络原因,运维上也有不便,大禹流水线是通过Jenkins来运行,实现了代码构建、质量扫描、镜像构建、部署等能力。Jekins维护、升级时需要重启会影响流水线运行,因此只能提前在平台发公告等到凌晨一点左右做维护。

网络现状

image.png

上图中涉及到4个网络区域:

  • 右边是阿里云独立云账号(售卖区)VPC:部署大禹应用的K8S集群在此区域;
  • 中上是宙斯售卖区VPC:大禹Jenkins部署在此网络的K8S集群,通过CEN与独立云账号VPC打通。
  • 中下是公司弹内网络不能被Jenkins访问;
  • 左边是公网:大禹流水线除了支持大禹平台搭建的Git仓库、Docker镜像仓库也支持使用外部的代码及镜像仓库,另外也会使用到用户或公网上的Maven、NPM仓库等资源;

方案调研

  最初想到的是打通网络使现有Jenkins可以访问弹内代码及二方库仓库,但与安全团队讨论得出的结论是不能。于是想到在弹内生产网络部署一套Jenkins。弹内Jenkins通过公网访问大禹代码、镜像、二方库仓库,大禹构建中心与Jenkins的访问通过AnyTunnel打通。与安全同学对方案时了解到OXS区是阿里云的生产环境,阿里云现有的应用部分已经在从弹内生产网络向OXS区迁移,因此大禹Jenkins也部署到OXS区。
  网络区域确定为OXS,在OXS区也有多种资源可选择:ECS或K8S,其中K8S又有独立的K8S集群及ASK(Serverless K8S)。为了减少运维成本、方便扩缩容最终选择了ASK。

技术方案

  总体上会部署三套Jenkins集群:Jenkins-1(即在宙斯K8S中已存在的Jenkins)、Jenkins-2、Jenkins-oxs。
  Jenkins-2部署到哪个K8S集群是个问题,若单独申请其配置规格需要和Jenkins-1一样。作为Backup一般情况下是空闲并不使用,这样就造成了资源浪费。因此选择部署在Jenkins-1的K8S集群中,通过命名空间隔离,这样就可以共享主机资源。

集群规划

image.png

整体架构

image.png

技术实现

流水线运行流程

流水线运行流程简化如下图:

  1. 准备运行参数如应用git地址、git账号信息、镜像地址、镜像仓库账号信息、构建参数等;
  2. 计算此次流水线在哪个Jenkins集群上运行,根据配置及默认规则来计算;
  3. 查询出代码仓库及镜像仓库账号;
  4. 将代码及镜像仓库账号写入到Jenkins中(Jenkins自己有密钥管理模块,使用到的密钥需先写入到密钥管理模块中然后在流水线中通过ID引用);
  5. 创建Jenkins Job(存在则重用不存在则创建)。
  6. 启动Jenkins Job运行流水线(git地址、账号ID等作为参数)。
    image.png

集群路由

  Jenkins集群从原来一套变成了多套,第一个要解决的问题就是使用哪个Jenkins集群运行流水线。首先系统会配置一个Jenkins集群作为默认,通常是Jenkins-1。其次用户可以按应用设置流水线运行的集群,未设置的应用使用默认集群。
  通常情况下默认集群为Jenkins-1,在需要升级维护时先把Jenkins-2升级到最新版,然后把把Jenkins-2设置成默认,Jenkins-1升级维护完成后再把默认集群改成Jenkins-1,实现了用户无感知维护。

凭证服务

  当应用中使用外部代码或镜像仓库时,需要用户填写账号、密码或公私钥,这些数据不能直接存明文,原来单Jenkins集群时直接存到Jenkins的凭证管理模块中,现在有多个Jenkins集群于是把这些数据改为存到数据库,运行流水线时再同步到当前运行流水线的Jenkins集群中。
  在系统中新增了凭证服务CredentialService用于存账号数据,考虑到以后可能要存非账号加密数据因此加了一层KeyVaultService,KeyVaultService提供按标识(Code)加密并存储及读取解密后数据的功能,在公有环境可使用阿里云的KMS云产品,考虑到大禹有私有化部署的需求,在私有化部署环境不一定有KMS于是抽象出了KeyVaultCryptoProvider,并提供两个实现KmsKeyVaultCryptoProvider及AesKeyVaultCryptoProvider,在没有KMS云产品的场景下使用Aes提供加密,通过配置来选择使用哪种加密方式。
image.png

镜像构建

  Jenkins部署在K8S集群中,Jenkins-1是把宿主机中的Docker Enginge服务/etc/run/docker.sock挂载到容器中,在容器中执行Docker命令时直接使用宿主机中的Docker Engine。但在ASK集群中宿主机没有Docker Engine而是使用的Containerd,也找ASK同学咨询了得到的结果是不能安装Docker建议使用BuildKit,BuildKit的方案之前也有调研过,由于流水线中镜像构建使用了Jenkins插件,Jenkins Docker插件不支持BuildKit,要使用BuildKit需自定义镜像构建过程有一些改造工作量。
  经调研可以启用特权模式在POD中启动Container来运行Docker Eninge。原来构建的POD就一个Jenkins Slave容器,现以Sidecar的方式添加了Docker Engine容器,此容器以特权模式来运行Docker Engine,并通过将两个容器/var/run都挂载到相同EmptyDir卷的方式来将Docker Engine共享给Jenins Slave容器使用。
image.png

安全加固

  Jenkins-1、Jenkins-2集群所有应用都可以使用,Jenkins-oxs集群是弹内开发的应用专用,因此为Jenkins集群添加了category字段(值为公共、专属),对于专属集群需要在AllowList表中添加白名单。

image.png

Jenkins-oxs部署在OXS区为了减少风险也做了一些安全加固:

  1. 集群category为专属,因此需要在OXS区上运行流水线的应用需要申请白名单,这需要平台管理员操作;
  2. 只有应用使用的是阿里弹内Git仓库才能在Jenkins-oxs上运行流水线;
  3. 在启动在Jenkins-oxs上运行流水线的操作人必须有阿里工号,其它ISV用户不能启动。

总结

  此功能上线后支撑了用户弹内应用代码的构建发布;也有部分弹内开发的大禹平台应用通过大禹流水线进行了构建发布,实现了自闭环。另外此功能上线后已经实现多次默认集群的切换及维护,在不影响用户使用流水线的情况下实现了Jenkins及其插件的更新。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
jenkins 持续交付 开发工具
jenkins学习笔记之一:流水线基础语法
jenkins学习笔记之一:流水线基础语法
|
3月前
|
Kubernetes jenkins 持续交付
在K8S中,Jenkins如何集成K8S集群?
在K8S中,Jenkins如何集成K8S集群?
|
3月前
|
jenkins Devops Java
jenkins学习笔记之十:配置Gitlab提交流水线
jenkins学习笔记之十:配置Gitlab提交流水线
|
3月前
|
jenkins 持续交付 Windows
Jenkins Pipeline 多分支流水线 Input length = 1
Jenkins Pipeline 多分支流水线 Input length = 1
32 0
|
3月前
|
运维 jenkins Devops
Jenkins 多分支流水线(SVN)
Jenkins 多分支流水线(SVN)
67 0
|
3月前
|
jenkins 持续交付
Jenkins Pipeline 流水线 - Parameters 参数化构建
Jenkins Pipeline 流水线 - Parameters 参数化构建
108 0
|
3月前
|
jenkins 持续交付 网络安全
Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
51 0
|
3月前
|
Kubernetes jenkins 网络安全
Jenkins Pipeline 流水线 - 使用代理节点,Remote SSH 对 K8S 进行升级
Jenkins Pipeline 流水线 - 使用代理节点,Remote SSH 对 K8S 进行升级
40 0
|
3月前
|
弹性计算 运维 Serverless
项目管理和持续集成系统搭建问题之云效流水线支持阿里云产品的企业用户如何解决
项目管理和持续集成系统搭建问题之云效流水线支持阿里云产品的企业用户如何解决
65 1
项目管理和持续集成系统搭建问题之云效流水线支持阿里云产品的企业用户如何解决
|
3月前
|
敏捷开发 Java 测试技术
阿里云云效产品使用合集之如何下载流水线构建过程中生成的jar
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。