对于DevOps中,将开发好的软件交付给运维人员去部署与维护,过程中参杂着诸多不可控制的变量,如环境问题、版本问题等等,而Docker容器极大程度上解决了这些问题,同时对于服务的持续交付,也变得方便和简洁,本次讲讲我的整个生成流水线中服务部署方面的一些想法和执行方式,或许不是很中意的想法,并且还可能被认为存在漏洞和错误,但是,至少是这个环节是通了的。最完美的前提至少是运行完成,在设计过程中,考虑到了几种情况,主要是针对服务器中镜像生产者和服务承载者之间的关系,也有不同的实现方式。

一、无需交付

  镜像生产和服务部署共用服务器集群,服务器之间通过Docker Swarm完成集群,同时Docker Swarm中的Manager与镜像生产者在同一台服务器上,管理整个服务集群。

  

  注意:仍然需要将生产完毕的镜像推送到镜像仓库中,因为在同一个集群中的其他Worker节点需要指定镜像下载,镜像生产结束后,推送到仓库,此时发起一个创建服务或是更新服务的命令,指定本服务器上的集群完成相应工作。在交付服务时,可以有两种方式进行交付,采用单个服务的创建脚本docker service create或是采用多个服务的批量创建脚本docker stack deploy指定.yaml文件,将.yaml文件中的服务进行批量创建或更新。

  对于多个服务的创建脚本,我没有去尝试,有兴趣的可以查看Docker官网相关资料,对于单个服务的创建或更新脚本可以采用命令行方式或是使用UI工具去完成创建和更新,如使用Portainer工具,在Portainer中操作是很方便的。

二、手动交付

  当镜像生产者和服务部署分离时,通常也是这种情形,镜像生产者只作为镜像的生产,职责便是生产镜像,而作为部署服务器,职责便是承载服务,对外提供服务。这个过程中就存在着,服务由谁创建,什么时候更新,由谁更新的一些问题,对于这些问题,也在一步一步设计中解答,本次先使用手动交付的形式,使用命令行来完成服务创建和更新,当镜像生产完毕后,便是交付环节,手动交付是最为基本的交付方式了。

  通过命令行方式完成手动交付:

  1、在Jenkins中使用命令行完成交付,当镜像生产完毕,执行创建服务或是更新服务,这有点随着镜像的变更而变更,无需人为操作,但是也是有问题的,就单个来讲,镜像的变更往往是由开发人员将代码合并到主干中,才触动镜像更新,这也在一定程度上受限于合并到主干的时机,如果合并太过频繁,则镜像生产者需要连续生产,并且中间的镜像生产过程变得毫无意义了。

  2、在Swarm Cluster内使用命令行创建服务完成交付,在Swarm集群中的Manager节点上单个操作,是可行的,如果集群数量少,且没有安装图形管理工具之类的,可以使用这种方式,只是如果Swarm Cluster数量过多,需要一个一个切换\登录,也是比较繁琐的。

  3、在其他主机上操控Swarm Cluster使用命令行完成交付,这个过程同直接操作Swarm Cluster也是差不多的,只是可以使用额外的管理主机管理多个Swarm Cluster的Manager节点,这样一来,也较为方便,直接在一台非Swarm Cluster内的主机上即可完成所有Swarm Cluster的创建和更新过程。

  

  图例:直接在Jenkins所在主机上操控Swarm Cluster完成交付

三、借助工具手动交付

  对于命令行来讲,多条复杂命令总是难记,有可以直接操作的工具往往是更受欢迎的,而对于Docker来讲,Portainer工具是极受欢迎的,快速安装,简单的操作界面,丰富的功能等,同样还有其他不错的图形化容器管理工具,如Seagull、Shipyard等。

  1、利用Portainer工具完成手动交付,在Portainer界面中,配置好仓库地址和用户名密码,便于私有镜像的拉取,至于仓库,可以是自己搭建的镜像仓库,也可以使用第三方提供的镜像仓库,如阿里云、腾讯云镜像仓库。

  

  2、利用其他Docker及Docker Swarm集群管理工具完成手动交付,至于使用其他的工具,我也没有使用过,但是工具只不过是将命令行进行了分装,因此,其他图形化管理工具也是应该存在这些功能。

  

  图例:利用Portainer工具操控Swarm Cluster完成交付

四、借助工具自动交付

  对于自动交付,这个功能,只是见到过其他人这么玩过,猜想了一下工作方式,至于实际尝试,并没有去做,因为思考了一些操作过程,感觉我对这个自动交付的环节并不太感冒,因为按照生产来讲,追求稳定才是重要的,如果存在测试人员,测试相应服务完毕后,推送测试好的镜像,这是运维人员将镜像交付到生产环境中,能够保证不出差错,虽然失去了效率,但是也在是心安理得。至此,我只能简单描述下借助工具完成自动交付过程,在Docker Swarm集群中的Manager节点或单独弄一台服务器作为镜像更新后的交付服务器,在服务器中加入Jenkins工具,指定镜像版本更新,则拉取最新镜像完成服务更新,镜像首次推送,则完成服务创建,对于使用批量创建/更新服务的脚本文件,没有使用的太深,但是那个是非常有价值的。

  

  至此,几种我用过的方式也讲完了,在其中对于docker stack deploy使用的较少,因为docker stack deploy使用场景是为了批量服务的创建和更新而存在的,如果对于单个服务我都使用这个命令,有点杀鸡用牛刀的感觉,而对于以后的k8s学习,使用批量服务创建更新脚本文件,将会是常态。目前我现在采用的是“借助工具手动交付“这种方式,原因有几点,主要是,思考了下,服务交付的意义,主要是为了稳定,少出问题,必须在确保稳定后才能交付部署,经测试人员测试完毕后完成交付到生产环境,这应该是我们所希望能够见到的,无论开发人员每天或每周有多少个版本更新,经测试人员测试后的稳定版本,才能交付到生产环境中,而不是说开发人员一将分支代码合并到主干中,有新的镜像生成了,就直接将新的镜像推送到生产环境中,而做到所谓的持续交付的目的,实际的持续交付应该是保证测试完毕到生产部署这个环节具有连续性,稳定性,每一次交付都经得起推敲,具体其中发生了什么,稳定性如何等,虽然这种方式效率较低,但对于持续交付来讲,这个效率也算是可以接受的。

 本文地址:https://www.cnblogs.com/CKExp/p/9940469.html

 欢迎关注微信订阅号,有新的文章将同步到订阅号中

 

2018-12-10,望技术有成后能回来看见自己的脚步

约定Service构建方式的更多相关文章

  1. 三种构建方式:Makefile、scons、scons cmake+ninja

    三种构建方式: Makefile scons cmake+ninja https://ninja-build.org

  2. soap,restful 两种web service实现方式比较

    web service服务 目前常用的实现web service的方式有有两种 1.SOAP 原始的web service标准,一堆标准,不过这些标准是在开发框架中实现的,有上层接口,可以调用 2.R ...

  3. k8s service NodePort 方式向外发布

    k8s service NodePort 方式向外发布 k8s 无头service 方式向内发布 k8s service 服务发现 {ServiceName}.{Namespace}.svc.{Clu ...

  4. 约定Jenkins构建脚本

    对于Jenkins的使用,我感觉只用到其中一小部分功能,但也就是这一小部分功能,也推动了整个CI/CD的过程,Jenkins的使用方式有很多中,可能我用到的只是其中一种,但是已经满足我的需求,便不再贪 ...

  5. Android使用binder访问service的方式(一)

    binder机制是贯穿整个android系统的进程间访问机制,经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的. service 你可以理解成没 ...

  6. Android 使用binder访问service的方式

    binder机制是贯穿整个Android系统的进程间访问机制,经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的. service 你可以理解成没 ...

  7. Wildfly在Linux下以Service的方式启动 配置步骤

    1.前提介绍 在目前项目中使用Wildfly9在linux下部署项目,经常会通过远程的SSH来启动关闭服务.但是通过SHH启动 standalone.sh 的服务,如果关闭窗口服务就会被停掉.所以就想 ...

  8. war包部署在tomcat下,使用windows service服务方式启动tomcat服务器,在包含调用dll的模块,报dll找不到问题的解决办法

    问题描述: 开发了一个需要调用dll的java web程序,在idea开发环境下运行调试没问题,可以正常运行,在tomcat/bin下,运行批处理startup.bat,启动tomcat服务器,也可以 ...

  9. Jenkins 构建方式有几种

    jenkins三种部署方式: 一.jenkins触发式构建:用于开发环境部署,开发人员push代码或者合并代码到gitlab项目的master分支,jenkins就部署代码到对应服务器. 二.jenk ...

随机推荐

  1. 深度学习之 TensorFlow(四):卷积神经网络

    基础概念: 卷积神经网络(CNN):属于人工神经网络的一种,它的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量.卷积神经网络不像传统的识别算法一样,需要对数据进行特征提取和数据重建,可以直 ...

  2. Python人脸识别最佳教材典范,40行代码搭建人脸识别系统!

    Face Id是一款高端的人脸解锁软件,官方称:"在一百万张脸中识别出你的脸."百度.谷歌.腾讯等各大企业都花费数亿来鞭策人工智能的崛起,而实际的人脸识别技术是否有那么神奇? 绿帽 ...

  3. 智能指针auto_ptr & shared_ptr

    转载:智能指针auto_ptr 很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生 ...

  4. The more,the better。

    贪婪是好的, 贪婪是对的, 贪婪是有用的, 贪婪是可以清理一切的, 贪婪是不断进化和进步的精华所在, 贪婪就是一切形式所在: 对于生活,对于爱情,对于知识我们一定要贪婪, 贪婪就是人们的动力. The ...

  5. 工作中常用的JS函数整理分享(欢迎大家补充)

    今年在渣X工作整理的常用JS函数 今年来了渣X工作,我所在这个部门分工很奇怪,CSS竟然有专门的人在搞,开发PHP的人员需要处理JS,以至于有时候开发起来不是那么得心应手,感觉把JS和CSS拆开就像是 ...

  6. js基础进阶--图片上传时实现本地预览功能的原理

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...

  7. PHP后端之验证码

    PHP后端之验证码 前言: 打算写一些实际开发中遇到的东西.我这个人记性不好,觉得记下来,以后就算想找,也能找得到. PHP,可能很长一段时间都不会使用了.所以还是留一些记录. 另外还有一些服务器架设 ...

  8. Cookie与 Session使用详解

    Cookie概念 在浏览某些 网站 时,这些网站会把 一些数据存在 客户端 , 用于使用网站 等跟踪用户,实现用户自定义 功能. 是否设置过期时间: 如果不设置 过期时间,则表示这个 Cookie生命 ...

  9. Oracle数据库查询优化方案(处理上百万级记录如何提高处理查询速度)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引 ...

  10. java并发之TimeUnit理解

    TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段时间里Thread的sle ...