Testing 在Kubernetes堆栈上运行集成/e2e测试

Testing 在Kubernetes堆栈上运行集成/e2e测试,testing,kubernetes,continuous-integration,Testing,Kubernetes,Continuous Integration,我一直在深入研究人们在Kubernetes环境下运行集成和e2e测试的方式,并对缺乏文档和反馈感到非常失望。我知道有一些很棒的工具,比如kind或minikube,可以在本地运行资源。但是在一个CI的上下文中,由于明显的资源原因,对于一系列服务来说,它似乎并不适合。我认为在以下方面运行测试有很大的机会: 验证舱单或舵图 作为更大整体的一部分验证组件的良好性能 验证产品的全局行为 这里的重点并不是关于测试框架,而是关于可以在其上运行测试的环境 你同意我的想法吗?您是否有过运行此类测试的经验?你

我一直在深入研究人们在Kubernetes环境下运行集成和e2e测试的方式,并对缺乏文档和反馈感到非常失望。我知道有一些很棒的工具,比如kind或minikube,可以在本地运行资源。但是在一个CI的上下文中,由于明显的资源原因,对于一系列服务来说,它似乎并不适合。我认为在以下方面运行测试有很大的机会:

  • 验证舱单或舵图
  • 作为更大整体的一部分验证组件的良好性能
  • 验证产品的全局行为
这里的重点并不是关于测试框架,而是关于可以在其上运行测试的环境

你同意我的想法吗?您是否有过运行此类测试的经验?你对此有什么反馈或见解吗


非常感谢您提出了一个有趣的问题,以及我在过去几个月为我的现任雇主所做的一些事情。本质上,我们以docker图像和清单的形式发布产品。在编写e2e测试时,我希望尽可能靠近客户环境运行产品

基本上,为了解决这个问题,我们构建了与标准云提供商(GCloud)交互的脚本,以创建集群,部署产品,然后对其运行测试

对于主要的云提供商来说,这不是一项困难的任务,但可能很耗时。在开发测试时,有几件事情是我们通过艰苦的方式学到的,需要牢记在心

  • 并发性,这听起来很明显,但请考虑您的CI可以运行的并发生成的数量
  • 从云端延迟,不要假设您将获得对您在云端运行的每个命令的即时响应。还要考虑一下超时。如果你推出的产品有很多吊舱和服务,那么可以接受的启动时间是多少
  • 导致构建失败的错误,这是一个有趣的错误。在与测试部署通信时,我们已经看到由于网络错误而导致的构建错误。这些几乎总是可传递的。最好避免这些错误导致构建失败
  • 需要注意的一点是GitLab提供了一些关于如何在CI管道中构建和测试映像的信息

  • 在我这方面,我使用特拉维斯ci。我在其中构建容器映像,然后在travis CI中运行带有kind()的k8s,然后启动e2e测试
    • 以下是此博客文章的一些附加信息:
    • 以及在travis ci中安装kind的脚本,共2行:。它允许在k8s端进行大量定制(启用psp,更改CNI插件)
    • 以下是一个例子:
  • 或者我使用Github Actions CI,它允许轻松安装kind:并提供大量功能,为开源项目提供免费工作节点
    • 以下是一个例子:
    请注意,Github action workers可能无法针对大型构建/e2e测试进行扩展。特拉维斯CI的规模相当不错

    据我所知,此工作流可以移动到内部部署的gitlab CI,您的应用程序可以在其中与网络中的其他服务交互


    一件有趣的事情是,你不必为你的CI维护k8s集群,kind会为你做的

    非常感谢您的回答@james wilson。这绝对是一个非常宝贵的经验反馈。你一定花了很多时间才准备好使用。实际上,我有两个问题可能与您的第二点和第三点有关:-关于您委托给云提供商的操作的延迟,加上堆栈的启动时间,整个CI管道需要多长时间才能完成?我不知道您是否已经到了开始运行太多服务的地步,但就时间而言,您如何将集群的创建/删除与服务的部署和测试的运行进行比较?-我的第二点是关于与集群的通信。你是如何做到这一点的?您是否声明了需要等待传播的DNS条目,或者您是否选择了另一种方式与您的内部服务通信?(例如,port forward或其他)感谢您抽出时间,我非常有兴趣了解这个话题的最新进展。嗨@vensa,很高兴这对我有所帮助。就运行测试所花费的时间而言,测试是最耗时的步骤,其次是启动产品,最后是设置/拆除集群。我们的整个CI管道相当复杂,不幸的是,我们以小时为单位度量时间:(通常花费时间试图使其更快!在通信方面,我们有点懒惰,只使用分配的外部IP地址(在服务定义中)WOW等待你的CI在几小时内完成运行肯定是痛苦的。你仍然认为它是一个有趣的点,以减少设置/拆分集群的时间为零吗?告诉我,如果我错了,但你得到你的服务的定义,并提取它的外部IP通信吗?nds是公平的,因为它满足了你的需要。我不认为有这种可能性。