热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

15虚拟机技术与容器技术的应用

在前面几讲中,我介绍了CICD、DevOps中的测试基础设施,测试基础设施的搭建离不开计算资源的支持,测试基础设施越庞大,我们对计算资源的需求就越多。早期的计算资源指的是物理上的主

在前面几讲中,我介绍了 CI/CD、DevOps 中的测试基础设施,测试基础设施的搭建离不开计算资源的支持,测试基础设施越庞大,我们对计算资源的需求就越多。早期的计算资源指的是物理上的主机服务器、网络或存储硬件设备;如今的计算资源可以通过虚拟化技术进行“云化”,即将实体资源(如 CPU、内存、硬盘和网络等)抽象成数字的或逻辑的资源,用户可以用更好的组态方式来使用这些资源,使资源分配、获取与管理更高效。

        今天这一讲,介绍虚拟化技术、容器技术在测试中的应用,比如虚拟化环境中如何优化测试环境的性能、如何实现微服务虚拟化;最后,还会讲到云测试平台的应用。

        早期的测试环境都是搭建在一个个物理机器上的,在测试过程中,如果怀疑测试环境有问题,就得从头再装一遍;在测试中发现了缺陷,常常需要在另一套测试环境里重新执行一遍,排除环境不一致带来的问题,因为手工安装方式容易带来不一致性的问题。

        为了执行功能的兼容性测试,也需要找到几台机器安装不同的操作系统,耗费不少时间;如果做性能测试,需要把系统部署到多台机器上,一台一台地安装和维护,更加耗时耗力。


虚拟化技术——虚拟机和容器技术

         虚拟机技术的出现是一个很大的进步,能够帮助我们解决上述问题。它是在原有硬件和软件之间又加了一层软件,其核心是 Hypervisor(分层应用程序、虚拟层),对硬件资源进行模拟,模拟的硬件平台又提供了对物理硬件的访问。当服务器启动并执行 Hypervisor 时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统(Guest OS)。每台虚拟机由一组虚化设备构成,各个虚拟机之间的资源是相互隔离的,各个操作系统之间的进程和用户权限也是相互隔离的。如果你需要一台 CPU 4 核、内存 8G、硬盘 60G 的设备,就可以用虚拟机软件定制这样一台虚拟机。在使用中若发现资源不够了,还可以随时调整,只要不超过这台物理机的最大资源能力即可。

         这样,虚拟机技术为软件测试解决了两个难题:



  • 通过虚拟机技术,一台物理机可以虚拟出多台服务器,这样就可以安装多个不同的操作系统;

  • 只要在一台虚拟机上部署好所需的操作系统和测试环境,就可以制作出镜像文件部署到其他虚拟机上,不用再担心人工部署造成的错误和测试环境不一致的问题,测试环境的恢复也可以用镜像文件来完成,几分钟就可以搞定。

        另外,虚拟机技术可以大大提高测试服务器的利用率并节省测试环境的维护成本,因为资源可以快速地实现动态分配,物理机器需要的数量也大大减少,需要的机柜、网线、电量则更少。 目前比较流行的虚拟机技术是 X86 平台的 Linux 虚拟机解决方案,主要的软件包括 VMware Workstation、KVM、Virtual Box、Xen 等。但是在虚拟机的使用过程中,人们逐渐感觉到这种技术的缺点:每个虚拟机都需要一个操作系统,操作系统占用的资源比较大、启动速度慢。在实际的软件运行环境中,我们其实不需要关心操作系统及其依赖环境,有没有什么方法让我们无需关注系统环境的配置,只关注应用系统本身?

        这就是容器技术可以解决的问题:在操作系统之上,每个容器内运行一个应用,通过 Linux 的命名空间(NameSpace)技术实现应用之间既相互隔离又相互通信,底层的系统环境可以共享。

                                                                                     图1 虚拟机技术和容器技术的比较

        Docker 最初是一个开源的容器项目,诞生于 2013 年,现在几乎成了容器的代名词,容器技术最早可以追溯到 1982 年,但一直没有形成一个标准且提供良好的管理工具。而 Docker 真正实现了对应用的打包、分发、部署、运行的全面管理,达到了应用级别的“一次封装,到处运行”,所以它成为了事实上的工业标准。

         相比虚拟机分钟级别的部署来说,Docker 容器的创建和启动更快,是秒级的部署。Docker 的镜像体积要小很多,对系统资源的占用更少,一台主机上可以安装 10 ~ 20 台虚拟机,但是可以运行几千个、甚至上万个 Docker 容器。另外,Docker 通过 Dockerfile 对容器进行灵活、快速的部署,结合 CI/CD 的其他工具实现了应用级别的持续交付和集群管理,这将在第 17 讲中进一步讲解。

        虽然 Docker 和虚拟机相比有很多优点,但并不是说 Docker 一定会取代虚拟机。实际上,它们可以是共生的模式,企业可以把 Docker 部署在物理主机上,也可以部署在虚拟机上。


Sidecar 模式——容器的设计模式

         目前微服务都会用到容器技术进行部署和管理。每个微服务的主要功能是处理业务逻辑,但是也需要处理一些和业务无关的任务,比如监控容器的工作状态、日志收集等。Sidecar(边车)模式提出了一种新的容器和微服务架构的设计模式,可以实现辅助功能与业务功能的分离:把辅助功能用单独的微服务实现,与实现业务功能的微服务部署在各自的容器中。

         Sidecar 容器和业务主容器一起部署在同一个 Kubernetes Pod 里,为业务容器提供辅助功能。这种设计方式有非常明显的优势,将辅助功能与业务功能解耦,业务主容器只需要关注业务的实现,而且 Sidecar 容器可以被多个业务主容器甚至是多个业务系统复用。因此,Sidecar 的设计模式被认为是下一代微服务架构的关键。

                                                                                           图2 Sidecar 容器设计模式


虚拟化技术之 NUMA 和 DPDK

        下面将介绍 Linux 环境下系统性能优化相关的两项技术。如果你负责软件系统的性能测试,或者遇到系统 CPU 占用过高而导致的系统功能异常,你就会用到这些知识点。首先介绍 NUMA(Non-Uniform Memory Access,非一致性内存访问),它是一种支持对主机系统多 CPU 进行集群配置的技术,是现在主机系统的主流 CPU 架构。利用 NUMA 技术,可以把几十个 CPU 组合在一台服务器内,将 CPU 和内存划分到多个节点(node),如图 3 所示。

        每个 CPU 都可以访问本节点内的内存,也可以访问其他节点的内存,但是访问自己节点内的内存要快得多,所以,在 NUMA 架构的主机上,系统性能优化的一个方面就是让 CPU 尽量访问自己节点内的内存。

 

                                                                                                               图3 NUMA 工作示意图

         在虚拟机环境下可以实现同一个虚拟机的所有虚拟 CPU(vCPU)尽可能调度到同一个物理 CPU 上,并且将这个虚拟机的所有“物理内存”尽可能分配给和物理 CPU 属于同一节点的内存,从而有助于提高虚拟机的性能。Linux 提供了一个用于性能调优的工具 Numactl,通过它可以查看系统的 NUMA 状态,可以将一个进程绑定在某个节点上执行。下面是一些 numactl 常用的命令:

如果是 Linux 系统上的 Docker 环境,默认情况下,容器可以使用的主机 CPU 资源是不受限制的,但是一旦发生容器内程序异常使用 CPU 的情况,很可能把整个主机或虚拟机的 CPU 资源耗尽。可通过 Docker 命令来限制某个容器使用 CPU 的个数,以及使用哪个节点的 CPU 或内存。

其次介绍 DPDK (Data Plane Development Kit),它是一种 X86 平台上报文处理加速技术,在 Linux 虚拟化环境中通过绑定和优化物理网卡驱动,优化了数据包处理的效率,提高 I/O 性能。我们可以从 DPDK 官网下载其安装包进行安装配置,这样就可以让 DPDK 接管网卡。


服务虚拟化的利器——Hoverfly

        微服务架构是目前最流行的软件架构风格,一个软件系统由多个相互独立的微服务组成,每个微服务可以独立开发、独立部署。微服务之间通过轻量级的交互机制进行通信,比如 HTTP 协议的 Restful API。微服务之间在业务上存在依赖关系,大多数的业务场景需要多个微服务互相调用来完成。这就给我们的测试带来挑战:当某个微服务所依赖的其它两个微服务处于不稳定或不可用状态时,如何对这个微服务进行测试?你可以创建 Mock Service 来模拟依赖的两个微服务,然后针对微服务进行单元测试或接口测试,比如像 WireMock 这样的测试框架;你也可以选择 Hoverfly 这样的服务虚拟化工具来模拟依赖服务,服务虚拟化是指用来模拟特定服务行为的技术和方法。

Hoverfly 提供的功能包括:



  • 可以在微服务测试中捕获 / 模拟多个实际服务,不需要自己编写请求和响应的脚本;

  • 可以在持续集成环境中替代缓慢和不稳定的外部服务;

  • 可以模拟网络延迟,随机故障或速率限制以测试边缘情况;

  • 导入 / 导出、共享和编辑 API 模拟数据。


                                  图4 Hoverfly 捕获模式和模拟模式

        当 Hoverfly 处于捕获模式,它可以捕获到服务的请求和响应,并随后导出到一个 .json 文件。把 Hoeverfly 切换到模拟模式,就可以模拟刚才的服务做出响应,如图 4 所示,相关命令如下所示:


Molecule——虚拟化技术的自动化测试工具

        Molecule 是一个开源的软件工具,可以帮助开发和测试 Ansible 在部署中用到的配置脚本。Ansible 在 Devops 工具链里是一个自动化的部署工具,主 playbook 文件通过调用 roles 目录下的 role,来实现各种灵活多变的部署需求。你可以为每一个微服务的容器创建一个 role,部署的具体任务在 role 里进行定义。Molecule 在虚拟机或容器上为正在运行的 Ansible Role 测试构建脚手架,无需再手工创建这些测试环境。

                                                                         图5 Molecule 工作流程

Molecule 利用 Vagrant、Docker 和 OpenStack 来管理虚拟机或容器,并支持 Serverspec、Testinfra 或 Goss 来运行测试,如图 5 所示。在 sequence facility model 中的默认步骤包括:虚拟机管理、Ansible 语法静态检查、幂等性测试和收敛性测试。
运行 molecule 的脚本如下所示:

运行的测试脚本如下所示:


Kubernetes 与测试环境

         为了支持大规模的并发业务,企业一般都需要把服务部署到容器集群。Kubernetes(简称 K8s)是目前最具影响力的容器集群管理工具,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性,所以,它可用于部署和管理容器化的测试环境,尤其是性能测试环境和准生产环境。

         Kubernetes 提供的管理能力能够很好的支持业务的可伸缩性(Scalability)。伸缩性是指:如果系统的工作负载增加,只需生成更多容器或者在容器集群中增加更多的节点就可以提高整个集群的处理能力。


                                                                         图6 Kubernetes 容器集群管理

        另外,云测试平台是 Kubernetes 进行测试基础设施管理的典型场景。云测试平台是云计算和虚拟化技术在软件测试领域的应用,通过虚拟机、容器技术及容器集群管理工具来搭建测试基础设施,然后按需提供给用户各种测试服务。目前云测试平台主要支持手机端 App 和 Web 应用的测试,比如兼容性测试、功能测试、性能测试、安全测试等。用户通过浏览器上传被测应用、测试脚本,使用云测试平台提供的测试工具进行测试,测试结束后下载测试结果。

        最后,简单总结一下今天的主要内容:



  • 相比虚拟机,Docker 技术是更加轻量级的虚拟化技术;

  • Sidecar 做为一种新的容器和微服务设计模式,实现了辅助功能对业务功能的解耦,也实现了辅助功能在不同微服务之间的重用;

  • 理解 NUMA 技术可以帮助你在 Linux 环境下更好的对系统进行性能优化;

  • 在微服务测试中,服务虚拟化的工具 Hoverfly 可以用来模拟多个依赖服务的行为;

  • Molecule 利用虚拟化技术实现对 Ansible 配置信息的自动化测试;

  • Kubernetes 提供的容器集群管理可以用来部署和管理容器化的测试环境。



推荐阅读
  • 持续集成概述与实践指南
    本文探讨了持续集成(CI)的基本概念、目的及其在现代软件开发中的应用。通过实例分析,帮助读者理解如何有效实施持续集成,提高软件开发效率。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文详细介绍了 Flink 和 YARN 的交互机制。YARN 是 Hadoop 生态系统中的资源管理组件,类似于 Spark on YARN 的配置方式。我们将基于官方文档,深入探讨如何在 YARN 上部署和运行 Flink 任务。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • 解读 DevOps:开发与运维的融合之道
    近年来,随着信息技术的快速发展,DevOps作为一种新的IT管理理念逐渐受到重视。本文将探讨DevOps的核心概念及其对现代企业的重要意义。 ... [详细]
  • 点击上方“中兴开发者社区”,关注我们每天读一篇一线开发者原创好文DevOps微课系列旨在帮助用户学习DevOps实践。1概述    本文详细介绍一般开发人员使用Gerrit代码评审 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 新浪微博热搜暂停更新;即刻APP回归;Android 11 Beta版发布 | 科技新闻速递
    为您带来最新的科技资讯,涵盖社交媒体动态、软件更新及行业重大事件。CSDN携手您共同关注科技前沿。 ... [详细]
author-avatar
小赖小燕_380
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有