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

news2024/12/23 8:36:31

本文介绍了一项新工具,可以基于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(甚至用于端到端测试)或其他执行器插件的现有自动化测试用例。

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

alt

GitOps 教程

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

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

GitOps 测试的前提条件

首先遵循文档[1]安装 minikube。

然后按照 ArgoCD 安装指南[2]安装 ArgoCD。

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

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

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

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

apiVersion: v1
kind: Service
metadata:
 name: hello-kubernetes-service
spec:
 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 集合文件[4]中的测试。

可以将其上传到与应用程序相同的 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[5] 上看到该仓库的完整示例。

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

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm-plugin
  namespace: argocd
data:
  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/v1
kind: Deployment
metadata:
  name: argocd-repo-server
spec:
  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/v1alpha1
kind: Application
metadata:
 name: testkube-tests
 namespace: argocd
spec:
 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 的仪表板上,我们将看到新创建的应用。点击进入,同步测试。

alt

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

alt

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

alt
运行 ArgoCD 测试!
  1. 通过 CLI 运行临时测试

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

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

testkube get tests

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

alt

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

testkube run test hello-kubernetes

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

alt
testkube get execution EXECUTION_ID‍

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

alt

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

testkube dashboard‍
alt

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

GitOps 收获

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


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

参考资料
[1]

Minikube Document: https://minikube.sigs.k8s.io/docs/start

[2]

ArgoCD Document: https://argo-cd.readthedocs.io/en/stable/getting_started

[3]

Testkube Installing: https://kubeshop.github.io/testkube/installing

[4]

Postman Collections: https://www.postman.com/collection

[5]

Testkube ArgoCD tests: https://github.com/aabedraba/testkube-argocd-tests

[6]

ArgoCD Config Management Plugins: https://argo-cd.readthedocs.io/en/stable/user-guide/config-management-plugins

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt中出现中文乱码的原因以及解决方法

Qt专栏:http://t.csdnimg.cn/C2SDN 目录 1.引言 2.原因分析 3.源文件的编码格式修改方法 4.程序内部使用的默认编码格式修改方法 5.QString转std::string的方法 6.总结 1.引言 在编写Qt程序的时候,或多或少都可能遇到用QString时候,明明…

游戏APP如何提高广告变现收益的同时,保证用户留存率?

APP广告变现对接第三方聚合广告平台主要通过SDK文档对接,一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀,导致APP被封控,设置列入黑名单,借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…

51单片机入门:认识开发板

认识开发板 板载资源: 数码管模块 说明: 2个四位一体共阴数码管 详细: 2个四位一体:两个独立的四位数码管,每个四位数码管都是“一体”的设计,也就是说,每个数码管内部集成了四个独立的七段LE…

Stable Diffusion WebUI 附加功能/图片放大(Extras):单张图片/批量处理/从目录进行批量处理

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 篇文章主要讲解 Stable Diffusion WebUI 的附加功能/图片放大(Extras)的使用,主要…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型

WebSocket用户验证

在WebSocket中,如何携带用户的验证信息 一、在OnMessage中进行验证 客户端在连接到服务器后,客户端通过发送消息,服务器端在OnMessage方法中,进行信息验证,这种方式需要将用户身份验证及接收用户消息进行混合处理&am…

什么是原生IP?原生IP的作用是什么?

原生IP(Native IP)是指直接从互联网服务提供商(ISP)获得的IP地址,而非通过代理服务器、VPN或其他中间层方式获取。这种IP地址直接与用户的设备或网络关联,无需经过任何中间服务器或代理的转发或隐藏&#x…

体验OceanBase 的binlog service

OceanBase对MySQL具备很好的兼容性。目前,已经发布了开源版的binlog service工具,该工具能够将OceanBase特有的clog模式转换成binlog模式,以便下游工具如canal、flink cdc等使用。今天,我们就来简单体验一下这个binlog service的功…

Educational Codeforces Round 163 (Rated for Div. 2) E. Clique Partition

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

MacBook 访达使用技巧【mac 入门】

快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它&#xff0c;因为我不常用访达的搜索窗口&#xff0c;更多的是想快速打开访达文件夹窗口&#xff0c;可以通过第三方软件定义访达的快…

测开——Java、python、SQL、数据结构面试题整理

一、Java 1.Java中finally、final、finalize的区别 1.性质不同 &#xff08;1&#xff09;final为关键字; &#xff08;2&#xff09;finalize()为方法; &#xff08;3&#xff09;finally为为区块标志,用于try语句中; 2. 作用 &#xff08;1&#xff09;final为用于标识…

【通信原理笔记】【三】模拟信号调制——3.2 双边带抑制载波调制(DSB-SC)

文章目录 前言一、DSB-SC的数学表示二、DSB-SC的相干解调三、DSB-SC的性能评价总结 前言 从这一篇开始我们依次介绍几种模拟信号调制的方法&#xff0c;包括其数学表达式&#xff0c;系统框图、解调方式、性能评价等。 一、DSB-SC的数学表示 将 m ( t ) m(t) m(t)作为已调信号…

前端、后端上传文件到OSS,简明记录

前端、后端上传文件到OSS&#xff0c;简明记录 上传文件到oss的方式&#xff1a; **后端上传&#xff1a;**文件先要从页面上传到后端存起来&#xff0c;再通过后端发送到oss&#xff0c;然后后端将存起来的文件删除&#xff08;当然可以不删&#xff09;。 **前端上传&…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

4-Linux实用操作

1. 各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux 某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键 ctrl c 命令输入错误&#xff0c;也可以通过快捷键 ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2 ctrl …

P6维护:Oracle P6服务性能优化

前言 本文将介绍如何对ORACLE Primavera P6 EPPM软件进行性能调优&#xff0c;考虑到P6主要采用JAVA语言编制&#xff0c;且其使用的是Weblogic Server应用服务器部署P6各项服务器&#xff0c;其性能优化的原理便是基于其JVM特征参数进行设置 方法一&#xff1a;修改配置文件…

NoSQL之 Redis配置

目录 关系数据库与非关系型数据库 关系型数据库&#xff1a; ●非关系型数据库 关系型数据库和非关系型数据库区别&#xff1a; &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…

利用Node.js实现拉勾网数据爬取

引言 拉勾网作为中国领先的互联网招聘平台&#xff0c;汇集了丰富的职位信息&#xff0c;对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序&#xff0c;我们可以自动化地收集这些信息&#xff0c;为求职决策和市场研究提供数据支持。Node.js以其非阻…

Intel FPGA (2):线性序列机

Intel FPGA (2)&#xff1a;线性序列机 前提摘要 个人说明&#xff1a; 限于时间紧迫以及作者水平有限&#xff0c;本文错误、疏漏之处恐不在少数&#xff0c;恳请读者批评指正。意见请留言或者发送邮件至&#xff1a;“Email:noahpanzzzgmail.com”。本博客的工程文件均存放在…

预处理指令——一些比较少见的概念

前言&#xff1a;预处理是我们的c语言源代码成为可执行程序的第一个步骤。而宏和预处理指令都是在这个阶段完成。本节内容就是关于宏和预处理指令相关知识点的解析。 目录 宏 预定义符号 #define定义常量 #define定义符号 #define定义宏 带副作用的宏参数 宏的替换规则…