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

本文介绍了一项新工具,可以基于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 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习: b.多选框和单选框 练习: 用的是第三种方法 c.输入框和拖动框 练习: 练习二: e.图片绘制和框 练习: 复合控件 a.工具栏和选择网格 练习: b.滚动视…

【stm32】USART编码部分--详细步骤

USART编码部分(文章最后附上源码) 如果看不懂步骤可以根据源码参考此篇文章就能轻而易举学会USART通信啦! 编码步骤 第一步 开启时钟 把需要用到的USART和GPIO的时钟打开 第二部 GPIO初始化 把TX配置成复用输出,RX配置成输入(上拉输入、浮空输入)。…

CCIE-12-IPSec-VPN-RemoteAccess

目录 实验条件网络拓朴实验目的 开始配置1. R2 Ping R3确定基础网络是通的2. 配置R23. 配置R53. 验证 实验条件 网络拓朴 实验目的 为R2和R3建立IPSec VPN R4可以ping通R5 开始配置 R2:模拟需要远程访问网络的网关 R4:模拟需要远程访问网络内的目标主…

selenium 遮罩层

之前写智联自动投简历 和boss自动投简历的时候 发现操作到上限之后就有个遮罩层,会在当前页面有个顶层得div 没办法获取下面的内容 # 假设遮罩层元素有一个特定的ID或者其他属性 没有id xpath 或者class 都可以mask_element WebDriverWait(driver, 10).until(EC.…

农业信息管理(源码+文档)

农业信息管理系统(小程序、ios、安卓都可部署) 文件包含内容程序简要说明功能项目截图客户端首页我的今日动态动态详情登录修改资料今日价格今日报价注册页 后端管理文章管理用户管理分类管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库…

Python:百度AI开放平台——OCR图像文字识别应用

一、注册百度AI开放平台 使用百度AI服务的步骤为: 注册:注册成为百度AI开放平台开发者;创建AI应用:在百度API开放平台上创建相关类型的的AI应用,获得AppID、API Key和Secret Key;调用API:调用…

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences? How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…

基于Java+SpringBoot+Mybaties+layui+Vue+elememt 实习管理系统 的设计与实现

一.项目介绍 前台功能:用户进入系统可以实现首页,系统公告,个人中心,后台管理等功能进行操作 后台由管理员,实习单位,教师和学生,主要功能包括首页,个人中心,班级管理&am…

ETL工具-nifi干货系列 第六讲 处理器JoltTransformJSON

1、处理器作用 使用Jolt转换JSON数据为其他结构的JSON,成功的路由到success,失败的failure。处理JSON的实用程序不是基于流的,因此大型JSON文档转换可能会消耗大量内存。 Jolt:JSON 到 JSON 转换库,用 Java 编写,其中转换的 &qu…

【Jmeter+Influxdb+Grafana性能监控平台安装与部署】

JmeterInfluxdbGrafana性能监控平台安装与部署 前言Influxdb安装与连接Jmeternfluxdb下载(winodws)Grafana安装与配置 前言 我们在性能测试过程中,在需要较大并发时,为了尽量避免使用GUI界面来节省资源,通常使用命令行…

EfficientVMamba实战:使用EfficientVMamba实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装Vim环境环境安装过程安装库文件 计算mean和std生成数据集 摘要 论文:https://arxiv.org/pdf/2401.09417v1.pdf 作者研究了轻量级模型设计的新方法,通过引入视觉状态空间模型&…

Leetcode 4.1

LeetCode 热题 100 贪心算法1.买卖股票的最佳时机2.跳跃游戏3.跳跃游戏 II4.划分字母区间 区间合并1.合并区间 贪心算法 1.买卖股票的最佳时机 买卖股票的最佳时机 买的那天一定是卖的那天之前的最小值。 每到一天,维护那天之前的最小值即可。 在题目中&#xff0…

LAN和WAN, 调制解调器, 路由器,交换机 区别

LAN LAN(Local Area Network)是指在相对较小的地理范围内(如办公室、学校、实验室、家庭等)连接在一起的计算机和网络设备的集合。LAN通常由路由器、交换机、网线、无线路由器等设备组成,用于连接多台计算机、打印机、…

实验四 Spark Streaming编程初级实践

一、Flume简介 数据流 :数据流通常被视为一个随时间延续而无限增长的动态数据集合,是一组顺序、大量、快速、连续到达的数据序列。通过对流数据处理,可以进行卫星云图监测、股市走向分析、网络攻击判断、传感器实时信号分析。 二、Flume安装…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化: 2.数据库设计与规划 1.提前估计数据量,使用什么存储引擎 2.数据库服务器专机专用,避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器,以达到稳定、高效的效果。主从同步、…

C++ 2024-4-1 作业

#include <iostream> using namespace std;class A { public:int a;A(int a):a(a){cout<<"A的有参构造"<<endl;} }; class B:virtual public A { public:int b;B(int a,int b):A(a),b(b){cout<<"B的有参构造"<<endl;} }; cl…

vscode通过ssh连接服务器(吐血总结)

一、通过ssh连接服务器 1、打开vscode&#xff0c;进入拓展&#xff08;CtrlShiftX&#xff09;&#xff0c;下载拓展Remote - SSH。 2、点击远程资源管理器选项卡&#xff0c;选择远程&#xff08;隧道/SSH&#xff09;类别。 3、点击SSH配置。 4、在中间上部分弹出的配置文件…

Mac反编译APK

文章目录 第一种方式: brew installapktool 使用说明dex2jar 使用说明 第二种方式: 下载安装包apktool 使用说明 (根据官方介绍没有操作成功,后续成功再更新这里)dex2jar 使用说明 安装 JD-GUI 查看jar包中的class文件JD-GUI 使用说明 第一种方式: brew install 安装过程可能很…

Excel 隔几行批量插入空白行

例如如下表格&#xff0c;每隔6行插入一行数据&#xff1a; 1&#xff09;第7个单元格输入1 2&#xff09;选中6个单元格&#xff0c;然后双击填充数据&#xff1a; 3&#xff09;F5 找到常量 Ctrlshift 复制插入的数据&#xff0c;然后选中数据 按F5&#xff0c;定位到空值

第21章-直连路由和静态路由

1. 直连路由 1&#xff09;定义&#xff1a;指路由器接口直接相连的网段的路由&#xff1b; 2&#xff09;特点&#xff1a; ① 不需要特别的配置&#xff0c;双UP(物理层数据链路层)&#xff1b; ② 在路由器的接口上配置IP地址即可&#xff1b; ③ 开机自动产生&#xff1b; …