约定Service构建方式
对于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构建方式的更多相关文章
- 三种构建方式:Makefile、scons、scons cmake+ninja
三种构建方式: Makefile scons cmake+ninja https://ninja-build.org
- soap,restful 两种web service实现方式比较
web service服务 目前常用的实现web service的方式有有两种 1.SOAP 原始的web service标准,一堆标准,不过这些标准是在开发框架中实现的,有上层接口,可以调用 2.R ...
- k8s service NodePort 方式向外发布
k8s service NodePort 方式向外发布 k8s 无头service 方式向内发布 k8s service 服务发现 {ServiceName}.{Namespace}.svc.{Clu ...
- 约定Jenkins构建脚本
对于Jenkins的使用,我感觉只用到其中一小部分功能,但也就是这一小部分功能,也推动了整个CI/CD的过程,Jenkins的使用方式有很多中,可能我用到的只是其中一种,但是已经满足我的需求,便不再贪 ...
- Android使用binder访问service的方式(一)
binder机制是贯穿整个android系统的进程间访问机制,经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的. service 你可以理解成没 ...
- Android 使用binder访问service的方式
binder机制是贯穿整个Android系统的进程间访问机制,经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的. service 你可以理解成没 ...
- Wildfly在Linux下以Service的方式启动 配置步骤
1.前提介绍 在目前项目中使用Wildfly9在linux下部署项目,经常会通过远程的SSH来启动关闭服务.但是通过SHH启动 standalone.sh 的服务,如果关闭窗口服务就会被停掉.所以就想 ...
- war包部署在tomcat下,使用windows service服务方式启动tomcat服务器,在包含调用dll的模块,报dll找不到问题的解决办法
问题描述: 开发了一个需要调用dll的java web程序,在idea开发环境下运行调试没问题,可以正常运行,在tomcat/bin下,运行批处理startup.bat,启动tomcat服务器,也可以 ...
- Jenkins 构建方式有几种
jenkins三种部署方式: 一.jenkins触发式构建:用于开发环境部署,开发人员push代码或者合并代码到gitlab项目的master分支,jenkins就部署代码到对应服务器. 二.jenk ...
随机推荐
- git常用笔记整理
Git 什么是Git 初始化 guthub创建sshKey 下载 上传 更新 创建切换分支 删除分支 合并分支 查看命令历史|提交历史 撤回 设置用户名和密码 查看配置信息 强制pull 强制push ...
- 深入理解SpringAOP之代理对象
本篇文章主要带大家简单分析一下AOP的代理对象,至于AOP是什么,如何配置等基础性知识,不在这里讨论.阅读前请先参考:代理模式,在这之前我们需要了解springframework的三个核心接口与get ...
- Java io使用简介
图:Java io概览图 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更 ...
- Reactor三种线程模型与Netty线程模型
文中所讲基本都是以非阻塞IO.异步IO为基础.对于阻塞式IO,下面的编程模型几乎都不适用 Reactor三种线程模型 单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常 ...
- git-------基础(一)
更改连接仓库只用操作一次(先删后加) (1)git remote rm origin //若本地已经关联了一个远程库,则先删除已关联的 ...
- Preload,Prefetch 和它们在 Chrome 之中的优先级
前言 上周五到的时候,想起之前在手游平台上有处理dns-prefetch的优化,那这篇分享的就更仔细了.今日早读文章由@gy134340翻译并授权分享. 正文从这开始- 今天我们来深入研究一下 Chr ...
- PAT1113: Integer Set Partition
1113. Integer Set Partition (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- python3的文件读取问题
今天在调python程序时,遇到了一个报错:illegal multibyte sequence. 后来在网上查资料,是文件读取的编码问题. py3读取文件的时候是可以指定编码的:open('file ...
- 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...
- MySQL中group_concat函数深入理解
本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . 一.MySQL中group_concat函数 完整的语法如下: gr ...