测试环境对于任何一个软件公司来讲,都是核心基础组件之一。测试环境伴随着发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下环境的演进和最终的解决方案。

1 测试环境演进

1.1 单体环境
    在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。

1.2动态环境+稳定环境
    随着微服务化的进行,的服务数量是急速扩充的。分支并行开发增多,共用环境造成的互相影响也逐渐增多。单体环境已经不能满足我们的需求。新的组织形式被提了出来。动态环境部署修改的服务和一些必要服务。稳定环境部署和线上一致的服务。同时我们开发了一个环境平台去管理环境的申请到回收的整个生命周期。阶段性的满足了我们诉求。

存在问题:请求进入到稳定环境之后,调用将会在稳定环境中,无法调用到动态环境的服务。导致被测服务之前的所有服务、mq的生产方都要部署到当前测试机上,即使这些服务没有任何变化,随着集群规模的继续扩大,对资源的消耗飞速增加。

1.3 动态环境+稳定环境(ip路由)
    对于上面的问题,我们期望能做成请求的流量是动态环境下优先,如果没有的情况下再请求到稳定环境上,这样测试机上只部署发生了变化的服务和入口服务(必需)就可以了。随后和架构运维一起实现了ip路由的功能,就是将ip作为泳道名称向下传递。

这个方案上线后,资源使用量下降30%左右。在2019年上线后的两年内,经历了和找靓机合并,芯片供应紧张导致机器长时间无法采购到,在这个背景下,保证了环境的应用。但是问题也日益的凸显。

2 环境使用中的问题

从大的方面来讲:系统稳定性,资源成本,使用效率三个方面互相制衡。在成本(包括采购困难)这个限制下,旧机器无法淘汰导致稳定性问题。资源不足,现存的测试机使用率就降不下来,稳定环境就无法保持内存30%空闲率的下限,稳定性就会成问题。测试环境就需要严格的回收策略,导致用户的使用体验和使用效率下降,如:到期回收和资源空闲回收,肯定会导致部分使用中的环境被回收掉,尤其是大的内存环境,对应大的项目,恢复起来慢,影响也大。已有的架构下不能做到三者兼得,或者说不能做到我们希望的妥协。具体的问题如下:

2.1 资源的不足
    业务的增长和集群数量的增长,叠加服务器采购不到的情况,机器资源很紧张。测试资源池3.8T, 高峰占用率80%。剩余资源散落在20几台物理机上,导致超过40G内存的机器都是比较难申请的。

2.2 资源的浪费
    在机器资源不足的情况下,还存在机器资源浪费的情况,现有的方案,机器申请下来内存是固定的,不能自动的扩容和缩容,随着环境中被测服务的逐渐上线,最新版本会被同步到稳定环境中,动态环境和稳定环境中重复的服务会越来越多。但是无法将测试资源回收到资源池之中。

2.3 稳定性问题
机器的稳定性

    众所周知,测试环境的机器基本都是线上过保的机器,年龄不一,但是一般比较大,损坏是常有的事情,我们高峰期一个月损坏了5台物理机。对业务产生直接影响。

部署过程简要介绍

先简单介绍下机器启动部署过程:

系统的稳定性

整个初始化部署,流程7-8步,各个环境都可能出现问题,日常稳定性不足。

在上面3个方案的历史迭代中,积累了大量的历史包袱。每次部署都要要对测试配置文件中的数据库、redis、mq、zk等配置进行替换,易出错,不易维护,工程规范化不足。

在环境的构成中,环境中每次添加删除服务,都要重新计算nginx和host,依赖长,容易出错。

日常使用中,内存不足的情况下,无法自动扩容,只能重新申请环境,时间成本高。

Kvm资源方案生态差,维护成本高。

    以上这些过程中的问题,每周会有25个左右环境问题反馈,我们每周都需要8h左右的运维时间。为了解决上面的问题,我们开发了系统错误分析工具,虚拟机重启工具、机器资源报警工具、机器存活监控、稳定环境整体迁移工具等众多管理员工具帮助用户和我们解决日常问题。整体来讲日常的维护成本是很高的。用户用着有很多问题,也很不爽。

3 解决方案:动态环境+稳定环境(标签路由)
3.1 解决方案
系统底层架构修改

    由于以上的问题,我们和架构运维重新设计了环境平台的方案。我们最终采用了docker + 稳定环境的方案。ip路由变成了标签路由,一个环境不再是一台机器上部署多个服务,而是一个环境下,多个docker组成,多个ip组成,如下:环境yyy由服务B和D组成,ip分别为192.168.5.1和192.168.6.1。

这样镜像初始化、agent初始化过程被干掉。环境的大小限制不再是一个宿主机大小决定,极限情况下一个环境可以包含所有的服务。单个环境容量不再是问题。    通过k8s的特性,部署时会新启动一个节点,并且新节点启动成功之后,下线旧节点。保证了服务在部署过程中,服务不中断。

工程规范化

推动rd升级服务,将测试配置修改为正常的配置,从而下掉平台的配置替换。

nginx中心化

去掉每个环境上的nginx,消灭ng部署生成过程的问题。通过系统联动使用运维的中心化nginx。

host配置

推动删除不必要的公共host,在服务升级的过程中推动RPC的host调用方式升级为服务管理平台,剩余公共host采用内部dns能力进行解决。

新问题

在制定新方案的过程中,一个目标是解决之前的依赖问题,一个就是尽量减少新方案带来的使用方式上变动,减少用户使用成本。环境docker化之后最大的影响是什么呢?一、ip变成了标签,不再是唯一ip。

二、服务每部署一次,ip变一次。

ip没了,那么入口host怎么配置?ip变了,那么如何登录到机器上?如何查看历史日志?如何进行单元测试?解决方案:

之前有泛域名解析的能力,如app.testdocs.com带标签可以写为app-${tag}.testdocs.com。

请求whistle配置中 增加:192.xxx.xxx.xxx app.zhuanspirit.com excludeFilter://*/api reqHeaders://(Global-Route-Tag:test1234)。注:192.xxx.xxx.xxx为中心化nginx。

增加webshell 解决ip变动带来的登录成本增加。

增加历史日志查询功能,解决ip销毁后历史日志查询问题。

增加本地化标签路由的功能,解决单元测试每次输入ip的问题。变成标签设置。注:在后面的docker推广过程中,我们发现方案中,我们漏掉了远程debug场景下,ip变动的问题。最后通过开发了一个idea插件和环境平台联动解决。

新的运营方式

    新的技术方案中,资源的最小管理节点由之前的一个kvm变为标签中的一个服务。在测试服务上线之后,环境平台会自动同步最新代码到稳定环境,之后将测试标签中刚刚上线的服务删除,回收资源。从而避免资源的浪费。

成果

部署过程缩减为:服务镜像启动 + ng配置同步。步骤极大的缩减。稳定性、效率提高。在宿主机挂掉的情况下,k8s自动调度到新的节点。进一步保证稳定性。资源成本、稳定性和使用效率三方的制衡被打破。三方面充分的得到了提高。目前:

用户问题:减少95%,并且大项目测试中,环境问题消失了。

申请时间:由28分钟到5分钟以内。

资源占用:3200G到1200G。

总结
在制定了这个方案之后,在架构、运维和工程效率三个部门互相配合情况下,1个月内完成开发,3个月内完成了服务升级。1年内完成了整体功能的推广。取得了丰硕的成果。
docker化之后,改变了整个环境的使用生态。现在,要用一个测试环境,申请则立即可用。过程中不再有任何心力消耗,不再有中断。并且资源管理的最小节点变为一个服务。环境系统的底层技术架构在我们看来处于业内目前的最优的方案,在系统、用户层面上做到了资源,性能和效率三者的整体性提升和平衡。整个系统是相对成熟的,可以预见的是,在未来很长一段时间内系统不需要再进行系统结构上的升级。

测试环境docker化实践的更多相关文章

  1. 测试环境docker化—容器集群编排实践

    本文来自网易云社区 作者:孙婷婷 背景 在前文<测试环境docker化-基于ndp部署模式的docker基础镜像制作>中已经详述了docker镜像制作及模块部署的过程,按照上述做法已可以搭 ...

  2. 测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作

    本文来自网易云社区 作者:孙婷婷 背景 我所在测试项目组目前的测试环境只有一套,在项目版本迭代过程中,开发或产品偶尔会在测试环境进行数据校验,QA人数在不断增加,各个人员在负责不同模块工作时也会产生脏 ...

  3. 一个小白的测试环境docker化之路

    本文来自网易云社区 作者:叶子 学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程.常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍. 按照国际惯例,先说一下背景: ...

  4. CI Weekly #9 | 揭秘阿里 Docker 化实践之路

    2017年悄然而至,对 flow.ci 你有什么新的期待呢?新的一年,flow.ci会越来越强大好用,希望继续得到你的支持与反馈.最近,我们做了如下的「功能优化」与「问题修复」,看看有没有你想要的: ...

  5. 基于.net的微服务架构的开发测试环境运维实践

    眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两年多的实践,发现完全 ...

  6. 基于.net的微服务架构下的开发测试环境运维实践

    眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两年多的实践,发现完全 ...

  7. Ranger开源流水线docker化实践案例

    1.背景 开发部门决定在Apache Ranger开源社区贡献代码,目标是个人国内排名Top1,世界排名Top2,并且在已经成为Ranger项目的Committer情况下,争取成为Ranger项目的P ...

  8. 用docker搭建测试环境--docker的基本操作

    上一篇文章中最后执行了docker pull centos的指令,经过一段时间的等待,会从hub.docker.com上下载docker官方最新的centos的images,接下来熟悉一下docker ...

  9. 部门sonarque代码扫描测试服务器docker化

    部门内部的服务器太多了,打算将对应的测试环境docker化. 转成docker后,以后不管是升级调研还是定制化开发测试都方便,就是事情太多,一直没有抽出身来做,今天处理下并把过程记录下来跟大家分享下. ...

  10. 细说Mammut大数据系统测试环境Docker迁移之路

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 最近几个月花了比较多精力在项目的测试环境Docker迁移上,从最初的docker"门外汉"到现在组里的同学(大部分测试及少 ...

随机推荐

  1. chrome网页截图

    1. 打开网页 2. F12,打开开发者工具 3. Ctrl+Shift+P,打开应用查找框 4. 输入screenshot,查找相关工具 5. 试用工具 1)Capture area screens ...

  2. winform 登录后跳转百度地图报错 使用委托解决

    最近用winform做一个登录后跳转到百度地图的小程序,使用了线程,winform的UI是单线程操作的,由于百度地图写在另外一个窗体,导致报错.后来使用了委托解决了这个小问题. delegate vo ...

  3. 关于 verilator 中 config.vlt 等配置文件的使用

    参考网页:https://verilator.org/guide/latest/exe_verilator.html#configuration-files 注意,在使用 config.vlt 配置文 ...

  4. vue 移动端px转rem

    1.安装lib-flexible 终端执行命令:npm i lib-flexible --save 2.在main.js引入lib-flexible 3.终端执行命令:npm install post ...

  5. 305-基于XC7Z020的AI 人工智能 可编程相机

    基于XC7Z020的AI 人工智能 可编程相机 一.产品概述 本产品为一款基于FPGA soc的支持二次开发的智能相机平台,基于大量已有的图形计算库和我们开发的支持库,用户可以使用python语言,轻 ...

  6. iOS开发 React Native与iOS交互汇总

    RN简介 React Native 是一个使用React和应用平台的原生功能来构建 Android 和 iOS 应用的开源框架.起源于faceBbook内部,2013开源. React Native ...

  7. vue项目中如何使用markdown编辑器插件

    1.安装mavon-editor $ npm install mavon-editor --save 需要使用Markdown编辑器的页面js中: import { mavonEditor } fro ...

  8. SynchronizedMap和ConcurrentHashMap同步方式比较

      在开始之前,先介绍下Map是什么? javadoc中对Map的解释如下: An object that maps keys to values . A map cannot contain dup ...

  9. Django中的缓存的配置与使用

    一.使用装饰器 在文件开头导入下面代码,然后在函数上方添加缓存的装饰器 from django.views.decorators.cache import cache_page 一:在视图View中使 ...

  10. docker-io安装报错

    一般修改两个文件即可 1.文件 :/etc/docker/daemon.json { "storage-driver": "devicemapper" } 2. ...