我最近遇到了一个有趣的挑战。在我最近加入的一个项目中,一个团队想做一个 "提升和转移到云"。作为一名云原生工程师,我经常看到这种模式,虽然它的意思不尽相同。

设置

在这个特殊的案例中,该团队有3个较小的专业子团队来构建和测试该应用程序:一个负责前端,另一个负责后端,第三个负责为这两层编写测试。

如果你熟悉康威法则,你可能已经知道了这个应用程序的架构:一个使用React/Redux和很酷的UI控件构建的薄的前端应用程序;一个使用Spring Boot的Java构建的后端;以及第三个使用C#构建的应用程序(框架4.8),通过使用Selenium作为驱动的浏览器对测试环境执行测试。他们都有自己的代码库,并使用Azure管道来构建他们的代码。应用程序运行在内部服务器(物理机)上,团队会使用脚本(手动执行)复制二进制文件。他们一直在试验前端和后端应用程序的容器化,并计划开始在容器上运行,因为他们还计划升级后端的Java运行时间版本。

另一个经常看到的模式是 "既然我们在这里......"。客户想把他们的Docker镜像带入一个可管理的Kubernetes集群。IT部门已经通过Amazon Elastic Kubernetes Service(EKS)提供了一个多租户(基于命名空间)管理的Kubernetes集群,所以我们可以很容易地将我们到目前为止的东西部署到上述集群中。

但如何处理测试应用程序呢?请记住,他们使用的是微软.NET框架4.8,这是该平台仅有的Windows风味的最后一个版本。我曾经做过一些关于Windows容器的工作,但是这个团队还没有,其中一个挑战是UI测试应用需要启动浏览器来测试应用。

系好安全带

因此,首先,我们需要在一个容器内构建应用程序。为了做到这一点,我们开始使用微软的基本镜像mcr.microsoft.com/dotnet/framework/sdk:4.8。我个人更喜欢在Windows内部使用powershell,所以我也把默认的shell改为powershell。SHELL ["powerhell", "-command"]。然后,我们在镜像中复制了应用程序,并运行了构建命令。基本镜像已经有了所有的构建工具,所以我知道nuget(.NET的包管理器)和msbuild(微软构建引擎)都在那里。

随着测试应用程序在我们的Windows容器内构建,我需要使用一个多阶段的dockerfile,以便同时运行该应用程序。同样,请记住,我必须找到一个图像,让我们的应用程序能够启动Microsoft Edge,以便使用Selenium来成功测试前端应用程序。这有可能吗?令我惊喜的是,它是可能的。微软提供了一个带有Edge和msedgedriver安装的图像,可以与Selenium WebDriver一起使用,这正是我们需要的。所以现在我所要做的就是把编译好的二进制文件复制到这个新的镜像中,这样就可以了,对吗?

错了(当然)。这个镜像没有测试程序所需的运行时间。我试着用Chocolatey安装它,但即使是这样也没有。幸运的是,Chocolatey很容易安装,当你需要在Windows环境下安装软件时,它非常有用。因此,在安装Choco之后,我用它来安装.NET Framework 4.8运行时和.NET 5.0。为什么是.NET 5.0?因为用.NET 5.0运行测试要容易得多,只要运行dotnet test命令,.NET就会神奇地找到你的测试库,并选择正确的目标环境--在我的例子中,就是好的.NET框架4.8。

好了,Docker已经准备好了,但我们可以运行它吗?当然可以。亚马逊EKS提供了在你的集群中拥有Windows节点的选项,所以这只是一个使用正确的知名标签、注释和污点的问题。

我们现在有了正确的容器来运行我们的测试,但我们现在面临另一个问题。容器已经准备好作为一个工作来运行。当它开始运行时,它将运行测试,并在测试完成后终止。这导致了一个问题,因为测试结果是由本地文件系统中的dotnet命令生成的文件,在容器终止后不可能检索到。

为了解决这个问题,我们创建了一个作业,使用集群中的共享卷来运行指定的容器,以便用Nginx侧载另一个容器,暴露生成的测试结果。一个简单而有效的解决方案。

总结

如果你足够老,你可能认识到 "我喜欢计划成功的时候 "这句话。我们都喜欢事情按预期进行,甚至当路径与我们最初计划的不一样时更好。

在与这位客户的迭代结束时,结果是如此令人满意。我们有一个可管理的集群(AKS),当你不想担心某些事情(而决定担心其他事情)时,这是非常好的,有Linux和Windows节点,我们可以成功地部署他们的应用程序,在需要时运行测试(手动触发或由Jenkins管道触发),最新的测试结果总是作为静态Web应用程序提供。

用简单的解决方案来解决困难的问题是一种美,对吗?

在一个有一些Linux和Windows节点的集群中:我们的应用程序有两个部署;它们各自的服务:我们的测试工作和Nginx pod,有一个暴露它的服务。

Image from iOS-1

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐