目录
三、基于GitHub+Docker的持续交付/持续部署流水线(公有云)
3.1 基于GitHub+Docker的持续交付/持续部署操作流程示意图
3.2 GitHub+Docker持续交付/持续部署流水线技术实现原理
四、基于Jenkins+Docker+K8s的持续交付/持续部署流水线
4.1 Jenkins+Docker+K8s持续部署流程示意图
4.2 Jenkins+Docker+K8s持续部署流水线技术实现原理
一、概述
在实际工作中,CI/CD通常是在一起的。但是为了详细地向大家讲述其中涉及的技术要求将其拆分,分别向大家讲述持续交付、持续部署与持续集成的流程,方便大家理解自动化流程是如何从测试环境向生产环境变化过渡的,下面就从这些变化点,结合前文的CI流程,来介绍CD操作流程和使用场景。并介绍公有云基于GitHub+Docker的持续交付/持续部署流水线方案和私有云基于Jenkins+Docker+K8s的持续交付/持续部署流水线方案。
二、典型操作流程
2.1 CI/CD典型操作流
无论是中小型企业还是大型互联网企业,当企业DevSecOps能力完成CD全流程覆盖时,通常选择容器技术来构建,其典型操作流程和使用场景大体如下图所示:
2.2 CI/CD操作流程说明
上图操作流程主要步骤如下:
- 开发人员提交代码到GitHub代码仓库。
- 版本控制系统发起更新通知,触发CI自动构建动作。
- CI完成持续集成构建后,最终生成可用于部署的Docker镜像。
- 推送Docker镜像到容器注册表。
- CD同步K8s更新配置,触发部署服务。
- K8s集群管理通过容器注册表和配置信息,拉取Docker镜像。
- 完成容器实例创建,并运作。
在这些步骤中,读者可以看出步骤4)及之前是前文CI持续集成流程中所讲述的内容;步骤4)之后,是文本所讲述的内容。在整个流程中,黄金管道的流水线能力仍是流程的核心,通过流水线对流程的代码化,完成镜像打包到镜像管理、镜像注册、应用发布、应用更新等多个使用场景的自动化。使用者通过脚本或代码,依托流水线能力的调度,贯穿部署、更新流程,降低因手工操作带来的出错率,同时将重复性的、枯燥的工作代码化,将人力资源释放出来做更有价值的事,提升了整体的工作效率。
2.3 总结
在企业内部,构建持续交付、持续部署的平台能力时,和持续集成能力的构建一样,可以选择依托公有云厂商的能力来建设,也可以在企业内部私有云的基础上自行建设。在构建时选择哪种方式主要依赖于其企业的基础设施资产是什么形态的,如果是公有云上的资产为主,建议依托云厂商能力来构建。反之,则建议企业自建。在企业自建的过程中,目前主要是以容器化技术去构建应用级持续交付及持续部署能力。
三、基于GitHub+Docker的持续交付/持续部署流水线(公有云)
3.1 基于GitHub+Docker的持续交付/持续部署操作流程示意图
这里继续使用GitHub平台的GitHub Actions功能,在原有流程上添加持续交付/持续部署的流程,其中步骤变化点有:代码构建完成后添加容器镜像构建、镜像文件上传/注册、服务器部署等,最终形成的流程示意图如下图所示:
在这个方案里,CI/CD流水线使用GitHub Actions,容器镜像管理使用阿里云ACR,配置管理使用GitHub Actions,K8s集群环境管理使用阿里云ACK。下面就跟大家一起来看看整个流程的具体实现。
3.2 GitHub+Docker持续交付/持续部署流水线技术实现原理
3.2.1 添加Action模板
在前文中已经对GitHub Actions的使用和相关语法做了详细的介绍,当需要持续交付/持续部署能力时,只需要调整YAML文件,定义CD流程中的各个操作即可。编写此文件时,可以在GitHub手工添加Action模板,如下图所示:
3.2.2 构建Workflow流程
添加完毕后,将得到文件名为alibabacloud.yml的模板文件,如下图所示,再基于此定制化修改为自己想要的Workflow流程即可。
当以Java SpringBoot应用程序为例,仅需调整文件中的环境变量和代码构建部分内容即可,如下即为需要修改的:
当上述配置完成后,GitHub Actions被触发时,自动执行部署流程。大家可以在GitHub上对流程进行跟踪,也可以通过阿里云的ACK跟踪流程执行结果。
四、基于Jenkins+Docker+K8s的持续交付/持续部署流水线
除了使用GitHub+Docker构建持续交付/持续部署流水线外,私有化平台建设的场景下,使用Jenkins+Docker+K8s作为技术栈也是比较常见的。在这一小节中,将为大家讲述基于Jenkins+Docker+K8s的持续交付/持续部署流水线实现。
4.1 Jenkins+Docker+K8s持续部署流程示意图
当选择私有化方案替代上节的GitHub Actions时,在流程上并没有大的变化,变化更多的是在技术实现上,如代码管理使用GitLab、CI/CD调度使用Jenkins、镜像管理使用Harbor、容器集群管理使用K8s等。最终形成的流程示意图如下图所示:
4.2 Jenkins+Docker+K8s持续部署流水线技术实现原理
基于这个方案,一起来看看整个流程的具体技术实现。
4.2.1 安装KubeOperator
已经安装过K8s的读者,想必对K8s复杂的安装过程较为熟悉,如果对K8s不熟悉也没关系,它不是本节的重点。想学习的读者,推荐安装开源产品KubeOperator,如下图所示:
KubeOperator是飞致云开源的轻量级Kubernetes发行版,它的安装非常简单,在满足基本配置的基础上,执行一键安装脚本即可。同时KubeOperator采用Terraform自动创建虚机,采用Ansible作为自动化部署工具,这也是和本书基础设施安全相关章节的内容一致。
4.2.2 Jenkins配置
4.2.2.1 安装Jenkins K8s插件
使用Jenkins管理K8s,首先需要安装Jenkins K8s插件。登录Jenkins后,依次选择【系统管理】→【插件管理】,在搜索框中搜索kubernetes,选择Kubernetes,单击【安装】按钮,完成后重启Jenkins即可,如下图所示:
4.2.2.2 配置K8s凭据
等插件安装完成重启Jenkins后,接着需要配置K8s凭据。登录系统,依次选择【用户】→【凭据】→【全局凭据】,添加凭据类型,推荐选择X.509 Client Certificate,如下图所示:
这里需要注意的是以下3项内容,均来源于.kube/config文件,需要登录K8s集群查看后填写,如下:
- Client Key,即.kube/config文件中client-key值对应的文件。
- Client Certificate,即. kube/config文件中client-certificate值对应的文件,格式为crt或pem。
- Server CA Certificate,即. kube/config文件中certificate-authority值对应的文件,格式同上。
4.2.2.3 配置K8s集群连接
凭据配置完成后,接下来即可配置K8s集群连接了。依次选择【系统管理】→【管理节点与云】→【云配置】,开始配置集群,如下图所示:
这里,K8s集群相关配置内容比较多,单击上图中的第二个输入框【Kubernetes Cloud details...】,详细输入如下图所示内容:
图中的各输入项含义如下:
- Kubernetes地址,即Kubernetes服务地址,一般填写Master节点IP地址加端口。
- Kubernetes服务证书key,即前文提及的kube-ca.crt文件内容。
- Kubernetes命名空间,即前文提及的kube-ca.crt文件内容。
- JNLP Docker Registry,即自定义JNLP容器镜像地址,用于Jenkins工作节点容器化,如使用K8s插件,Jenkins通过Job动态生成工作节点(Pod),并在结束后销毁容器。
- 凭据,即前文创建的certificate凭据。
除了上述参数之外,还有Jenkins和Pod相关配置参数项,如下图所示:
除了Jenkins地址需要填写Jenkins Master地址之外,其他的值可以默认。配置完成后,即可以编写Jenkinsfile来操作Pipline。需要注意的是,Jenkins调用Pod管理的ServiceAccount需要先在K8s集群上创建好。
4.2.2.4 Jenkinsfile 文件编写
Jenkinsfile的编写比较简单,为了便于读者的理解,这里以Jenkinsfile伪码的形式展示其基本结构,其包含的操作步骤如下:
- 拉取代码。
- 编译+单元测试。
- 构建镜像文件。
- 上传镜像仓库。
- 发布到K8s集群。
此时,Jenkinsfile伪码内容如下所示(重点关注加粗部分的内容):
当K8s的发布环境区分测试环境、准生产环境、生产环境时,可以通过此方式完成不同环境的部署发布及回滚设置,以满足灰度发布、蓝绿发布、滚动发布等发布要求。
4.2.3 总结
通过上述内容的介绍,大家基本理解Jenkins+Docker+K8s持续部署流水线技术实现原理及其关键步骤,但Docker、K8s、Jenkins等技术细节涉及的内容比较繁杂,仍需要大家进一步学习其他资料,以便在此基础上,深入理解云原生技术与DevSecOps自动化实现的关系。后续有时间,我会再整理发布跟个部署构建相关教程文档吧,回头再说。。。。。。。
好了,本次内容就分享到这,欢迎大家关注《DevSecOps》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!