写点什么

基于 ArgoCD 和 Testkube 打造 GitOps 驱动的 Kubernetes 测试环境

作者:俞凡
  • 2024-12-30
    上海
  • 本文字数:3656 字

    阅读完需:约 12 分钟

本文介绍了一项新工具,可以基于 Gitops 手动或者自动实现 Kubernetes 集群应用测试,确保集群的健康状态与 Git 仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD + Testkube

简介:GitOps 云原生测试面临的挑战

现代云原生应用开发的主要趋势之一是采用 GitOps,即用 Git 管理 Kubernetes 集群状态,GitHub 和 GitLab 等现代化 Git 平台在工作流、审计、安全、工具等方面提供了各种功能。ArgoCD 或 Flux 等工具可用于保持 Kubernetes 集群与 Git 仓库同步的繁重工作,一旦发现 Git 与集群存在差异,就会立即部署,以确保仓库是运行时环境的真实来源。


你是否同意现在也是时候将测试和相关活动纳入这一范例了吗?没错!Kubeshop 正在努力为你提供首个 GitOps 友好的云原生测试协调/执行框架--Testkube,以确保质量保证工作与这一全新的应用程序配置和集群配置管理方法保持一致。结合上述 GitOps 方法,Testkube 将在集群状态中包含测试工件和应用程序配置,并使 git 成为这些测试工件的真实来源。


GitOps 方法的优势:


  • 由于测试包含在集群状态中,因此可以随时验证应用程序组件/服务是否按要求运行。

  • 由于测试是在集群内部执行的,因此没有必要纯粹为了测试而从外部暴露被测服务。

  • 集群中的测试始终与用于编写测试的外部工具同步。

  • 测试执行并非严格与 CI 绑定,也可手动触发以进行临时验证,或通过内部触发器(Kubernetes 事件)触发

  • 可以利用 Postman 或 Cypress(甚至用于端到端测试)或其他执行器插件的现有自动化测试用例。


从概念上讲,这可以说明如下:




GitOps 教程

话不多说,让我们来看看实际操作。下面是一个逐步演练的过程,以便在本地 Minikube 集群中自动部署应用程序和以及 Postman 集合,并进行测试。


我们从设置 GitOps 驱动的测试环境开始!

GitOps 测试的前提条件

首先遵循文档安装 minikube。


然后按照 ArgoCD 安装指南安装 ArgoCD。


注:对于其中第 3 步"访问 Argo CD API 服务器",请选择"端口转发"方法,因为这是用 Minikube 集群连接 Argo CD API 服务器的最简单方法。


按照文档安装 Testkube,确保在集群中安装 CLI 客户端和组件。

设置"Hello Kubernetes"应用程序和测试
  1. 在集群中安装"Hello Kubernetes!"应用


我们将为一个简单的"Hello Kubernetes"应用程序创建 YAML 文件,然后根据该文件创建集成测试。


apiVersion: v1kind: Servicemetadata: name: hello-kubernetes-servicespec: ports: - name: http port: 80 targetPort: 8080 selector: app: hello-kubernetes - -
复制代码


然后用以下方法部署 Hello Kubernetes


kubectl apply -f hello-kubernetes.yaml
复制代码


运行以下程序来测试应用程序是否已正确安装:


minikube service hello-kubernetes-service‍
复制代码


  1. 建立包含 Postman 程序集的 Git 仓库


我们将使用 Postman 创建并导出到 Postman 集合文件中的测试。


可以将其上传到与应用程序相同的 Git 仓库,但实际上,该仓库可以是托管应用程序的同一仓库,也可以是管理所有测试工件的单独仓库。


创建 hello-kubernetes.json,并将其推送到仓库中:


{  "info": {    "_postman_id": "02c90123-318f-4680-8bc2-640adabb45e8",    "name": "New Collection",    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"  },  "item": [    {      "name": "hello-world test",      "event": [        {          "listen": "test",          "script": {            "exec": [              "pm.test(\"Body matches string\", () => {",              "    pm.expect(pm.response.text()).to.contain(\"Hello Kubernetes\")",              "})",              "",              "pm.test(\"Body matches string\", () => {",              "    pm.expect(pm.response.status).to.equal(\"OK\")",              "})"            ],            "type": "text/javascript"          }        }      ],      "request": {        "method": "GET",        "header": [],        "url": {          "raw": "http://hello-kubernetes-service.default",          "protocol": "http",          "host": [            "hello-kubernetes-service",            "default"          ]        }      },      "response": []    }  ]}
复制代码


可以在 Github 上看到该仓库的完整示例。

配置 ArgoCD 与 Testkube 协同工作
  1. 配置 ArgoCD 以使用 Testkube 插件


要让 ArgoCD 使用 Testkube,需要将 Testkube 添加为插件。为此,请将插件配置文件嵌套到 plugin.yaml 下的 ConfigMap 清单中。


apiVersion: v1kind: ConfigMapmetadata:  name: argocd-cm-plugin  namespace: argocddata:  plugin.yaml: |    apiVersion: argoproj.io/v1alpha1    kind: ConfigManagementPlugin    metadata:      name: testkube    spec:      version: v1.0      generate:        command: [bash, -c]        args:          - |            testkube generate tests-crds .
复制代码


然后执行以下命令应用:


kubectl apply -f argocd-plugins.yaml
复制代码


我们通过 testkube 命令生成 tests-crds 创建自定义资源(清单),然后 ArgoCD 会将其添加到集群中。


‍要安装插件,请为 argocd-repo-server 部署打上补丁,使其作为边车运行插件容器。


apiVersion: apps/v1kind: Deploymentmetadata:  name: argocd-repo-serverspec:  template:    spec:      containers:      - name: testkube        command: [/var/run/argocd/argocd-cmp-server]        image: kubeshop/testkube-argocd:latest        securityContext:          runAsNonRoot: true          runAsUser: 999        volumeMounts:          - mountPath: /var/run/argocd            name: var-files          - mountPath: /home/argocd/cmp-server/plugins            name: plugins          - mountPath: /home/argocd/cmp-server/config/plugin.yaml            subPath: plugin.yaml            name: argocd-cm-plugin          - mountPath: /tmp            name: cmp-tmp      volumes:        - configMap:            name: argocd-cm-plugin          name: argocd-cm-plugin        - emptyDir: {}          name: cmp-tmp
复制代码


使用以下命令打上补丁:


kubectl patch deployments.apps -n argocd-repo-server — patch-file deployment.yaml
复制代码


创建包含 ArgoCD 应用程序的文件:


apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata: name: testkube-tests namespace: argocdspec: project: default source:   repoURL: https://github.com/USERNAME/testkube-argocd.git   targetRevision: HEAD   path: postman-collections   plugin:     name: "testkube-v1.0" destination:   server: https://kubernetes.default.svc   namespace: testkube
复制代码


请注意,我们定义了path: postman-collections,这是包含前面步骤中 Postman 集合的测试文件夹。在 Testkube 中,可以使用多个测试执行器(例如 curl),因此为每个执行器定义一个文件夹非常方便。我们还将 .destination.namespace 定义为 testkube,也就是在集群中部署测试的地方。


现在,用以下指令创建应用:


kubectl apply -f testkube-application.yaml
复制代码


在 ArgoCD 的仪表板上,我们将看到新创建的应用。点击进入,同步测试。



点击"同步(Sync)",即可看到已创建的测试。



瞧,ArgoCD 创建并管理着测试集,在包含测试的 Github 资源库中创建并更新每一个新测试!


运行 ArgoCD 测试!

  1. 通过 CLI 运行临时测试


现在一切准备就绪,我们用 Testkube 的 CLI 来执行一些临时测试。


用以下命令列出集群中的测试:


testkube get tests
复制代码


应该能看到已部署的测试工件:



要运行这些测试,请执行以下命令:


testkube run test hello-kubernetes
复制代码


测试将在后台开始执行,可以执行下图中的命令来检查测试的执行结果:



testkube get execution EXECUTION_ID‍
复制代码


应该会看到测试已成功运行,就像下图一样。



此外,还可以在漂亮的仪表板中查看测试结果。只需使用以下命令‍打开 Testkube 面板


testkube dashboard‍
复制代码



如下图所示,可以在"执行(Executions)"选项卡中看到执行结果。

GitOps 收获

一旦完全实现基于 GitOps 测试 Kubernetes 应用,就能提供一个强大的替代方案。而在传统方法中,调度器与当前的 CI/CD 工具绑定,与 Kubernetes 应用生命周期并不密切相关。




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 5
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境_gitops_俞凡_InfoQ写作社区