openstack+docker设计与实现CI/CD(持续集成/持续交付)

来源:互联网 发布:网络应急预案流程图 编辑:程序博客网 时间:2024/06/05 23:58

老规矩我们先了解下相关概念:

本次主要说明下基于docker容器技术的openstack研发、测试、运维及其相关的CI/CD、devops等活动。

IaaS云和容器云不是可有可无、相互竞争的关系,而是相互弥补彼此缺陷的关系。容器改变了应用部署和管理的模式,我们都知道IaaS云通过提供基本的计算、存储和网络来运行VM,在IaaS(基础设施即服务)之上,还有PaaS(平台即服务)、SaaS(软件即服务)、CaaS(容器即服务)。openstack作为一个IaaS云的基础设施管理平台,为用户提供了创建VM和其他资源的服务,至于具体怎么使用这些虚拟机、怎么运行业务应用,如Hadoop大数据、Docker微服务、CI/CD工具链等,用户可以按需使用。

docker的生命周期,一般分为:

  1. Build——使用dockerfile文件或手动方式生成镜像
  2. Push——将构建好的镜像上传到镜像仓库中
  3. Pull——从镜像仓库中拉取镜像到使用环境中
  4. Run——启动镜像为容器服务
  5. Stop/Remove——停止或删除容器、镜像

docker适用于CI/CD的场景主要是基于:

  • docker容器是把应用程序和环境打包在一起,所以是一次构建,处处运行。docker最大的好处就是标准化了应用交付,只要系统能运行docker,就能无差别的运行应用。
    • docker镜像统一封装了软件服务及其依赖环境,可以让镜像成为一个标准的软件交付物。
    • 容器比虚拟机运行效率更高,在开发测试工作日益繁重的CI/CD环境中,Job(定时执行)任务运行的速度是至关重要的。
    • 通过容器云平台如kubernetes,可以方便的实施集群和容器管理。openstack和docker集成现状:
    • OK,首先docker是一种集namespace、cgroups等技术于一体的容器技术,可以将应用和环境等进行打包。形成一个独立且隔离的环境,让每个应用彼此相互隔离,并在同一台主机上同时运行多个应用,进行更细粒度的资源管理。

开源软件项目介绍:

  1. kubernetes:

这是谷歌开发的一款开源的docker管理工具,用于跨主机集群部署容器。kubernetes还提供了让容器彼此互通的方法,不需要手动开启网络端口或执行其他操作。提出了两个概念:

pods:每个pod都是一个容器集合并部署在同一台主机上,共享IP和存储空间,比如讲apache、Redis之类的应用分为一个容器集合。
labels:提供服务标签,方便pod容器之间的协调作用。

2.docker compose:

docker compute是容器编排工具,让用户可以自定义容器的镜像、容器之间的依赖关系等。定义好这些信息后,只需要一条命令就可以按照顺序启动容器,然后整个应用就部署好了。

3、docker machine:

docker machine是一个便捷的容器创建工具,即从0到1地安装docker,极大地简化了安装过程。使用docker-machine create命令,参数-d指定虚拟化的驱动,即可在相应的平台上创建docker。

4、docker swarm:

docker swarm是docker的集群管理工具,能够通过master/slave的方式管理跨主机的docker,为docker集群化部署提供了非常好的支持。

5、docker datacenter:

docker datacenter是docker的自动化集群管理工具,并非第三方工具,它其实是一个基于docker的管理平台。

6、apache mesos:

mesos的名气比较大,基于它可以做很好的扩展,开发个性化的docker集群管理工具。

7、marathon:

marathon是一个与mesos结合在一起的docker集群管理工具,支持在mesos之外调度容器。

8、panamax:

因为docker占用资源少,在单机服务器上部署成百上千个容器也是可能的,panamax提供了人性化的web管理界面用来安装软件,让部署变的更简单。并且,panamax还提供了丰富的容器模板,让在线创建服务成为可能,所有操作都可以在web界面上完成。

9、tutum:

tutum提供了一套非常友好的dashboard界面,支持创建docker容器的应用。

10、harbor:

使用harbor可以管理大规模的docker镜像,以及基于同步复制功能的HA主备高可用性、细粒度的角色权限和项目管理。除此之外,还有一些docker性能监控工具,如docker status、CAdvisor、Scoun、datadog以及sensu等。

11、openstack集成docker项目:

openstack社区为了集成docker做了很多努力,如开发了nova+docker driver、heat+docker driver等模块,但都存在诸多不足。为了更好地与docker集成,社区陆续开发了几个新项目,如magnum、Murano、solum和kolla等。

目前,kolla是openstack集成docker最火热的一个项目,将大部分的openstack服务docker容器化,便于安装部署升级。其他的如magnum,则提供了CaaS,solum、Murano和docker有些关系。但solum更偏重于CI/CD,可以理解为一个应用软件的持续集成/持续交付环境,Murano是一个app store,solum可以将开发的应用发布到Murano中。

基于openstack+docker设计CI/CD:

目前,在docker容器中部署和运行openstack云计算服务,以成为主流趋势之一。设计与实现基于openstack云计算+docker容器技术的CI/CD服务,其核心是在openstack IaaS云计算平台上创建虚拟机,实现基于openstack研发测试业务背景下的CI/CD服务。

这里涉及到三个重要部分:
一是基于原生openstack研发的云计算产品,以及基于openstack基础设施平台构建的CI/CD应用
二是包括诸如Jenkins、citlab、gerrit、harbor等系统在内的CI/CD应用
三是将openstack每个服务容器化,并使用kolla方式部署。

注:
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使持续集成变成可能经济界;

基于云服务的CI/CD服务,可以实现弹性伸缩和横向扩展,首先在物理服务器上搭建好openstack IaaS云平台,以及创建数台可用的虚拟机等,后续使用。

其他:
在生产环境中,通过创建并挂载云硬盘到虚拟机中运行的服务数据目录下,或者通过rsync同步备份数据的方式,以保证数据的高可用和完整性。对于CI/CD系统的HA等,可以通过计算节点HA或虚拟机HA的方式实现。

另外在实际的企业研发测试和CI/CD环境下,建议使用三个harbor系统并相互关联,一个是开发系统,用于存放和管理平时开发人员上传的开发docker镜像,该系统允许存放同一个镜像的不同副本(tag);一个是测试系统,用于存放经过了CI/CD流程验证测试的docker镜像;一个是生产系统,用于存放发布的docker镜像,其产出物便是用于交付的最终产品。

基于docker的软件持续交付

从软件开发,到持续集成和持续交付,再到生产环境上的微服务应用等。除了docker技术本身发展以外,还不断涌现出一系类与容器相关的生态应用,包括容器编排、高可用性、运维监控和日志收集等各个方面。在基于容器的持续交付实现当中,以镜像为内容传递的单元,通过CI(持续集成)的测试以及验证,完成镜像从开发、测试到可发布的状态转变和软件的交付流程。

开发人员:编写和提交代码,从提交代码起,这一过程均自动化完成,完成所属范围的工作内容,负责输出待测试的镜像。
测试人员:编写测试用例,手动或自动部署环境,执行各种测试,完成所属范围的工作内容,负责输出预发布的镜像。
运维人员:将预发布的镜像部署到预生产环境中,执行验收测试,完成所属范围的工作内容,负责生产环境的部署和运维。

集成和持续交付:

建立持续集成和持续交付流水线的核心问题是如何定义企业的软件交付价值流动。基于容器的CI/CD流水线的设计应该遵循以下一些基本原则:

可视化:流水线的运行和停止、成功和失败应对所有人直观可见,以掌握全局变化。
信息反馈:流水线应通过邮件等多种手段,及时将失败信息传达给相关团队成员。
可控制:从开发到生产发布总有一些环节需要人手动验证,比如回归测试、环境配置等,也就需要流水线在某些环节可以暂停,等待手动继续。
门禁:流水线中任何一个环节失败,都应该让流水线停下来,并通知团队解决,比如自动化测试不通过、代码或镜像构建失败等。

基于openstack+docker的应用部署

  • docker产生应用镜像有两种方法:一种是启动一个基础镜像(比如基于CentOS的linux镜像),然后在容器中执行各种命令来安装相应的软件包,进行配置后,在通过docker
    commit命令把已经更新的容器保存为相应的镜像;另一种方法则是通过编写dockerfile文件,然后使用docker
    build命令自动化构建相应的镜像。

  • 相比第一种手工方式,通过dockerfile文件的方式可以更好的维护镜像,并将dockerfile提交到版本库进行管理。并且通过CI/CD系统的自动化build、push、pull、run等工作流,可以与研发测试业务更紧密地结合起来。维护的不再是一条条零散的命令,而是一个文件集合。这样,dockerfile文件便如同代码一样,做到随时维护修改和协作开发。

将所有的源码存放在私有仓库GitLab中,docker镜像则托管在私有Registry中,并使用诸如ansible之类的自动化工具将容器部署到服务器环境中,这些都是一个完全自动化的过程。docker典型应用场景:

1、开发:开发人员使用同一个docker镜像,同时修改源码都挂载到本地磁盘上,然后映射到容器中。不在为因为环境的不同而造成不同的程序行为而伤透脑筋,同时新人到岗时也能迅速建立起开发、编译环境。

2、PaaS云服务:docker可以支持命令行封装与编程,通过自动加载与服务自发现,可以很方便地将封装于docker镜像中的服务扩展成云服务,根据业务请求的规模随时增加或减少容器的运行数量,实现弹性伸缩和横向扩展。

基于openstack+docker的CI/CD流程设计

其核心组件包括:    Jenkins持续集成系统,可参考:http://blog.csdn.net/wangmuming/article/details/22924815    GitLab代码仓库管理系统,可参考:http://www.ywlinux.com/archives/166    Harbor私有镜像仓库管理系统,可参考:https://www.dwhd.org/20161023_110618.html    Gerrit代码评审系统,可参考:http://blog.csdn.net/u011130578/article/details/46408243流程步骤简要:    1、开发者准备好一个单节点环境,将开发工具链接到远程开发目录,并使用Git将代码提交到代码评审系统Grrrit中,目的是通过协作发现一些明显的问题,减少BUG带到软件中的概率。    2、当Jenkins持续集成系统检测到Gerrit系统的代码提交事件后,触发相关的Job任务,自动化执行代码编译、打包、构建、部署和测试等工作流。相应地,会执行如下任务:    执行源码编译、打包,如RPM、WAR包等。    构建docker镜像    部署环境,如使用Kolla自动化部署openstack。    自动化运行测试,如单元测试、集成测试等。测试结果两种,一种测试失败,流程返回;一种是测试成功,流程继续。    3、根据测试结果和其他信息综合决定此次开发人员提交的代码是否合并,这样保证只有通过了测试和审核的代码才能合并到GitLab仓库中。    4、GitLab的Webhooks会触发Jenkins系统中的两个构建任务,一个是源码编译、打包任务;一个是源码打包后的docker镜像构建任务。docker镜像构建后,Jenkins系统会自动将镜像推送到私有Registry仓库中。

很多企业内部都有一套标准化规范,在这套规范中定义了开发所使用的语言、框架、软件包版本及依赖环境等,这样做可以统一开发环境并解决因差异化带来的其他问题。基于此,根据不同的服务进行逻辑或物理上的分组,把docker镜像分为三层:基础镜像层、服务镜像层和应用镜像层。上层镜像的构建依赖于下层镜像,越下层的镜像越稳定,也越不会经常更换。

基础镜像层:负责安装最基本的、所有镜像都需要的软件及环境,例如操作系统等。服务镜像层:负责构建符合企业标准化规范的镜像,这一层很想SaaS,例如python环境、某个项目的公共软件包等。应用镜像层:负责部署和运行应用程序,这个阶段是CI的产出物,例如rpm包、python源文件等。

构建镜像仓库管理系统(Harbor):

Harbor的每个组件都是以Docker容器的方式运行的,并使用docker compose进行自动化部署。harbor使用Go语言开发,web框架采用beego。harbor系统由六个容器组成,即:

proxy:提供反向代理服务,用户的不同请求由proxy分发到后端的UI或者pegistry,其使用Nginx镜像。jobservice:harbor项目的核心组件,主要提供权限管理、审计、管理界面UI、token service,以及可供其他系统调用的API等功能。mysql:提供数据持久化服务,使用的是mysql镜像。UI:提供web前段操作管理页面。registry:docker官方开源的registry镜像,主要提供镜像的存储和分发功能。log collector:负责收集系统运行和用户操作的日志。

安装harbor:

1、安装epel源:

yum install -y epel-release

2、加入docker源:

tee /etc/yum.repo.d/Docker.repo << 'EOF'

3、安装版本为1.11的docker-engine:

yum install -y docker-engine-1.11.2-1.e17.centos.x86_64

4、启动docker服务:

systemctl daemon-reloadsystemctl enable dockersystemctl start docker

5、在正式安装前,必须安装docker-compose:

yum -y install python-pippip install -U docker-compose

6、修改/usr/lib/systemd/system/docker.service文件,添加–insecure-registry配置项:

ExecStart=/usr/bin/docker daemon -H fd:// --insecure-registry 公网IP

7、重启docker服务:

systemctl daemon-reloadsystemctl restart docker

注:harbor使用docker-compose进行部署,并提供了在线安装和离线安装两种方式:
8、下载离线安装包,各版本连接地址:https://github.com/vmware/harbor/releases
下载后解压:

tar xvf harbor-offline-installer-版本.tgz

9、配置相关文件:
切换到harbor目录下,对harbor.cfg文件进行简单配置:

  • hostname:外部可访问的镜像仓库管理地址,通常设置为本地公有IP地址。若内部使用DNS,可设置为主机名。
  • harbor_admin_password:登陆harbor界面的admin用户的密码。

将主机的4000端口映射为registry容器的5000端口(端口可自定义)。修改docker-compose.yml,在registry部分的ports配置项中添加“- 4000:5000”这一行数据。

10、配置存储后端(可选):
在默认情况下,docker镜像存储在本地文件系统中。在生产环境中,可以考虑使用其他的存储后端系统,如AWS S3、openstack swift、ceph等。因此,需要编辑Deploy/templates/registry/config.yml文件中的storage配置部分。

11、运行./prepare脚本更新配置,完成配置后,就可以使用install.sh脚本部署harbor了:

./install.sh

12、执行./install.sh命令后,然后查看:

docker -compose ps

若需要重新安装harbor,执行如下命令即可:

docker kill $ (docker ps -q)docker-compose stopdocker-compose rmdocker-compose up -d

使用harbor:

1、测试,从docker hub上下载hello-world镜像:

docker pull hello-world

2、给镜像打上tag,以便上传到私有仓库中,其中library是harbor默认提供的项目:

docker tag hello-world IP/library/hello-world

3、登陆和上传镜像:

先登录到镜像仓库,输入用户名和密码docker login IP
上传镜像:docker push IP/library/hello-world上传成功后,就可以从harbor仓库中使用docker pull拉取私有镜像了:docker pull IP/library/hello-world

4、在浏览器中访问IP,登陆成功后,点击library项目,即可看到镜像。

构建持续集成系统(Jenkins)

    Jenkins是一个用Java编写并开源的自动化持续集成系统,可以用来自动化编译、打包、分发部署应用,并支持Ant/Maven/Gradle等多种第三方构建工具,同时与SVN、Git无缝集成,也直接支持第三方源码托管系统,如GitHub、GitLab、Bitbucket等。它具有监控并触发持续重复的任务、支持多平台和插件扩展、界面化管理、与第三方应用高度集成的特点。    Jenkins的工作原理是,先将源代码从Git系统中拷贝一份到本地,然后根据所编写的脚本执行一系列任务。整个系统的关键是脚本,用来告诉Jenkins在一次集成中需要完成的任务。

部署和使用Jenkins
1、安装Jenkins:
选择一台openstack虚拟机上安装Jenkins持续集成系统:

rpm -ivh jdk-8-linux-x64.rpmyum install -y gitrpm -ivh jenkins-2.1-1.1.noarch.rpm

查看Jenkins安装路径:

rpm -ql jenkins

最终配置文件如下:

egrep '^[^#]' /etc/sysconfig/jenkins

2、启动Jenkins,并设置服务为自启动:

systemctl start Jenkinschkconfig jenkins on

配置Jenkins
1、安装插件
这次实验需安装GitLab、E-mail、Git、Gerrit等相关插件。如果因为网络原因安装失败,则可以在Jenkins官网上手动下载所需的插件,然后通过Jenkins页面上的“插件管理→高级→上传插件”来安装。Jenkins插件安装地址:https://wiki.jenkins-ci.org/display/JENKINS/Plugins。

相关的具体插件:要让Jenkins可以自动构建Git仓库中的代码,需要安装Git Client Plugin和Git Plugin。要让Jenkins可以收到GitLab发来的hook从而自动构建。需要安装GitLab Hook Plugin。要让Jenkins可以在构建完成之后根据TAP文件生成图表,需要安装TAP Plugin。要让用户可以收到自定义格式的邮件,需要安装Email Extension Plugin。

添加Slave节点
添加Jenkins Slave节点,用于执行具体的Job任务。添加Slave可以分为三个步骤:一是创建和配置Slave节点;二是在Jenkins系统中添加Slave节点信息;三是将项目任务分配到Slave节点。
1、配置Slave节点:
在Slave节点上执行:

yum install -y java-1.7.0-openjdk git           #装JDK/Gitssh-keygen -t rsa                               #生成密钥对cd ~/.ssh/cat id_rsa.pub > authorized_keyschmod 700 authorized_keys

2、添加Slave节点的私钥
首先在Jenkins页面的左侧面板中点击”Credentials”,直接选择默认的”Global credentials”,点击”Add Credentials”添加访问服务器的凭证。在Kind中选择”SSH Username with private key”;在Username中输入登陆Slave节点的用户名”root”;”Private Key”选择”Enter directly”,输入内容就是上面步骤中创建的id_rsa私钥文件内容。

3、添加Slave节点
在Jenkins页面上的”系统管理” → “管理节点”中点击“新建节点“,在“启动方法”中选择”Launch slave agent on Unix machines via SSH”;在”Credentials”处选择上一步创建的凭证;其他保持默认。

4、创建Jenkins项目
在Jenkins页面的左侧面板中点击”My Views” → “新建”,在”Enter an item name”框中输入”test_GitLab”,并勾选“构建一个自由风格的软件项目”,点击”OK”按钮。在构建触发器部分,勾选”Build when a change is pushed to GitLab”,并将后面的URL地址粘贴到后续所创建的GitLab项目中的Webhooks中。

Jenkins备份和还原

Jenkins备份
1、全备份Jenkins
备份JENKINS_HOME下的所有文件和文件夹,恢复时需要先停止Jenkins服务。该方式也适用于迁移。
2、备份Job
备份JENKINS_HOME/jobs目录下的所有文件和文件夹,恢复时要先停止Jenkins服务。
3、备份插件
备份JENKINS_HOME/plugins文件夹,恢复时需要先停止Jenkins服务。
4、使用ThinBackUp插件备份

    不同于上面的备份,Jenkins的ThinBackUp插件备份的是Jenkins中的配置,包括Jenkins系统的配置、每个Job的配置,而这些配置基本都是XML文件,并且是Jenkins的重要文件。相比于全备份,这种备份速度更快,占用空间小。可以在插件管理中下载安装ThinBackUp插件。    这里通过编写脚本的方式,将其设置成linux Crontab定时执行任务来备份Jenkins系统中的jobs、plugins文件夹,并自动删除4天之前备份的文件。该脚本运行于Jenkins Master节点上并存放于/var/lib/jenkins目录下。脚本内容(参考):#!/bin/bashi='date + %Y-%m-%d'mkdir -p jenkins_backupstar -zxvf jenkins_backins_backups/jenkins_backup_$i.tar.gz jobspluginsbackup_file="./jenkins_backups"find $backup_file -mtime +4 -type f | xargs rm -f

设置Crontab任务,编辑/etc/crontab文件,让脚本每隔2天自动运行一次

echo "0 0 */2 * * root bash /var/lib/Jenkins/jenkins_backup.sh" >> /etc/crontab

重启crontab服务:

/sbin/service crond restart

Jenkins还原:
1、停止Jenkins服务:

systemctl stop jenkins.service将jobs、plugins备份文件夹拷贝至新Jenkins系统的/var/lib/jenkins/目录中

2、重启Jenkins服务:

systemctl restart jenkins.service

注:其他安装(GitLab、Gerrit) 请查看之上文章的链接!

原创粉丝点击