对于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. RocketMQ源码 — 九、 RocketMQ延时消息

    上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...

  2. C语言可变参数va_list

    一.什么是可变参数 在C语言编程中有时会遇到一些参数个数可变的函数,例如printf(),scanf()函数,其函数原型为: int printf(const char* format,-) int ...

  3. socket编程中客户端常用函数

    1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

  4. C/C++ 数据结构之算法

    数据结构中的排序算法. 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的 ...

  5. “史上更难就业季”暴露出啥隐情?

      如果说,2013年中国高校毕业生达到699万,被称为"史上最难就业季".那么2014年将成为去年之后的"更难就业季".据最新资料显示,2014年应届大学毕业 ...

  6. sql语句查询执行顺序

    http://blog.csdn.net/bitcarmanlee/article/details/51004767

  7. 16个必须熟悉的linux服务器监控命令

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc. == 原文:16 Linux Server Monitoring Comman ...

  8. SpringMVC中参数绑定

    SpringMVC中请求参数的接收主要有两种方式, 一种是基于HttpServletRequest对象获取, 另外一种是通过Controller中的形参获取 一  通过HttpServletReque ...

  9. PAT1086:Tree Traversals Again

    1086. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  10. javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

    前言 for,slice(0),concact() 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示:  如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不 ...