Testops之路1.微服务与容器

背景

image

手工测试工程师在未来5年一定会消失。那么如何避免被消失,开启自我救赎之旅?

一起来做一个有存在感的测试工程师——点亮你的Ops能力。

下面这张图显示的是开发、测试和运维之间的关系。其中的 DevOps 是目前一个很热门的概念,而 QA+Ops 构成的 TestOps,在我眼里是未来的发展方向。原因是,随着自动化的深化,产品发布频率的提升,单纯拿到产品进行手动或者自动化测试的测试人员已经无法满足企业的需要。

image

TestOps 应该掌握哪些技能呢:

Dev 能力用于测试工具开发和运维工具开发,并不是业务代码开发。
Ops 能力用于微服务设施和基础设施搭建和维护,区别于运维人员的服务性能和安全性监控。
QA 基本具备的能力和整个测试体系的运用。

在传统的工作模式中,开发人员发布代码,测试人员进行测试,运维人员推广产品。这种模式的缺点是每个团队之间存在着很高的沟通成本,如下图所示。

image

而在未来的 TestOps 模式下,TestOps 人员要承担起测试、持续集成/交付和最终推广的职责。

image

这种模式对测试人员的技术水平提出了更高的要求,但是好处是非常明显的。

对于团队:

促进了合作,降低了交流成本;
更加有效地控制持续交付生命周期;
高质量的持续集成。

对于测试人员自己:

掌握了运维技能;
必须借助自动化测试来实现持续交付;
主动控制开发生命周期,在整个团队中有“存在感”。

什么是微服务

几年前,大多数软件应用程序都是巨大的整体,要么作为单个进程运行,要么作为分布在多个服务器上以多个进程方式运行。运行这样的应用程序通常需要少量功能强大的服务器,这些服务器能够为运行应用程序提供足够的资源。我们姑且在本文管它叫单片服务/巨石服务。

为了处理系统上不断增加的负载,您必须通过添加更多的cpu、内存、或通过设置其他服务器并运行应用程序的多个副本(向外扩展)来横向扩展整个系统。也就是俗话说的,靠堆机器来实现扩容。

如果单片服务的任何部分都不可伸缩,那么整个应用程序将不可伸缩,除非你能够以某种方式把它拆了。

将应用程序拆分为微服务

image
image

将应用程序拆分为微服务,每个微服务作为独立的流程运行,并通过简单、定义良好的接口(api)与其他微服务通信。因为每个微服务都是独立的流程,具有相对静态的外部API,所以可以单独开发和部署每个微服务。

image

在单片服务模式下,如果服务器资源不够了,需要做动态扩容,那么需要把单片服务作为一个整体来扩容。而各个微服务可以根据自己的需要,动态部署和扩容,压力大的服务多部署几个,业务压力小的服务少部署几个,完全根据自己的需要来。

不过微服务也有缺点。当系统仅由少量可部署组件组成时,管理这些组件很容易。当这些组件的数量增加时,与部署相关的操作变得越来越困难,因为不仅部署组合的数量增加了,服务和服务之间还存在依赖。

image

对于单片服务来说,它们的底层依赖是可控的。而在微服务架构下,由于各个业务团队所用的技术架构不同,底层库的依赖的版本会存在差异,各个业务团队所依赖的底层库版本不一的时候,对部署来说简直就是灾难了。

微服务对于QA

每个服务承担一定的职责:尽可能小,但是又达到必要的规模。服务的拆分,对于QA来说,部署环境会变的异常复杂。

微服务之间通常通过 Rest over HTTP 连接。为契约测试(Contract Test)提供了基础。

服务不一定提供用户界面。这意味着每种服务的测试,并不一定能够或者需要从 UI 完成。

微服务通常还可以划分为更小的模块。一个典型的微服务可以分为这几个模块:资源、业务逻辑、数据存储接口、外部通信接口等。每一层理论上都可以独立的被测试。

image

在微服务架构下,需要开发、测试、运维整个体系需要配合的更加紧密,所以运维开发Devops、测试运维Testops岗位应运而生!

什么是容器技术

在我理解,容器技术是虚拟化技术的一种,通过虚拟技术将物理资源做隔离,虚拟机和容器都可以完成这样的功能,但比起虚拟机,容器更轻量一些。

虚拟机和容器的结构差异


image

虚拟机和容器运行时的差异


image
image

虚拟机 利用 Hypervisor(虚拟机管理系统)在宿主机器和操作系统基础上创建虚拟层、虚拟操作系统。因为每个VM都运行自己的Linux内核,完全隔离。
容器 在宿主机、操作系统上安装容器引擎,在容器引擎的支持下安装镜像、运行容器。容器都调用同一个内核,会带来一定的安全风险。

为了在同一台机器上运行更多的独立进程,容器是更好的选择,为什么?因为便宜。

Docker

Docker是现如今最流行的容器引擎,几乎已经一统江湖,没有之一。Docker主要解决了复杂的环境配置管理问题,从各种 OS 环境到各种中间件环境以及各种应用环境。让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

image
image

Docker 就是是图中鲸鱼的角色,而鲸鱼之上的集装箱就是一个个容器,容器中装的就是我们开发的应用程序(不仅限于 Web 应用),每个容器都有自己独立的环境(环境设置、网络、文件系统...),互不干扰。而每个箱子,又可以打包成一个新的镜像,放到其它服务器的 Docker 环境中直接运行,不再需要重复安装程序运行环境。

Docker主要操作对象就是应用程序,主要干了三件事儿:打包分发运行。完成这三件事情,主要靠下面三个概念。

镜像(Images)

镜像是将应用程序及其环境打包到其中的东西。它包含应用程序可用的文件系统和其他元数据。

元数据,镜像名称、作者、维护的时间等

镜像仓库(Registries)

就如同用于代码管理的gitlab一样,镜像仓库是用来存储镜像的,镜像也可以被push和pull,它也可以设置权限,public权限的镜像可以公开下载,而private权限的镜像则需要权限验证。

容器(Containers)

Docker的容器通常是基于linux创建的。正在运行的容器是在运行Docker的主机上运行的进程,但是它与主机和在其上运行的所有其他进程完全隔离。这个进程也是资源受限的,这意味着它只能访问和使用分配给它的资源量(CPU、RAM等)。

通过下面这张图可以看出Docker的整个工作流程以及这三个组件之间的关系。


image

Docker安装

Linux

适用于Ubuntu,Debian,Centos等大部分Linux,一条命令搞定

curl -sSL https://get.daocloud.io/docker | sh

Mac和windows

Docker for Windows 在Windows上运行Docker。系统要求,Windows10x64位,支持Hyper-V。
Windows版下载

Docker for Mac 在Mac上运行Docker。系统要求,OS X 10.10.3 或者更高版本,至少4G内存,4.3.30版本以前的VirtualBox会与Docker for Mac产生冲突,所以请卸载旧版本的VitrualBox。
Mac版下载

安装完毕(mac示例)

image

配置加速源

image

daocloud的源是速度比较优秀的源,上面是mac版本的,其他版本的配置方法可以参考daocloud的源,也可以配置其他的源。

daocloud源配置


课后内容

非常好的官方的学习资料,交互式体验,建议学习
https://docs.docker.com/get-started/

Docker命令

分类
docker help
Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes
功能划分 命令
环境信息相关 1. info 2. version
系统运维相关 1. attach 2. build 3. commit 4. cp 5. diff 6. images 7. export/ import / save / load 8. inspect 9. kill 10. port 11. pause / unpause 12. ps 13. rm 14. rmi 15. run 16. start / stop / restart 17. tag 18. top 19.wait 20. rename 21.stats 22. update 23. exec 24.deploy 25.create
日志信息相关 1. events 2. history 3. logs
Docker Hub 1. login/ logout 2. pull / push 3. search

参考文献

《kubernetes.in.action》
微服务崛起下的Testops

你可能感兴趣的:(Testops之路1.微服务与容器)