docker搭建大规模测试环境的实践

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Docker是一个开源的应用容器引擎,第四范式资深测试开发工程师将从四个方面来分享关于docker搭建大规模测试环境的实践。

t0181401d889f562a45

内容来源:2017年4月8日,第四范式资深测试开发工程师孙高飞在“饿了么技术沙龙【第四弹】北京研发中心测试专场”进行《docker搭建大规模测试环境的实践》演讲分享。IT大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。

_

嘉宾分享视频地址:http://t.cn/R9UCnpq

困境

当今互联网行业发展迅速,产品架构逐渐复杂,导致环境搭建困难。

测试环境不一致。

因为搭建环境困难,环境不多,所以一套环境有多人使用,容易造成环境的互相踩踏问题。

随着业务的发展和时间的积累,我们发现case越来越多。我们希望能够用分布式的执行方式在多台机器上并发执行,以提升执行速度。但是测试机器稀缺,速度依然无法提升。

解决方案

自动化

搭建一个环境必须做到一键部署,在迁移、实践和删除环境中也要做到自动化。

标准化

标准化用来解决测试环境不一致的问题。我们希望测试环境、开发环境甚至生产环境都是一致的。

集群化

根据以往的经验发现,测试资源是一种比较稀缺的资源。要把测试环境扩展到一定的量级,使稀缺资源变成普通的、人人都能简单获取的一种资源,这样就省去了复杂的流程和排队等待的过程。

DOCKER

容器技术相较于虚拟机来说还是非常节省资源的。Docker不需要运行完整的操作系统。在一个宿主机上运行的所有容器都是共享宿主机的内核,所以每启动一个容器,都比虚拟机节省了一个内核的空间。

简化了运维成本,极大降低部署环境的学习门槛。

假如公司新进了一批机器,要把环境迁移到某些环境上来,只要把它做成镜像,就可以很方便地进行迁移。而且这些镜像都是一致的,通过制作镜像可以解决标准化的问题。

容器的启动速度和删除速度都是秒级的,有些不是长时间运行的服务在用完后就能将其删除。这样docker的宿主机就始终能保持一个低压力的状态。

1

把应用程序当成一个个集装箱,全都放在docker里。主要是放基础容器、测试环境和测试执行机器。也可把执行测试机器全部制作成镜像,在需要使用的时候启动它并放进docker里。

网络的玩法

端口映射

在docker默认的启动模式是bridege模式的情况下,docker为我们创建了一个叫docker0的网桥,这个网桥专门负责为容器进行转发。它会给容器分配很多虚拟IP,但这些IP只能在容器内部沟通使用。要是想与容器进行通讯,最常用的方法就是端口映射,把容器端口映射到宿主机上。

2

这种方式的优点是简单,不用做任何配置。当然它的缺点也很明显,要维护一个很庞大的端口列表,记住每一个环境容器的端口是什么,对外暴露的端口是什么。

固定IP

我们希望这些容器能像虚拟机一样,给它分配真实的IP去访问它。但这个做法会稍微有些麻烦,docker不支持这样做,我们需要利用一些转化规则。

3

创建一个新的网桥br0,给它分配一个真实的IP,把宿主机的网卡挂到网桥上,同时改变docker的启动参数,默认启动的时候连到br0上。重新划分网段,把所有容器的网段全都分配成和宿主机在相同的网段上。这样启动容器时分配的就是真实IP,并与宿主机相处于同一个网段。

这种方式让外界用户感受不到是在使用容器还是虚拟机,是对测试环境非常友好的一种方式。

但它并不适合在大规模的测试环境中使用。所有环境都有了真实IP,都被放到了真实的网络环境中,如果容器太多就会出现广播风暴的问题。

环境部署

Container模式

Container模式的特点是可以把所有容器绑定到一个IP地址上。

4

虽然所有模块都装在不同的容器里,但它们都有同样的IP,只是它们用不同的端口对外暴露服务。

它的优点是配置管理,效率高,是对开发最友好的一种模式。

缺点是标准化。因为我们公司产品的一些特性,产品环境并不是这样去部署的,所以可能会出现环境不一致带来的一系列问题。

打包模式

有多少模块就并发启动多少容器,这些容器的网络模式可以用host。Host的特性是把所有容器的网络环境挂载到宿主机上。把这些并发编译后上传到FTP上,然后启动一个或多个部署容器。

5

打包模式的优点就是标准化。但它的效率不如Container模式高。

存储的玩法

外部存储

把数据库放到容器外面,在容器内部和数据库进行沟通,保证数据库不会造成数据的丢失。

6

Volume存储

这是docker比较推荐的一种方式。它允许把容器中的某个路径挂载到外部设备上。比如挂载到宿主机上,容器实时向文件中写数据,宿主机上同时也会保存这份数据。

7

集群

我们想要提供一个统一接口去管理集群上所有节点,所以考虑使用一些开源的分布式框架。目前在业界最火的三种框架就是mesos、Kubernetes、swarm mode。

Mesos诞生的时间非常早,专注于资源调度,后来docker火了之后才兼容了docker。它的调度框架的二次调度,只装一个mesos是不够的,还依赖于很多其它的东西。Mesos发展得越来越复杂,需要专业运维去支持,所以mesos并不适合作为测试环境的框架来使用。

Kubernetes是google内部集群框架block的一个开源版本。它当时是为docker设计的,而现在Kubernetes慢慢开始兼容其它平台。Kubernetes原本应该是最复杂的集群管理框架,google提供了客户端工具,把很多内部细节封装起来,简化了它的使用方式。它最近推行的容器化部署也极大降低了Kubernetes的使用门槛。

Swarmmode是从docker1.12版本开始内置到docker引擎当中的,非常简单。它把所有需要的东西全都内置到了一条命令上。只要运行一次这条命令,所有的服务发现、跨节点沟通等等的负载均衡都已经做好了。Swarm mode是三种框架中最简单的一种,但并不灵活,功能也没有那么强大了。

K8S基本概念

POD

8

Pod是Kubernetes一个逻辑的概念,是一组容器的组合,是Kubernetes在一个节点上控制的最小的逻辑单元。

Deployment

可以把Deployment看成一个守护进程,如果把一个Pod挂载到Deployment上面,它能保证Pod始终运行。要是监控到定义的这组Pod某一个节点挂了,容器也都挂了,它会利用调度系统找一个合适的节点启这些Pod。Deployment可以关联多组Pod。

Service

Service同样可以关联到多组环境上,帮我们做负载均衡。当有请求过来的时候,Service会自动分配到各种不同的Pod上去。假如出现了运维事故或IT事故,一个节点挂了,它会自动切换到其它几个节点的容器上去运行,不会影响到它的服务,保证了PM的环境是始终存在的。

安装服务

从单点扩展到集群,复杂度就提升了。

首先要关注的就是跨主机通信问题。Docker分配的是虚拟IP,只能在一个节点的容器中互相沟通。扩展到集群之后,要装一个网络插件来解决问题。

容器之间要互相沟通,必须知道对方的IP地址。Docker在每次启动的时候IP地址都会改变,要有一个DNS去注册域名,在配置文件中做通讯的时候执行这个域名就可以了。

要知道容器运行消耗了多少资源,应该再安装一个服务来做容器级的监控。

Docker变向集群化的时候,就面临了镜像如何在每一个节点上进行分发的问题。所以要有一个镜像仓库来存放所有镜像,每个节点都会拉最新镜像进行部署。

9

以上是我今天分享的内容,感谢聆听!

_

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
17天前
|
jenkins 测试技术 持续交付
提升软件测试效率的创新实践
在软件开发过程中,测试环节扮演着至关重要的角色。本文探讨了如何通过创新的方法和工具,提高软件测试的效率和质量。我们将从自动化测试、持续集成与持续部署(CI/CD)、测试驱动开发(TDD)三个方面,详细介绍这些技术如何改变传统的测试流程,帮助团队更快地发现和修复缺陷,最终实现更高质量的软件交付。
137 67
|
3天前
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
17 2
|
11天前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
21天前
|
SQL 测试技术 持续交付
探索软件测试的多维度——从理论到实践
【9月更文挑战第35天】在软件工程的世界中,测试是一个不可或缺的环节。它不仅保障了软件产品的质量,而且确保了用户体验的一致性和可靠性。本文将从不同的角度切入,探讨软件测试的多个方面,包括测试的目的、类型、工具以及最佳实践。通过深入浅出的方式,我们旨在为读者提供一个全面的测试知识框架,帮助他们更好地理解并执行软件测试工作。
28 2
|
8天前
|
测试技术 UED
软件测试的艺术与实践
【10月更文挑战第9天】 在数字时代的浪潮中,软件成为了我们生活和工作不可或缺的一部分。然而,高质量的软件背后,是无数测试工程师的默默付出。本文将通过深入浅出的方式,探讨如何进行高效的软件测试,确保软件产品的质量与稳定性。我们将一起揭开软件测试的神秘面纱,从基础理论到实际操作,一步步走进这个充满挑战与创造的世界。
|
7天前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在软件测试中的创新应用与实践###
本文旨在探讨人工智能(AI)技术如何革新软件测试领域,提升测试效率、质量与覆盖范围。通过深入分析AI驱动的自动化测试工具、智能化缺陷预测模型及持续集成/持续部署(CI/CD)流程优化等关键方面,本研究揭示了AI技术在解决传统软件测试痛点中的潜力与价值。文章首先概述了软件测试的重要性和当前面临的挑战,随后详细介绍了AI技术在测试用例生成、执行、结果分析及维护中的应用实例,并展望了未来AI与软件测试深度融合的趋势,强调了技术伦理与质量控制的重要性。本文为软件开发与测试团队提供了关于如何有效利用AI技术提升测试效能的实践指南。 ###
|
12天前
|
测试技术
软件测试中的探索性测试(ET)实践
【10月更文挑战第5天】本文将深入探讨一种与传统脚本化测试不同的测试方法——探索性测试(Exploratory Testing,简称ET)。我们将通过一个实际案例来展示ET的有效性,并分享如何将ET融入日常的软件测试流程中。文章旨在为测试人员提供一种灵活、高效的测试策略,帮助他们更好地发现软件中的缺陷。
|
8天前
|
运维 JavaScript 虚拟化
探索容器化技术:Docker的实践与应用
【10月更文挑战第9天】探索容器化技术:Docker的实践与应用
33 3
|
12天前
|
Web App开发 设计模式 测试技术
自动化测试框架的搭建与实践
【10月更文挑战第5天】本文将引导你理解自动化测试框架的重要性,并通过实际操作案例,展示如何从零开始搭建一个自动化测试框架。文章不仅涵盖理论,还提供具体的代码示例和操作步骤,确保读者能够获得实用技能,提升软件质量保障的效率和效果。