CDN加速

文档中心 容器服务 最佳实践 CI/CD与容器服务的DevOps实践

CI/CD与容器服务的DevOps实践

更新时间:2020-07-01 19:06:21

CI/CD与容器服务的DevOps实践

CI/CD背景介绍

持续构建与发布是DevOps中必不可少的一个环节,目前大多公司都采用 Jenkins 集群来搭建CI/CD 流程,传统的 Jenkins Slave 一主多从方式会存在一些问题,比如:主 Master 发生单点故障时,整个流程都不可用了;每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲;资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态;造成资源浪费,当 Slave 处于空闲状态时,也不会完全释放掉资源。

因此,我们渴望一种更高效更可靠的方式来完成这个 CI/CD 流程,而 Docker 虚拟化容器技术能很好的解决这个问题,下图是基于Kubernetes 搭建 Jenkins 集群的简单架构图。

网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
Jenkins Master 和 Jenkins Slave 以 Pod的形式运行在 Kubernetes 集群的节点上,Master运行在其中一个节点,并且将其配置数据存储到NFS上,Slave 运行在各个节点上,Slave并不是一直处于运行状态,它会按照需求动态的创建并自动删除。

jenkins工作流程大致为:当 Jenkins Master 接受到 Build 请求时,会根据配置的 Label 动态创建一个运行在Pod中的 Jenkins Slave并注册到Master上,当运行完Job后,这个 Slave 会被注销并且Pod也会自动删除。

本文档将演示一个java项目,从构建环境准备、代码编译、镜像构建、部署服务到Kubernetes集群的流程,展示DevOps案例。

配置Kubernetes集群信息

  1. 点击系统管理 > 全局安全配置 设置代理,如图指定端口为50000,jenkins master和slave之间通过50000端口通信。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
  2. 更新jenkins service,增加服务端口,端口为上一步设置的端口
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
  3. 点击系统管理 > 系统设置 > 新增一个云 > 选择 Kubernetes,填写 Kubernetes 和 Jenkins 配置信息。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业

说明:

  1. Name 处默认为 kubernetes,也可以修改为其他名称。
  2. Kubernetes URL 处我填写了 https://kubernetes.default 这里我填写了 Kubernetes Service 对应的 DNS 记录,或者直接填写外部 Kubernetes 的地址 https://:
  3. Jenkins URL 处填写 http://jenkins.jenkins:8080,要指定为 8080 端口,因为我们设置暴露 8080 端口。

配置完毕,可以点击 Test Connection 按钮测试是否能够连接的到 Kubernetes,如果显示 Connection test successful 则表示连接成功,配置没有问题。

  1. freestyle类型的job需要设置Kubernetes Pod Template,在job配置时可选择下图添加的Pod Labels,从而使用准备好的镜像启动一个Pod注册为Jenkins slave。Pipeline类型的job需要在pipeline脚本中添加Jenkins slave信息。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业

    说明:Docker image是准备好构建环境的镜像

  2. 添加Volumes,将宿主机上的目录挂载到容器中。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业

  3. 添加ImagePullSecrets,允许从镜像仓库pull镜。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业

说明:

  1. harbor-admin拥有从镜像仓库拉取镜像的权限。
  2. Jenkins-admin拥有发布应用到Kubernetes集群的权限。
  3. Node Selector选择在哪个node上启动Jenkins slave。

Jenkins freestyle job配置

  1. 创建一个freestyle类型job。
    在job中配置标签,标签设置成与Pod Template中的Labels一致,点击构建会使用准备好的镜像启动一个Pod,注册为Jenkins slave用于构建。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
  2. 设置代码仓库,以SVN为例。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
  3. 设置变量,在job配置和构建日志中隐藏密码。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
  4. 代码编译。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
  5. 镜像构建与推送。
    登录镜像仓库,构建镜像,推送镜像到镜像仓库。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业
  6. 服务部署。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业

Jenkins pipeline job配置

  1. 新建一个流水线(pipeline)类型的job。

  2. 选择Pipeline script,填入pipeline脚本。或者选择Pipeline script from SCM使用代码仓库里的pipeline。
    网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业

整体解决方案概述

网宿互联网安全报告之Web篇:超10亿攻击“盯上”这个与你我息息相关的行业

  1. 开发人员更新代码到svn、git等代码仓库。

  2. 点击构建任务,后台启动一个准备好编译环境的容器进行编译构建。

  3. 可通过shell添加测试步骤,测试通过后继续下一步。

  4. 通过用户提供的Dockerfile文件构建镜像,并上传到镜像仓库。

  5. 部署应用到K8s集群。

  6. 可将构建结果发送给相关人员。