kubernetes自动测试Sidecar模式实践

容器云平台的持续部署(CD)中我们是通过编排任务成流水线的方式实现的,流水线按顺序执行编排的任务,当前支持的任务包括构建、升级、自动测试等。本文档主要描述自动测试任务的设计实现过程。平台的自动测试功能是基于Docker和kubernetes技术实现。平台中的自动测试过程包括自动化测试镜像制作、自动化测试容器部署、自动化测试脚本执行、自动化测试结果上传及下载。

自动化测试镜像制作

由于Docker容器与主机共享内核,因此非内核强相关的测试任务都适合改造成Docker镜像,如软件测试、接口测试、自动化测试、性能测试等

测试镜像制作

制作测试镜像时可以根据测试需选择操作系统、安装依赖环境、安装测试工具等。可用通过创建Dockerfile文件,并通过docker命令生成测试镜像。如图:

           kubernetes自动测试Sidecar模式实践_第1张图片

以集成jmeter测试工具为例,Dockerfile如下:

# JDK-8 alpine

From openjdk:8-alpine

 

ENV JMETER_VERSION 3.3

 

RUN apk update && apk add wget unzip

 

ADD apache-jmeter-3.3.tgz /jmeter/

 

# Setting Home

ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/

 

# Finally Adding Jmeter to the Path

ENV PATH $JMETER_HOME/bin:$PATH

 

 

测试镜像集成jemter脚本

基于上述集成了jmeter工具的镜像我们制作包含jmeter测试脚本的镜像。不同的测试任务根据需要集成不同的测试脚本,集成测试脚本的目标镜像就可用于自动化测试。Dockerfile如下:

# from jmeter image

From jmeter:3.3

 

ADD test.jmx /test-script/

 

 

自动化测试设计说明

在容器云平台的自动化测试任务中需要完成测试容器启动、测试脚本执行、测试结果上传下载等。需要考虑如下问题:

  1. 测试脚本如何触发执行
  2. 测试任务何时执行结束以收集结果
  3. 测试结果如何收集及上传

基于上述的需求,在不侵入测试镜像的前提下,我们需要设计一个辅助的镜像完成测试任务状态监测和测试结果收集上传。

 

实现技术说明

自动测试功能设计过程中我们结合了docker和kubernetes技术特性。在kubernetes中提供pod技术,Pod 是由一有耦合关系的容器组成的容器组,因此Pod 就是多个 Docker 容器的载体。 pod有如下特性:

  1. Pod 中的所用容器会被一致调度、同节点部署
  2. 所有容器共享同一个 IP 地址和端口空间
  3. 所有容器之间共享存储卷
  4. 容器之间可以通过 IPC通信

如下图:

                 kubernetes自动测试Sidecar模式实践_第2张图片

 

测试如何结果收集

       基于同一pod共享存储的特性,我们提供一个辅助镜像和测试镜像一起组成一个pod共享存储空间。因此辅助镜像可用访问共享存储的测试结果。如图:

                    kubernetes自动测试Sidecar模式实践_第3张图片

 

测试任务何时结束

在pod有多个容器的情况下,如果部分容器正常完成退出则pod状态显示为completed。在pod的状态包括:

  1. 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。 等待时间包括调度 Pod 的时间和通过网络下载镜像的时间
  2. 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态
  3. 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启
  4. 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止
  5. 完成(Completed):Pod中部分容器正常结束退出,并且至少有一个容器正在执行。
  6. 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败

下图是Pod的生命周期示意图,从图中可以看到Pod状态的变化。

kubernetes自动测试Sidecar模式实践_第4张图片

 

我们设计测试镜像为job类型, 即容器执行测试任务完成后自动结束。 这样我们就可以查询pod中测试容器运行状态判断测试任务是否结束.

如何保证pod中测试任务完成后不被回收

我们知道kubernetes管理pod时,如果pod执行结束将会被回收释放资源。那么如果保证pod中测试任务完成后不被释放呢?我们提供如下方法:

  1. 测试镜像为job类型,测试脚本执行完毕时测试容器正常退出,pod状态为completed
  2. 设计sidecar辅助镜像为常驻服务,阻塞pod结束
  3. 实现外部监测服务周期查询pod状态并分析处理
  4. Pod中测试容器状态为Completed时执行测试结果收集
  5. 通过提供sftp无密码上传文件方法通过脚本上传脚本到文件服务器
  6. 通过文件服务器提供下载结果文件功能

监测服务周期查询pod状态,当pod中测试容器状态为Completed时,调用pod中服务镜像容器收集结果并上传。流程如下:

kubernetes自动测试Sidecar模式实践_第5张图片

 

FAQ

自动测试pod状态Error问题

  • 问题描述

      我们发现有些情况下自动测试Pod创建失败,pod状态显示Error

  • 测试验证
  1. 当pod只包含自动测试容器时正常,包含两个容器时Error。
  2. 修改pod中自动测试执行命令如echo ‘test’ > /home/result/t.txt,pod在两个容器时正常运行
  • 问题分析

       考虑出现问题的自动测试镜像命令工具都是安装到共享目录/home/,怀疑在pod包含两个容器时如果测试工具安装到共享目         录会到账命令无法执行

  • 问题修复

      重新制作自动测试镜像,把测试工具安装到非共享目录/home/,验证成功

 

你可能感兴趣的:(kubernetes自动测试Sidecar模式实践)