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 集群的简单架构图。

网宿科技高查杀率通过赛可达测评 再获权威认可
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端口通信。
    网宿科技高查杀率通过赛可达测评 再获权威认可
  2. 更新jenkins service,增加服务端口,端口为上一步设置的端口
    网宿科技高查杀率通过赛可达测评 再获权威认可
  3. 点击系统管理 > 系统设置 > 新增一个云 > 选择 Kubernetes,填写 Kubernetes 和 Jenkins 配置信息。
    网宿科技高查杀率通过赛可达测评 再获权威认可

说明:

  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信息。
    网宿科技高查杀率通过赛可达测评 再获权威认可

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

  2. 添加Volumes,将宿主机上的目录挂载到容器中。
    网宿科技高查杀率通过赛可达测评 再获权威认可

  3. 添加ImagePullSecrets,允许从镜像仓库pull镜。
    网宿科技高查杀率通过赛可达测评 再获权威认可

说明:

  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用于构建。
    网宿科技高查杀率通过赛可达测评 再获权威认可
  2. 设置代码仓库,以SVN为例。
    网宿科技高查杀率通过赛可达测评 再获权威认可
  3. 设置变量,在job配置和构建日志中隐藏密码。
    网宿科技高查杀率通过赛可达测评 再获权威认可
  4. 代码编译。
    网宿科技高查杀率通过赛可达测评 再获权威认可
  5. 镜像构建与推送。
    登录镜像仓库,构建镜像,推送镜像到镜像仓库。
    网宿科技高查杀率通过赛可达测评 再获权威认可
  6. 服务部署。
    网宿科技高查杀率通过赛可达测评 再获权威认可

Jenkins pipeline job配置

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

  2. 选择Pipeline script,填入pipeline脚本。或者选择Pipeline script from SCM使用代码仓库里的pipeline。
    网宿科技高查杀率通过赛可达测评 再获权威认可

整体解决方案概述

网宿科技高查杀率通过赛可达测评 再获权威认可

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

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

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

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

  5. 部署应用到K8s集群。

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