搜索
首页web前端js教程如何使用自定义 Kubernetes 控制器测试流量:分步指南

How to Test Traffic Using a Custom Kubernetes Controller: A Step-by-Step Guide

K8s 控制器和操作符

在 k8s 世界中,所有资源都是通过控制器创建的。就像有用于 pod、部署、副本集等的内置控制器一样。所以基本上,控制器只不过是一个控制循环,它持续监视集群的状态并采取措施使集群进入所需的状态。资源具有提供所需状态的规范。控制器检查当前状态。如果与期望的状态不匹配,它将进行适当的更改或修改,使其更接近期望的状态。

不同类型的 Kube-Controller-Manager

  • ReplicaSet Controller:该控制器负责维护一组稳定的副本 Pod 在任何给定时间运行。它通常与 Deployment 结合使用,以确保指定数量的 pod 副本始终在运行,即使在节点故障或 pod 终止的情况下也是如此。

  • 部署控制器:此控制器为 Pod 和 ReplicaSet 提供声明性更新。它允许轻松扩展、滚动更新和回滚应用程序。 Deployment 控制器管理 ReplicaSet 的创建和删除,以确保所需数量的 pod 始终运行。

  • StatefulSet Controller:此控制器用于管理有状态应用程序,例如数据库。它为集合中的每个 Pod 提供唯一的标识(稳定的主机名),并维护这些 Pod 的顺序和唯一性。当您需要稳定的网络标识符、稳定的持久存储以及有序、优雅的部署和扩展时,它特别有用。

  • 服务控制器:该控制器负责维护一组 pod 的稳定 IP 地址和 DNS 名称。它充当负载均衡器,并根据服务的选择器将流量路由到适当的 Pod。这确保了服务有一个稳定的端点来访问正在运行的 Pod,即使它们在集群中被创建、销毁或移动。

行为与架构

因此,在进行测试之前,我们必须了解标准控制器的基本架构。在 Kubernetes 的客户端-服务器架构中,控制器作为向 Kubernetes API 服务器进行 API 调用(主要是 HTTP)的客户端发挥着至关重要的作用。他们的主要目标是协调 Kubernetes API 对象与实际系统资源。该架构中的一个重要组成部分是 Informers 的使用。举报者负责监控集群中的任何变化,这至关重要,因为持续轮询来检索资源信息会显着降低 API 服务器的性能。

告密者通过查询资源数据并将其存储在本地缓存中来工作。一旦数据被存储,只有当对象(或资源)的状态发生变化时才会生成事件。这种方法可确保系统不会被不必要的事件淹没,并且仅在发生相关更改时才通知控制器。

该架构中的另一个重要概念是资源版本。该版本随每次写入操作而变化,用于乐观并发控制。它确保以避免冲突并保持整个系统一致性的方式管理资源更新。通过理解和利用这些机制,Kubernetes 控制器可以有效地管理和协调集群中资源的状态。

How to Test Traffic Using a Custom Kubernetes Controller: A Step-by-Step Guide

Kubernetes 中的自定义 CRD 和控制器

Kubernetes 允许创建自定义资源定义 (CRD),它是 Kubernetes API 的扩展,使用户能够定义自定义资源。这些自定义资源在默认 Kubernetes 安装中不可用,用于适应特定于域的用例和复杂的应用程序要求。

要管理这些自定义资源,需要一个自定义控制器。自定义控制器、CRD 和 Kubernetes API 服务器形成紧密的关系,其中:

  • CRD 定义自定义资源。

  • API 服务器管理这些资源的生命周期。

  • 自定义控制器确保根据所需的配置维护这些资源的状态。

该架构实现了 Kubernetes 的可扩展性,允许用户根据自己的特定需求定制平台。

控制器测试 -

在将 Kubernetes 控制器部署到生产环境之前,确保 Kubernetes 控制器已准备好向 Kubernetes API 服务器提供请求至关重要。有多种方法可以测试 Kubernetes 控制器。我提到的一些内容来自文章:

  1. 使用 client-go fakes 或更高级别的抽象:这种方法避免运行任何支持 API,使其适合单独对各个组件进行单元测试。

  2. 使用控制器运行时中的 envtest 包:该包与精简的 API 服务器配合使用,以验证与 API 的真实交互,包括计时和缓存同步,而不会受到其他控制器的干扰。它支持针对精简实例的本地测试和针对功能齐全的集群的测试。

  3. 运行真正的 API 服务器:此方法适合临时环境或实例(例如临时类型或 microk8s),用于测试真实结果。它允许测试与真实 API 服务器的交互。

使用外部进程(例如 envtest 或真正的 API 服务器)的优点是它可以解决分布式系统固有的延迟。像 Gomega 这样的库可用于在操作发生后等待特定条件。上述方法通常听起来最适合单元测试和集成级别测试,在这些测试中我们单独测试特定组件。要么通过编写测试来伪造数据

虽然上述技术对于单元和集成测试有效,但它们可能不涵盖端到端(e2e)测试,而这对于确保控制器的整体功能至关重要。 e2e 测试的一种方法是执行资源更新和其他操作,以在受控环境中测试控制器的整个流程,并在必要时复制该过程。这有助于验证控制器在现实场景中的行为,并确保其为生产部署做好准备。

总之,单元、集成和端到端测试的结合对于确保 Kubernetes 控制器在投入生产之前的可靠性和有效性至关重要。

为什么使用 Keploy 测试 Kubernetes 控制器?

在本地构建和测试 Kubernetes 控制器可能具有挑战性,尤其是在处理传出 API 调用时。然而,Keploy 作为一种通过 API 调用、数据库查询等创建测试用例和数据模拟的工具,提供了一种解决方案。 Keploy 允许您记录和重放 Kubernetes 控制器发出的传出呼叫,这对于测试和确保控制器按预期运行非常有用。

您可能想知道如何在不更改任何代码的情况下实现这一点。 Keploy 使用 eBPF 向内核空间添加探测器并收集网络缓冲区数据。然后,该数据被发送到 Keploy 的代理,该代理充当用户空间,其中缓冲区的所有处理均由不同的协议解析器完成。 Keploy 可以捕获控制器的出口流量,并将该特定事件的请求和响应存储在 YAML 文件中。在重播模式下,Keploy 不会对真正的 API 服务器进行 API 调用,而是会从存储的 YAML 文件返回针对该特定请求的响应。这使得该过程独立于集群或环境,为本地测试 Kubernetes 控制器提供了一种便捷高效的方法。

录音去电

因此,要在本地或从任何实时环境捕获控制器的测试,您必须首先启动 kubernetes 集群并创建自定义控制器以与服务器进行一些交互。

要使用 Keploy 录制您的控制器,请按照以下步骤操作:

  1. 将您的 Kubernetes *rest.Config 对象设置为不安全且没有 CA 文件:

    cfg.Insecure = true
    cfg.CAFile = ""
    
  2. 创建自定义 RoundTripper 以添加包含资源版本的标头字段。此标头用作跟踪 ID,用于在同一状态下将请求与记录的模拟进行匹配。这是一个示例实现:

    type customRoundTripper struct {
        rt http.RoundTripper
    }
    
    func (crt *customRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
        ctx := req.Context()
        rsv := ctx.Value("ResourceVersion")
    
        if rsv != nil {
            req.Header.Add("keploy-header", rsv.(string))
        }
        return crt.rt.RoundTrip(req)
    }
    
    cfg.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
        return &customRoundTripper{rt: rt}
    }
    
  3. 确保在同步过程中在 context.Context 中设置资源版本值。这对于将修改后的上下文传递给控制器​​的更新和创建方法至关重要。例如:

    func (c *Controller) syncHandler(ctx context.Context, key string) error {
        // set ResourceVersion in ctx
        rv := foo.GetResourceVersion()
        if rv != "" {
            ctx = context.WithValue(ctx, "ResourceVersion", rv)
        }
    }
    
  4. 构建 Kubernetes 控制器的 Go 二进制文件:

    go build -o sample-controller .
    
  5. 要通过 Keploy 记录去电,请使用 Keploy 的记录命令包装您的控制器命令。注意 - keploy 的此功能处于测试版使用状态,尚未在主版本中发布。这是专门为 Kubernetes 爱好者尝试并给出评论而创建的实验。因此,您必须在这个特定分支中签出并使用 go build 命令构建 keploy 二进制文件。 https://github.com/keploy/keploy/pull/1342。

    1. 到指定分店结账。

      1.

            git checkout kube-controller
          ```
      {% endraw %}
      
    1. 为该分支构建 keploy 二进制文件。
      {% 原始 %}

      go build -o keploy && sudo mv keploy  /usr/local/bin
      
  1. 根据您的 kube 配置添加必要的标志:

    sudo -E env PATH=$PATH keploy record -c "./sample-controller -kubeconfig=$HOME/.kube/config"  --mtls-cert-path "$HOME/.minikube/profiles/minikube/client.crt" --mtls-key-path "$HOME/.minikube/profiles/minikube/client.key"  --mtls-host-name 192.168.49.2:8443
    
  2. 一旦 Keploy 开始拦截出站调用,您就可以看到创建的 keploy/test-set-0/mocks.yaml。每个资源版本都有一个单独的模拟文件,用mocks_“”表示。

注意 - 我想澄清的一件事是,上述功能对 TDD(测试驱动开发)没有帮助。但是,您仍然可以在编写单元测试时利用 keploy 的存根生成功能来进行 keploy。因此,您无需制作任何模拟 api 服务器或为特定单元测试编写存根,只需在真实环境中进行该测试即可。 Keploy 会将所有交互存储在模拟文件中,并在下次运行测试时使用该数据。

使用记录的模拟进行测试

使用录制的模拟测试您的控制器:

  1. 在测试模式下运行 Keploy,并将 mockAssert 标志设置为 true 并提供您的控制器二进制文件。 Keploy 会自动为您创建一个假的 kube 配置:

    cfg.Insecure = true
    cfg.CAFile = ""
    
  2. (可选)您可以设置自己的重播时间,这将尝试在提供的时间内重播您录制的会话:此处给出了与 keploy 集成的完整示例应用程序。

    type customRoundTripper struct {
        rt http.RoundTripper
    }
    
    func (crt *customRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
        ctx := req.Context()
        rsv := ctx.Value("ResourceVersion")
    
        if rsv != nil {
            req.Header.Add("keploy-header", rsv.(string))
        }
        return crt.rt.RoundTrip(req)
    }
    
    cfg.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
        return &customRoundTripper{rt: rt}
    }
    
  3. 请注意,重播过程会将足够大的事件时间间隔修剪为举报者的两个事件之间的精确平均持续时间。这允许事件在记录中发生之前发送,从而促进更快的重播。

  4. 这可以帮助您重放控制器生成的 api 调用的整个会话,但这次您不需要真正的 k8s 服务器或任何外部源来获取响应。所有响应都将由 keploy 本身返回,就像模拟服务器或中间人一样。这可以让您有信心在 CI-CD 管道中运行它。

  5. 例如 - 您在大型云计算组织工作,要部署所有内容,需要大量虚拟化,并且是资源密集型操作。因此,在真实环境中对其进行测试几乎是不可能的。在这里,类似 Keploy 的工具非常有用,因为它已经提供了您在成功推出该资源时想要获得的响应。因此,它可以是快速、可靠且节省成本的操作,因为您只需一次捕获控制器服务的正确流程。并且可以在后续版本中重复使用 keploy 重放。

结论

使用 Keploy 等工具可以使本地测试 Kubernetes 控制器变得更加高效和可靠。通过录音和重播去电,您可以确保控制器在各种场景下都能正确运行,从而提高 Kubernetes 应用程序的整体质量。由于 keploy 原生支持 gotest 等测试框架,因此还可以获得任何应用程序的线路覆盖率,甚至是 kube 控制器的线路覆盖率。探索 Keploy 并增强您的 Kubernetes 控制器测试工作流程!

常见问题解答

使用 Keploy 测试 Kubernetes 控制器有哪些优势?

Keploy 通过以下方式简化了 Kubernetes 控制器的测试:

  • 记录和重放传出 API 调用:这消除了测试期间对实时环境的需求。

  • 提高效率:通过使用存储的模拟,测试变得更快并且独立于实际的 Kubernetes 集群。

  • 节省成本和资源:它减少了对资源密集型环境进行验证的依赖,使其成为大规模运营中 CI/CD 管道的理想选择。

Keploy 如何处理 Kubernetes 控制器的传出 API 调用?

Keploy 使用 eBPF 探针 拦截传出呼叫并将请求-响应对存储在模拟文件中。在重播模式下:

  • 呼叫被拦截并与之前录制的模拟进行匹配。

  • 响应是从这些模拟返回的,而不是到达实际的 API 服务器。

    这种机制确保测试可以在不需要实时 Kubernetes 集群的情况下运行。

Keploy 可以用于 Kubernetes 控制器的测试驱动开发 (TDD) 吗?

虽然Keploy的录音和重放功能并不是专门为TDD设计的,但它仍然可以有效地使用:

  • 存根生成:在真实环境中运行控制器一次以捕获交互。 Keploy 将创建模拟以供后续使用。

  • 单元测试支持:通过利用这些模拟,您可以避免手动编写存根并专注于测试执行。

    Keploy 通过简化模拟创建和减少开发开销来补充现有的 TDD 工作流程。

以上是如何使用自定义 Kubernetes 控制器测试流量:分步指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python vs. JavaScript:您应该学到哪种语言?Python vs. JavaScript:您应该学到哪种语言?May 03, 2025 am 12:10 AM

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架:为现代网络开发提供动力JavaScript框架:为现代网络开发提供动力May 02, 2025 am 12:04 AM

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

JavaScript,C和浏览器之间的关系JavaScript,C和浏览器之间的关系May 01, 2025 am 12:06 AM

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

node.js流带打字稿node.js流带打字稿Apr 30, 2025 am 08:22 AM

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python vs. JavaScript:性能和效率注意事项Python vs. JavaScript:性能和效率注意事项Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript的起源:探索其实施语言JavaScript的起源:探索其实施语言Apr 29, 2025 am 12:51 AM

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

幕后:什么语言能力JavaScript?幕后:什么语言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。

Python和JavaScript的未来:趋势和预测Python和JavaScript的未来:趋势和预测Apr 27, 2025 am 12:21 AM

Python和JavaScript的未来趋势包括:1.Python将巩固在科学计算和AI领域的地位,2.JavaScript将推动Web技术发展,3.跨平台开发将成为热门,4.性能优化将是重点。两者都将继续在各自领域扩展应用场景,并在性能上有更多突破。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具