基于Docker持续交付平台建设的实践

导读:中国五矿和阿里巴巴联手打造的钢铁服务专业平台五阿哥,通过集结阿里巴巴在大数据、电商平台和互联网产品技术上的优势,为终端用户带来一站式采购体验。本文是五阿哥运维技术团队针对Docker容器技术在如何在持续交付过程中探索和实践,目前已经将发布部署权限开放给应用开发的owner,实现7*24小时“一站式”的持续交付,整体提高了公司研发过程的交付能力。


前言


作为创业公司和推行DevOps工程师们来说,都遇到过这样的问题:

  1. 硬件资源利用率的问题,造成部分成本的浪费 
    在网站功能中不同的业务场景有计算型的、有IO读写型的、有网络型、有内存型的,集中部署应用就会导致资源利用率不合理的问题。比如,一个机器上部署的服务都是内存密集型,那么CPU资源就都很容易浪费了。

  2. 单物理机多应用无法对无法进行有效的隔离,导致应用对资源的抢占和相互影响 
    一个物理机器跑多个应用,无法进行所使用的CPU、内存、进程进行限制,如果一个应用出现对资源的抢占问题,就会引起连锁反应,最终导致网站部分功能不可用。

  3. 环境、版本管理复杂,上线部署流程缺乏,增加问题排查的复杂度 
    由于内部开发流程的不规范,代码在测试或者上线过程中,对一些配置项和系统参数进行随意的调整,在发布时进行增量发布,一旦出现问题,就会导致测试的代码和线上运行的代码是不一致的,增加了服务上线的风险,也增加了线上服务故障排查的难度。

  4. 环境不稳定,迁移成本高,增加上线风险 
    在开发过程中存在多个项目并行开发和服务的依赖问题,由于环境和版本的复杂性很高,不能快速搭建和迁移一个环境,导致无法在测试环境中无法模拟出线上的流程进行测试,很多同学在线上环境进行测试,这里有很高的潜在风险,同时导致开发效率降低。

  5. 传统虚拟机和物理机占用空间大,启动慢,管理复杂等问题 
    传统虚拟机和物理机在启动过程进行加载内核,执行内核和init进行,导致在启动过程占用很长时间,而且在管理过程中会遇到各种各样的管理问题。


基于Docker容器技术,运维技术团队开发了五阿哥网站的容器云平台。通过容器云平台95%的应用服务已经实现容器化部署。这些应用支持业务按需拓展,秒级伸缩,提供与用户友好的交互过程,规范了测试和生产的发布流程,让开发和测试同学从基础的环境配置和发布解放出来,使其更聚焦自己的项目开发和测试。 



图1 五阿哥容器云整体架构


结合五阿哥容器云平台和Docker容器技术的实践,本文先介绍如何实现7*24小时“一站式”的持续交付,实现产品的上线。关于容器云平台的介绍,请关注:https://zhuanlan.zhihu.com/idevops

Docker镜像标准化


众所周知,Docker的镜像是分层的。对镜像分层进行约定:

  • 第一层是操作系统层,由CentOS/Alpine等基础镜像构成,安装一些通用的基础组件;

  • 第二层是中间件层,根据不同的应用程序,安装它们运行时需要使用到的各种中间件和依赖软件包,如,nginx、tomcat等;

  • 第三层是应用层,这层仅包含已经打好包的各应用程序代码。 

    图2:Docker镜像分层约定


经验总结:如何让自己的镜像变的更小,PUSH的更快? 



图3 优化前后对比


  • dockerfile构建应用镜像,在中间件层遇到一些需要安装的软件包时,尽可能的使用包管理工具(如yum)或以git clone方式下载源码包进行安装,目的是将软件包的copy和安装控制在同一层,软件部署成功后清除一些无用的rpm包或源码包,让基础镜像的尺寸更小。

  • Java应用镜像中并没有将jdk软件包打入镜像,将jdk部署在每台宿主上,在运行镜像时,通过挂载目录的方式将宿主机上的java家目录挂载至容器指定目录下。因为它会把基础镜像撑得非常大;

  • 在构建应用镜像时,docker会对这两层进行缓存并直接使用,仅会重新创建代码出现变动的应用层,这样就提高了应用镜像的构建速度和构建成功后向镜像仓库推送的速度,从整体流程上提升了应用的部署效率。


容器的编排管理


编排工具的选型:



图4:编排工具选型对比


Rancher图形化管理界面,部署简单、方便, 可以与AD、LDAP、GITHUB集成,基于用户或用户组进行访问控制,快速将系统的编排工具升级至Kubernetes或者Swarm,同时有专业的技术团队进行支持,降低容器技术入门的难度。 



图5: Rancher架构图


基于以上优点我们选择Rancher作为我们容器云平台的编排工具,在对应用的容器实例进行统一的编排调度时,配合Docker-Compose组件,可以在同一时间对多台宿主机执行调度操作。同时,在服务访问出现峰值和低谷时,利用特有的rancher-compose.yml文件调用“SCALE”特性,对应用集群执行动态扩容和缩容,让应用按需求处理不同的请求。https:/zhuanlan.zhihu.com/p/29093407

容器网络模型选型:


图6: 容器网络模型选型


由于后端开发基于阿里的HSF框架,生产者和消费者之间需要网络可达,对网络要求比较高,需要以真实IP地址进行注册和拉取服务。所以在选择容器网络时,我们使用了Host模式,在容器启动过程中会执行脚本检查宿主机并分配给容器一个独立的端口,来避免冲突的问题。

持续集成与持续部署


  • 持续集成, 监测代码提交状态,对代码进行持续集成,在集成过程中执行单元测试,代码Sonar和安全工具进行静态扫描,将结果通知给开发同学同时部署集成环境,部署成功后触发自动化测试(自动化测试部分后续会更新https://zhuanlan.zhihu.com/idevops)。 

    图7:持续集成示意图

静态扫描结果: 

图8: 持续集成结果示意图


  • 持续部署,是一种能力,这种能力非常重要,把一个包快速部署在你想要的地方。平台采用分布式构建、部署,master管理多个slave节点,每个slave节点分属不同的环境。在master上安装并更新插件、创建job、管理各开发团队权限。slave用于执行job。 

    图9: 持续部署架构图

基于上述图9架构,我们定义了持续部署规范的流程:

(1)开发同学向gitlab提交代码; 
(2)拉取项目代码和配置项文件,执行编译任务; 
(3)拉取基础镜像,将编译好的应用包打入生成最新的应用镜像,推送到镜像仓库; 
(4)根据当前应用及所属环境定制化生成docker-compose.yml文件,基于这个文件执行rancher-compose命令,将应用镜像部署到预发环境(发布生产前的测试环境,相关配置、服务依赖关系和生产环境一致)。 
(6)预发环境测试通过后将应用镜像部署至线上环境,测试结果通知后端测试同学。


容器的运行管理


应用容器现在已经部署到线上环境,那么在整个容器的生命周期中,还需要解决下面两个问题:

(1) 如何保存应用程序产生的运行日志和其它业务日志; 
(2) 如何在后端服务出现变化后nginx能够自动发现并完成配置更新。


日志管理


容器在运行时会在只读层之上创建读写层,所有对应用程序的写操作都在这层进行。当容器重启后,读写层中的数据(包含日志)也会一并被清除。虽然可以通过将容器中日志目录挂载到宿主机解决此类问题,但当容器在多个宿主机间频繁漂移时,每个宿主机上都会有留存应用名的部分日志,增加了开发同学查看、排查问题的难度。

综上所属,日志服务平台作为五阿哥网站日志仓库,将应用运行过程中产生的日志统一存储,并且支持多种方式的查询操作。 

图10:日志服务平台


通过在日志服务的管理界面配置日志采集路径,在容器中部署agent把应用日志统一投递到logstore中,再在logstore中配置全文索引和分词符,以便开发同学能够通过关键字搜索、查询想要的日志内容。

经验总结:如何避免日志的重复采集问题?

  • 日志服务agent需要在配置文件“ilogtail_config.json”中增加配置参数“check_point_filename”,指定checkpoint文件生成的绝对路径,并且将此路径挂载至宿主机目录下,确保容器在重启时不会丢失checkpoint文件,不会出现重复采集问题。


服务的注册


etcd是一个具备高可用性和强一致性的键值存储仓库,它使用类似于文件系统的树形结构,数据全部以“/”开头。etcd的数据分为两种类型:key和directories,其中key下存储单独的字符串值,directories下则存放key的集合或者其他子目录。


图11 应用注册


在五阿哥环境中,每个向etcd注册的应用服务,它们的根目录都以

”/${APP_NAME}_${ENVIRONMENT}

命名。根目录下存储每个应用实例的Key信息,它们都以“IP{PORT}”的方式命名。

下图是使用上述约定,存储在etcd上某应用实例的数据结构:


图12: 存储在etcd上某应用实例的数据结构


可以看到我是使用get方法向etcd发送请求的,请求的是部署在预发环境(PRE)的搜索服务(search);在它的根目录“/search_PRE”下,仅存储了一个应用实例的信息,这个实例的key是“172.18.100.31-86”;对应的value是“172.18.100.31:86‘’,整个注册过程是这样的:

① 通过代码为容器应用程序生成随机端口,和宿主机正在使用的端口进行比对,确保端口没有冲突后写入程序配置文件; 
② 把通过python和etcd模块编写的服务注册工具集成在脚本中,将IP地址和上一步获取的随机端口以参数的方式传递给服务注册工具; 
③ 待应用程序完全启动后,由服务注册工具以约定好的数据结构将应用实例的写入etcd集群,完成服务注册工作; 
④ 容器定时向etcd发送心跳,报告存活并刷新ttl时间; 
⑤ 容器脚本捕获rancher发送至应用实例的singnal terminal信号,在接收到信号后向etcd发送delete请求删除实例的数据。

注:在ttl基础上增加主动清除功能,在服务正常释放时,可以立刻清除etcd上注册信息,不必等待ttl时间。

经验总结:容器在重启或者意外销毁时,让我们一起看一下这个过程中容器和注册中心都做了什么事情?

应用在注册是携带key 和value时携带了ttl超时属性,就是考虑到当服务集群中的实例宕机后,它在etcd中注册的信息也随之失效,若不予清除,失效的信息将会成为垃圾数据被一直保存,而且配置管理工具还会把它当做正常数据读取出来,写入web server的配置文件中。要保证存储在etcd中的数据始终有效,就需要让etcd主动释放无效的实例信息,来看一下注册中心刷新的机制,代码直接奉上:

#!/usr/bin/env pythonimport etcdimport sys
arg_l=sys.argv[1:]
etcd_clt=etcd.Client(host='172.18.0.7')def set_key(key,value,ttl=10):try:                return etcd_clt.write(key,value,ttl)        except TypeError:                print 'key or vlaue is null'def refresh_key(key,ttl=10):try:                return etcd_clt.refresh(key,ttl)        except TypeError:                print 'key is null'def del_key(key):try:                return etcd_clt.delete(key)        except TypeError:                print 'key is null'if arg_l:        if len(arg_l) == 3:key,value,ttl=arg_lset_key(key,value,ttl)        elif len(arg_l) == 2:key,ttl=arg_lrefresh_key(key,ttl)        elif len(arg_l) == 1:key=arg_l[0]del_key(key)        else:                raise TypeError,'Only three parameters are needed here'else:        raise Exception('args is null')


服务的发现


confd是一个轻量级的配置管理工具,支持etcd作为后端数据源,通过读取数据源数据,保证本地配置文件为最新;不仅如此 ,它还可以在配置文件更新后,检查配置文件语法有效性,以重新加载应用程序使配置生效。这里需要说明的是,confd虽然支持rancher作为数据源,但考虑易用性和扩展性等原因,最终我们还是选择了etcd。

和大多数部署方式一样,我们把confd部署在web server所在的ECS上,便于confd在监测到数据变化后及时更新配置文件和重启程序。confd的相关配置文件和模板文件部署在默认路径/etc/confd下,目录结构如下:

/etc/confd/
├── conf.d├── confd.toml└── templates

confd.toml是confd的主配置文件,使用TOML格式编写,因为我们etcd是集群部署,有多个节点,而我又不想把confd的指令搞的又臭又长,所以将interval、nodes等选项写到了这个配置文件里。

cond.d目录存放web server的模板配置源文件,也使用TOML格式编写。该文件用于指定应用模板配置文件路径(src)、应用配置文件路径(dest)、数据源的key信息(keys)等。

templates目录存放web server下每个应用的模板配置文件。它使用Go支持的text/template语言格式进行编写。在confd从etcd中读取到最新应用注册信息后,通过下面的语句写入模板配置文件中:

{{range getvs "/${APP_NAME}/*"}}server {{.}};{{end}}


图13: 应用发现示意图


通过supervisor管理confd进程。confd在运行后会每隔5秒对etcd进行轮询,当某个应用服务的K/V更新后,confd会读取该应用存储在etcd中的数据,写入到模板配置文件中,生成这个应用配置文件,最后由confd将配置文件写入到目标路径下,重新加载nginx程序使配置生效。(代码请参考:https://zhuanlan.zhihu.com/idevops

总结


本文是五阿哥运维技术团队针对Docker容器技术在如何在持续交付过程中探索和实践,目前已经将发布部署权限开放给应用开发的owner,实现7*24小时“一站式”的持续交付,整体提高了公司的研发过程的交付能力。

接下来会不断优化持续交付过程中遇到的各种场景,逐渐完善容器云平台,同时会将容器云平台各种功能,总结的经验和教训不断分享给大家,给大家在工作中一些参考,避免走重复的“弯路”。

作者简介:刘晓明,五阿哥钢铁电商平台(wuage.com)运维技术负责人,拥有10年的互联网开发和运维经验。一直致力于运维工具的开发和运维专家服务的推进,赋能开发,不断提高研发效能。 


本文来自
《程序员》原创文章,谢绝转载,如需订阅,请点击这里(责编/魏伟)




PS:推荐一个容器技术线上直播,讲师来自腾讯、华为、思科、58同城、蘑菇街、当当等6位一线专家,议题涵盖容器云、微服务、servicemesh等最新实践,欢迎扫描下方二维码报名参加。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机课件比赛总结,课件制作比赛活动总结

【www.gz85.com - 投篮比赛活动工作总结】课件制作比赛,是对计算机多媒体等辅助手段的一次检阅,也有力地促进了制作多媒体课件技艺的提高。下面是小编为您整理的“课件制作比赛活动总结”,仅供参考,希望您喜欢!更多详细…

设置pandas显示行数_Pandas这样来设置,做数据分析舒适百倍

在日常使用pandas的过程中,由于我们所分析的数据表规模、格式上的差异,使得同样的函数或方法作用在不同数据上的效果存在差异。而pandas有着自己的一套「参数设置系统」,可以帮助我们在遇到不同的数据时灵活调节从而达到最好的效果&#xff0…

深度解析京东个性化推荐系统演进史

在电商领域,推荐的价值在于挖掘用户潜在购买需求,缩短用户到商品的距离,提升用户的购物体验。京东推荐的演进史是绚丽多彩的。京东的推荐起步于2012年,当时的推荐产品甚至是基于规则匹配做的。整个推荐产品线组合就像一个个松散的…

模拟微信支付服务器测试,专栏 - 腾讯WeTest-All Test in WeTest

一、异常压测场景模拟说明:压测服务器具备自动完成初始化(支持快速扩缩容),初始化后均已支持:stress 、tc等工具(不需安装)1.使用stress模拟压力(CPU/内存/IO繁忙)a.如何使用:cpu高负载模拟:stress -c 44 -t 60内存高…

网易容器云平台的微服务化实践

摘要:网易云容器平台期望能给实施了微服务架构的团队提供完整的解决方案和闭环的用户体验,为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,看看容器云平台能不能支撑得起容器服务本身的微服务架构&#xf…

逐鹿工具显示服务器错误连接不上怎么解决,win7系统安装逐鹿工具箱提示“error launching installer”错误的解决方法...

win7系统使用久了,好多网友反馈说win7系统安装逐鹿工具箱提示“error launching installer”错误的问题,非常不方便。有什么办法可以永久解决win7系统安装逐鹿工具箱提示“error launching installer”错误的问题,面对win7系统安装逐鹿工具箱…

唯品会2017年双11大促技术保障实践,全域提供25万QPS服务能力

作者简介:刘惊惊,唯品会业务架构部高级架构师,负责唯品会电商平台的用户系统,营销系统和库存系统的架构设计工作。2016年加入唯品会,参与了唯品会电商系统的大重构,负责多个核心系统的梳理和大促准备。 张…

iis7 mysql_windows 7 下搭建php开发环境(windows7+IIS7+php+mysql)

首先需要说明的是,基于IIS v6.0/v7.0(2008),可以支持的脚本相当完整,不仅支持Linux无法支持的asp/asp.net,还可以安装php、mysql、zend实现php环境。同时,利用Serv-U可以实现ftp管理。操作简单,无需键入任何…

从核心技术到高可用实践——解密数据库深度挖掘指南

SDCC系列峰会各站在技术圈遍地花开之余,主办方CSDN为了更好地服务技术开发者并拓展受众,同步启动SDCC 2017系列之线上峰会——线上线下双管齐下,一举打破地域限制,内容为基,便捷加成,带来更友好的听众体验。…

Unity中Shader观察空间推导

文章目录 前言一、本地空间怎么转化到观察空间二、怎么得到观察空间的基向量1、Z轴向量2、假设 观察空间的 Y~假设~ (0,1,0)3、X Y 与 Z 的叉积4、Y X 与 Z 的叉积 三、求 [V~world~]^T^1、求V~world~2、求[V~world~]^T^ 四、求出最后在Unity中使用的公式1、偏移坐标轴2、把…

portainer 启动mysql_docker 安装portainer容器后,启动/Portainer 安装MySQL并开启远程访问...

启动命令:docker run -d -p 9000:9000 --restartalways -v /var/run/docker.sock:/var/run/docker.sock --name portainer docker.io/portainer/portainer下载mysql镜像文件:docker search mysqldocker pull mysql:5.7.32创建mysql容器:docker run -d --…

追求极简:Docker镜像构建演化史

作者简介:白明,东软互联网运营平台技术负责人,毕业于哈尔滨工业大学,Go语言专家,GopherChina讲师,技术培训师和撰稿人,博客tonybai.com作者,拥有多年后端服务架构设计和开发经验。目…

特征选择算法在微博业务应用中的演进历程

近年来,人工智能与机器学习的应用越来越广泛,尤其是在互联网领域。在微博,机器学习被广泛地应用于微博的各个业务,如Feed流、热门微博、消息推送、反垃圾、内容推荐等。值得注意的是,深度学习作为人工智能和机器学习的…

c winform mysql类_C#连接MySQL数据库操作类

首先需要安装MySQL Connector Net 6.8.3然后在项目中引用MySQL Connector,如下图所示C#连接MySQL的操作类代码如下:public class MySQLHelper{private string db_host "localhost"; //数据库服务器private string db_port "3306";…

病历智能处理引擎的架构设计、实现和应用

作者简介:吴大帅,新屿算法工程师,曾供职于宅米网、新达达,从事系统架构设计、算法设计等工作。 李智慧,《大型网站技术架构:核心原理与案例分析》作者,从事大型网站、分布式系统、大数据方面的研…

Heron:来自Twitter的新一代流处理引擎应用篇

作者 | 吴惠君,吕能,符茂松责编 | 郭芮【导语】 本文对比了Heron和常见的流处理项目,包括Storm、Flink、Spark Streaming和Kafka Streams,归纳了系统选型的要点。此外实践了Heron的一个案例,以及讨论了Heron在这一年开…

2017 JavaScript 调查报告概述

本文转载自极光日报知乎专栏,地址:https://zhuanlan.zhihu.com/p/32260460简评:最近一份超过 23,000 名开发者参与的关于 JavaScript 的调查报告 - the State of JavaScript 2017 出炉了。内容包含框架的流行趋势、薪资水平等等,感…

python动态_python --动态类型

动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念相关。动态类型在我们接触的对象中,有一类特殊的对象&…

微博热点事件背后数据库运维的“功守道”

作者 | 张冬洪责编 | 仲培艺【导语】 微博拥有超过3.76亿月活用户,是当前社会热点事件传播的主要平台。而热点事件往往具有不可预测性和突发性,较短时间内可能带来流量的翻倍增长,甚至更大。如何快速应对突发流量的冲击,确保线上服…

sql devalop连接mysql_SQL-Mysql表结构操作

一 前言本篇内容是关于 基本的数据库操作,建表,表结构修改等内容;学习本篇的基础是知识追寻者以前发布的文章:公众号:知识追寻者知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)二…