幻灯片下载地址:https://yq.aliyun.com/attachment/download/?filename=dbf464e5883344e9dd010214576889bf.pdf
以下为现场分享不雅观点整理。
最近Docker越来越火,持续交付的观点也随着被大家越炒越火。对付持续交付而言,1000个人有1000种理解,关于持续交付的演讲内容即打通小异又大相径庭。大同小异是指大家对持续交付的基本理解是相似的,但对持续交付的实现办法是大相径庭的,这是为什么呢?

这是由于持续交付实在是一个观点,它并不是一个详细实现的办法,而是说按照持续交付的辅导思想和规范来实现自己的持续交付系统。
用Lego的思维看基于Docker的交付办法
交付办法一贯在不断地演进、不断地变更,如上图所示,一个较大的公司内会有多个技能站、多个不同运用。不同运用有着各自不同的开拓环境和运行环境,所对应的交付场景也更不相同。因此,当公司体量越来越大、业务越来越丰富时,你就会创造交付场景也会变得越来越丰富,带来的寻衅也越来越大。
常见的交付流程紧张包括三要素:开拓、测试、运维。开拓职员开拓代码并在本地或测试环境测试,通过后将其提交给测试职员;测试职员在测试环境中利用手工测试或自动化测试,将全体流程验证开通,如果不存在问题,则运用即可上线;末了一个步骤是运维职员将相应的代码支配到机器上,然后对后期运用做运维,例如可能会初始化一些脚本、软件环境,做一些后期日志的网络、监控、告警以及系统的调优。
这几个步骤运行流畅实际上有几个基本条件:
第一个条件是要有一套根本的技能栈和环境自动化流程,才能实现运用的快递交付;
第二个条件是团队的技能框架尽可能保持稳定;
第三个条件是须要具有良好的文档和技能沉淀,文档中该当写清楚如何运维、支配、调试以及问题的办理方法,同时相同问题涌现第二次时,该当可以凭借技能沉淀立即修复;
第四个条件是团队成员相对稳定,当团队职员常常发生变革时,只管有之前的文档等等资料,但还须要一个熟习过程,不免会导致效率的降落。
这些问题在公司都是非常常见的征象,寻根究底时,实在紧张是由三个问题导致的:
第一,交付流程不能良好的自动化或自动化本钱过高,如果支配运用可以变成一个按钮,屏蔽技能障碍,则可以轻松实现运用的交付。
第二,交付缺少自描述的机制,严重依赖文档或口传心授。
第三,不同角色对付职责的交叉地带缺少互助,例如开拓、测试、运维同学之间,最主要的事是将软件交付出去,但是子啊职责的细分过程中,很多交叉领域是没有一个明确地划分的,导致有的地方是谁有任务心谁做,职不明,进而导致缺少互助。
三个问题总结成三个词便是:自动集成难、持续交付难、互助协同难。
很多人都在安利Docker为交付而生,是一种轻量级的操作系统虚拟化方案。利用Docker时,虚拟机还可以利用之前的Hypervisor,依旧可以利用VM的办法进行支配;上方运用可以利用Docker技能支配,实现弹性运用架构,还可以完美地实现隔离。
这些看上去都很美好,但到底如何阐明它和交付之间的关系呢?
在乐高积木中,有件非常伟大的事情,便是标准化模组,各个小模块之间有相互的接口,终极可以完身分歧形状的拼接。Docker同样做了一件伟大的事情:标准化交付,也便是所谓的软件定义交付。将繁芜的PHP环境、JAVA环境转变为标准的Dockerfile,不同的环境可以同样的办法打包,标准haunted了软件环境。
在Docker中,Docker的命名不用关心容器内是PHP运用还是JAVA运用,也便是说不同种类的运用可以用相同的命令或API管理,规避了不同软件之间的差别,标准化了软件形态。
不同运用之间是具有相互调用关系的,之前,是在配置文件内加以解释;现在,可以将这件事情一到Docker场景之下,利用编排模板办理该问题。在编排模板中,可以申明不同运用之间的相互调用关系、支配形态以及节点的数目和分布策略,也便是不同运用拓扑关系变成了遵照特定语法的编排模板,编排模板可自描述,编排模板确定时,运用形态也随之确定,标准化了交付流程。
持续交付+Docker=ContainerOps
虽然这里写到持续交付+Docker=containerOps,实在持续交付更像是一个哲学问题,不同的人会有不同的答案,由于持续交付是和场景密切干系的。我们所要做的是:不要将持续交付当成一个固定的流程,真正的持续交付是和业务密不可分的,符合你自己的业务场景的持续交付才是最好的持续交付。
在持续交付中,真正严明的问题只有三个,分别是:如何重修系统?如何安全地支配系统?支配后的问题监控与办理?逐个问题进行翻译,重修系统的意思是支配一个软件之后,如何初始化环境,如何将对应的技能站做好;如何支配系统是说,软件代码已经准备好了,环境也已经搭建好了,如何进行发布;第三个问题是只软件发布支配后,在运行时所碰着的各种问题,如何去做警告如何去监控、回滚等。将这个三个问题办理好,属于你自己的支付系统就搭建完毕了。
首先来看一下如何重修系统,即如何初始化环境。正如上文提到,终极软件环境都会变成Dockerfile,Dockerfile中具备了全部的软件根本环境,如乌班图;同时也具备软件运行环境,如Java和PHP;此外,还包括软件运行的代码和软件运行的命令,终极所有的软件环境都会变成Dockerfile定义的镜像,该镜像可以运行运用、重修系统,办理初始化环境的问题。
软件发布时,不同的软件之间是有相互依赖的,相互关联的软件可以通过编排模板标准化支配,本地可以运行远程便可以交付。
对付运维时的监控、告警、回滚等操作,大部分情形是由上层的容器做事商来供应的,通过调用Docker标准的API获取容器状态,涌现问题可以通过镜像回滚、更新、扩容。
阿里云容器做事持续集成模组
下面来看一下阿里云是如何演习持续交付系统的,阿里云供应的是把我们底层的云资源整合起来的一个能力。
上图展示的是阿里云容器做事和周边的生态,图中左边和右边都是阿里云的IaaS层做事,如云数据库、缓存做事等,如果想在容器内利用数据库,是可以利用阿里云供应的云数据库去做;如果想用行列步队,也可以找到对应的云产品。
中间部分是阿里云容器做事供应的模组部分,阿里云容器做事和其他容器做事供应商不同,大多数容器做事商更方向于采取pass去做这个场景,阿里云更侧重是将用户的能力进行整合,然后供应给用户更多的云资源。阿里云容器做事采取Docker Swarm编排系统,进行上层管理,完备兼容Docker社区;同时阿里云容器做事在Docker上进行了容器编排、弹性伸缩、集群管理;此外,在做事级别做了Discover Service,即做事的注册和创造,进行同步和异步通信,诸如不间断发布也是来源发布这一部分。再上一层支持两种路由:一是VM级的路由;另一种是阿里云内部的自定义的路由做事。
容器Hub持续交付模组
来讲一个很大略的交付案例:代码变更后,远程线上也随之更新的大略案例。这里紧张利用了容器Hub的持续交付模组,该模组由三部分组成:容器Hub、代码仓库、容器做事触发器。利用这三个模组之后就可以实现本地提交代码,远程自动更新。
事理如下:开拓者在本地提交代码之后,会将代码提交到代码仓库,目前容器Hub集成的代码仓库有阿里云Code、Github和Bitbucket;当源代码仓库创造开拓者所提交的代码后,将该关照给阿里云容器Hub,容器Hub确定提交代码的分支,会根据该分支对应的代码Branch,将代码下拉,然后进行镜像的自动化构建;镜像自动化构建完成后会通过一个触发器的办法触发容器做事进行运用的自动支配;容器被触发后,下拉最新的镜像,重新运行运用。通过这个流程来实现最大略的交付系统。
Jenkins持续交付模组
下面来讲一个更繁芜点的持续交付办法,是一种开源方案:Jenkins持续交付模组。该模组紧张分为代码仓库、Jenkins Master、Jenkins Slaves、容器Hub、容器做事触发器或Jenkins支配插件五部分。
全体交付的大致流程如上图所示。Jenkins实际上是开源中常见的持续集成所用的Center,大家可能会把它作为持续集成或持续交付的Server。Jenkins实际上是开源的持续集成Server中功能最为强大,生态最为丰富的,包含各种所需的插件,如支持静态代码扫描的SoMa插件等等。
Jenkins内部的维度是一个Job维度,例如你想做一次持续集成,则相称于该Job实行之后便可以做完持续集成,但这个Job的运行并不是在Jenkins本机上运行的。Jenkins是主从构造,它是Master/Slave模式(在容器做事中,推举利用该模式),在该模式下,一个Job会从JenkinsMaster分发给Jenkins Slave,而在Jenkins Slave上完成Job的详细任务。
对付上述案例,开拓者首先将代码提交到源代码管理仓库;该代码仓库会关照Jenkins Master,Jenkins Master会将相应的任务分发给对应的Jenkins Slave;在Jenkins Slave内,利用者可自定义流程、构建办法,同时在Jenkins Slave内,完成代码的编译和测试、代码的Image build and publish,以及终极支配的触发器。
在Jenkins Slave内可以完成很多事情,这里只是采取默认时限,来帮助大家简化开拓。在Slave内,我们定义了四个流程,分别是:Build、Test、Image build and publish和Probe trigger。
这里以Java运用举例,Build流程类似于Maven Build功能,会打包成一个Jar包或War包、Tar包。Test流程是完成测试功能,可以完成单元测试、集成测试,也可以领悟二者同时运行,不同的测试类型取决于对应的业务形态。Image build and publish流程相称于将build之后的结果根据Dockerfile构建成所需的镜像,再将该镜像推送到Hub仓库中。第四个步骤实际上是触发自动重新支配,或者利用插件重新支配。
在上述流程内,碰着了各种各样的问题,这里与大家进行逐一分享。
首先第一个问题是:Jenkins官网的镜像大多跑不起来。经由排查后,创造问题涌如今镜像内部,由于Jenkins默认实行的权限为Jenkins的user,挂载的Jenkins_home写权限不敷。在阿里云容器做事中供应了自己的Jenkins镜像,在该镜像中采取先提权后解权的办法,实现了宿主机挂靠镜像运行权限的问题。此外,阿里云容器做事还打包了一些常见的开拓插件,帮助大家减少下载插件的韶光和下载失落败的可能性。
第二个问题是:Jenkins Slave中构建镜像,怎么处理Docker in Docker。针对该问题,可以将/var/run/docker.sock通报进入Slave,这样Slave中的Docker相称于一个Client,而真正的Engine是宿主机的Docker,会利用宿主机的资源。
末了一个问题是:Jenkins持续交付中多套环境如何办理。最大略的办法是采取Git workflow的办法,实现不同分支不同权限、开拓环境、预发环境自动发布,不同特定分支发布到特定的环境,线上分支采取手动发布,可以利用多种发布策略实现0宕机发布。
蓝绿发布模组
蓝绿发布是指运用版本进行蓝绿发布时,在其他几台机器上或环境中起一套类似的版本(新版本),两个版本之间共享一套路由;通过路由权重的切换办法来实现不同版本之间的切换。例如,先上线A版本,然后又上线了B版本,如果想查看B版本是否正常,可以吧线上路由从A切换到B,验证没问题时,进行Confirm,Confirm动作会吧原来的老运用删掉,新运用完备上线;如果运用B存在问题,则把路由切换到A,再进行回滚操作,将新发布的运用下线掉。
蓝绿发布是基于路由来实现的,因此要涉及容器做事里边网络状况。上图是容器做事的网络示意图。在容器做事中共支持四种网络模型:None,即无网络,相称于容器里只有IP,对外无法访问;第二种是Bridge模式,bridge模式相称于把容器里边的端口映射到宿主机上的端口;第三模式是host模式,host模式就相称于完备共享宿主机的网络;第四种模式是容器做事现在默认供应的网络模型,叫only网络,only网络实际上是一种container的实现。它大致事理是:不同虚拟机、容器之间实际上有一个大的container网络,在这个网络内,所有容器时互通的。但从宿主机的网络访问二层网络还是不同,由于它们是不同的网络模型。阿里云容器做事供应的路由做事,是基于HA Proxy的实现,而HA Proxy的实现紧张完成的事情便是将两层的网络模型进行一次打通,利用者可以通过HA Proxy来转发到二层网络内的任一容器。灾不同容器之间进行权重切换时,权重是在HA Proxy层完成的。目前对HA Proxy层支持两种路由办法:内部路由和外部路由。外部路由相称于是对外访问时用的,而内部路用于运用之间的相互调用,相称于是内部的负载均衡。
对付蓝绿发布,常见的运用处景包括:利用Jenkins模组进行自动集成,完成测试环境和预发环境的自动发布。在手动发布中,采取的是蓝绿发布0宕机发布。
蓝绿发布的大致策略是:两个版本并存,通过权重切换的办法来实现流量的上线和下线的切换;验证无误的时进行发布确认,删除老版本容器;验证无法通过的时候就发布回滚,这时新版本的容器就删除。
更多深度技能内容,请关注云栖社区微信"大众号:yunqiinsight。