ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入解析 Strimzi HTTP Bridge TLS 系统测试:HttpBridgeTlsST 套件的实现原理与验证路径

深入解析 Strimzi HTTP Bridge TLS 系统测试:HttpBridgeTlsST 套件的实现原理与验证路径 深入解析 Strimzi HTTP Bridge TLS 系统测试HttpBridgeTlsST 套件的实现原理与验证路径【免费下载链接】strimzi-kafka-operatorApache Kafka® running on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/st/strimzi-kafka-operator导读Strimzi 提供的 Kafka Bridge 让应用可以通过标准 HTTP/REST 接口与 Kafka 集群交互而在生产环境中桥接器与 Kafka 之间以及客户端与桥接器之间的通信往往需要 TLS 加密与双向认证。本文以仓库中的系统测试套件 HttpBridgeTlsST 文档 为骨架结合其源码 HttpBridgeTlsST.java 与相关模板、工具类完整拆解该套件如何验证基于 TLS 的 HTTP 消息收发链路包括测试环境搭建、TLS 监听器与 KafkaUser 的创建、HTTP 生产者/消费者与原生 Kafka 客户端的双向数据流以及真实场景中的 TLS 配置 YAML 写法。读完本文你将理解 Strimzi 系统测试如何从零构造一套端到端 TLS 验证环境并能将同一套配置思路迁移到自己的 Kafka Bridge 部署实践中。一、测试套件定位HttpBridgeTlsST 在系统测试体系中的角色HttpBridgeTlsST是 Strimzi 系统测试systemtest 模块中专门用于验证 HTTP Bridge 在 TLS 场景下功能正确性的测试套件。其类级文档描述为Test suite for verifying TLS functionalities in the HTTP Bridge.在系统测试的标签体系里该套件同时挂载了多个 JUnit 标签见 HttpBridgeTlsST.javaTag(REGRESSION)—— 属于回归测试范畴Tag(BRIDGE)—— 属于桥接器功能组Tag(ACCEPTANCE)—— 同时纳入验收测试集合。文档与源码通过SuiteDoc/TestDoc注解io.skodjob.annotations自动生成 测试文档因此文档中的步骤—预期结果表格与源码注解一一对应两者可互相印证。此外该套件被收录在 bridge 标签索引 中与其他桥接器套件如HttpBridgeST、HttpBridgeScramShaST、HttpBridgeCorsST共同构成完整的 Bridge 功能验证矩阵。二、套件前置条件一套预置好的 TLS 测试环境文档列出的套件级前置步骤共 4 步源码中对应setUp()方法HttpBridgeTlsST.java它运行在BeforeAll阶段为整个套件建立共享基础设施步骤动作源码对应实现1初始化测试存储与上下文suiteTestStorage new TestStorage(...)负责为套件内所有测试提供命名空间、集群名、用户名、主题名、消息数等共享参数2部署 Kafka 与 KafkaBridge通过KubeResourceManager.get().createResourceWithWait(...)创建 KafkaNodePoolbroker 池与 controller 池各 1 副本与 Kafka 集群3创建带 TLS 配置的 Kafka 用户KafkaUserTemplates.tlsUser(...)创建KafkaUser其认证类型为 TLS 客户端认证tlsExternal/tls4部署带 TLS 配置的 HTTP BridgeKafkaBridgeTemplates.kafkaBridge(...)创建的桥接器同时配置了 Kafka 客户端 TLS 认证与集群 CA 信任证书setUp()中关键的 Kafka 集群配置是只暴露一个 TLS 内部监听器.withListeners(new GenericKafkaListenerBuilder() .withName(TestConstants.TLS_LISTENER_DEFAULT_NAME) // tls .withPort(9093) .withType(KafkaListenerType.INTERNAL) .withTls(true) .withNewKafkaListenerAuthenticationTlsAuth() .endKafkaListenerAuthenticationTlsAuth() .build())这意味着套件内所有客户端包括 Bridge 自身必须使用 TLS 加密并携带有效的客户端证书才能与 Kafka 通信从而保证每个测试用例都真正走通了加密认证链路而非退化为明文直连。TLS Kafka 用户的创建KafkaUserTemplates.java在 CRD 层面等价于apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: username labels: strimzi.io/cluster: cluster-name spec: authentication: type: tlsStrimzi 的 User Operator 会为该用户签发客户端证书user.crt与私钥user.key连同集群 CA 一起存入同名 Secret这正是后续所有 TLS 客户端配置的数据来源。三、测试一testSendSimpleMessageTls —— 验证经 HTTP Bridge 生产、经 Kafka 消费的 TLS 链路testSendSimpleMessageTls的文档描述为Test to verify that sending a simple message using TLS works correctly.该用例验证的是一条混合路径消息由 HTTP 客户端通过 Bridge 的 REST 接口TLS 保护的 HTTP 端口生产进 Kafka再由原生 Kafka TLS 消费者从 Kafka 集群消费出来。完整步骤与源码对应关系如下步骤动作源码要点HttpBridgeTlsST.java1初始化 TestStorage 与 BridgeClientsTLS 配置新建TestStoragehttpProducerConsumerBuilder与kafkaProducerConsumerBuilder在setUp()中已用 TLS 认证参数构建好2创建 Kafka 主题KafkaTopicTemplates.topic(...)创建主题资源3创建 HTTP Bridge Client 生产任务httpProducerConsumer.getProducer().getJob()以 Job 形式部署 HTTP 生产者 Pod4验证生产者成功发送消息ClientUtils.waitForClientSuccess(..., messageCount)轮询等待生产者 Job 成功5创建带 TLS 配置的 Kafka 消费者kafkaProducerConsumerBuilder.withConsumerName(...).build()其认证来自ClientsAuthentication.configureTls(...)6验证消费者成功接收消息再次waitForClientSuccess确认 Kafka 消费者收到等量消息值得注意的细节测试开始前先调用NetworkPolicyUtils.allowNetworkPolicyForBridgeClient(namespace, clusterName, producerName);NetworkPolicyUtils.java 会创建一个 NetworkPolicy允许带有appproducerName标签的 Pod 访问 Bridge 组件的 HTTP 端口。这是为了适配系统测试默认的默认拒绝网络策略DEFAULT_TO_DENY_NETWORK_POLICIES确保 HTTP 客户端 Pod 与 Bridge Service 之间可达。kafkaProducerConsumerBuilder的认证配置来自 ClientsAuthentication.java其内部会以ssl.truststore.certificates指向集群 CA 证书 Secretcluster-cluster-ca-cert以ssl.keystore.key与ssl.keystore.certificate.chain指向 KafkaUser 的证书/私钥 Secret设置security.protocolSSL。这完整复现了真实生产客户端连接 TLS Kafka 集群所需的全部配置。四、测试二testReceiveSimpleMessageTls —— 验证经 Kafka 生产、经 HTTP Bridge 消费的 TLS 链路testReceiveSimpleMessageTls的文档描述为Test to verify that a simple message can be received using TLS in a parallel environment.该用例是上一用例的镜像路径消息由原生 Kafka TLS 生产者写入 Kafka再由 HTTP 消费者通过 Bridge 的 REST 接口消费端点拉取同时强调其在并行测试环境ParallelTest下的正确性。步骤与源码对应HttpBridgeTlsST.java步骤动作源码要点1初始化测试存储实例新建独立TestStorage每个并行用例拥有独立命名空间/资源名互不干扰2配置 Bridge 消费客户端httpProducerConsumerBuilder.withConsumerName(...).withConsumerGroup(随机消费组)HTTP 消费者通过 Bridge 的/consumers端点消费3创建 Kafka 主题同上KafkaTopicTemplates创建主题4部署 HTTP Bridge 消费者httpProducerConsumer.getConsumer().getJob()部署消费者 Job轮询 Bridge 消费端点5初始化 TLS Kafka 生产客户端kafkaProducerConsumerBuilder.withProducerName(...)生产者使用configureTls(...)的 SSL 认证6部署 TLS Kafka 生产者kafkaProducerConsumer.getProducer().getJob()部署生产者 Job7验证消息消费ClientUtils.waitForClientsSuccess(namespace, consumerName, producerName, messageCount)同时等待生产与消费两侧均达到预期消息数这里同样先为 HTTP 消费者创建 NetworkPolicyallowNetworkPolicyForBridgeClient(..., consumerName)保证并行命名空间内的客户端 Pod 可以访问 Bridge。通过随机消费组 独立命名空间 独立资源命名两个并行执行的测试用例即使在同一个共享 Kafka 集群上运行也不会互相干扰。五、文档之外的深化源码中隐藏的 TLS 边界用例除文档记录的两个核心用例外HttpBridgeTlsST.java 还包含两个未写入文档但同属本套件的边界测试它们进一步验证了 TLS 认证的健壮性testTlsAuthWithWeirdUsername构造一个包含.且长度逼近 64 字符上限的用户名使用KafkaListenerAuthenticationTls认证验证 TLS 监听器 特殊用户名场景下 Bridge 的完整链路可用testTlsScramShaAuthWithWeirdUsername使用KafkaListenerAuthenticationScramSha512即SCRAM-SHA-512 over TLSTLS 加密传输 SCRAM 口令认证并将 PasswordSecret 显式注入 Bridge 的kafkaClientAuthentication覆盖了TLS 之上叠加 SASL的混合认证模式。这两个用例共用私有方法testWeirdUsername(...)其桥接器 Spec 构造清晰地展示了 TLS 与认证字段的组合写法HttpBridgeTlsST.javaKafkaBridgeSpec bridgeSpec new KafkaBridgeSpecBuilder() .withNewKafkaClientAuthenticationScramSha512() .withUsername(weirdUserName) .withPasswordSecret(passwordSecret) .endKafkaClientAuthenticationScramSha512() .withNewTls() .withTrustedCertificates(certSecret) // 指向 cluster-cluster-ca-cert Secret 中的 ca.crt .endTls() .build();对应的 CRD YAML 形态为spec: bootstrapServers: cluster-kafka-bootstrap:9093 # TLS 监听器端口 tls: trustedCertificates: - secretName: cluster-cluster-ca-cert certificate: ca.crt authentication: type: scram-sha-512 username: weird-username passwordSecret: secretName: weird-username password: password可以看到无论是纯 TLS 还是 SCRAM-SHA-512 over TLSBridge 都需要通过tls.trustedCertificates信任集群 CA才能在加密通道上与 Kafka 建立连接——这是TLS 链路可用的判定核心。六、真实部署视角HTTP 端点自身的 TLS 配置上述系统测试验证的是Bridge 到 Kafka 之间的 TLS而在生产环境中HTTP 客户端到 Bridge 之间同样可以启用 TLS。仓库提供了官方示例 examples/bridge/kafka-bridge-tls.yamlapiVersion: kafka.strimzi.io/v1 kind: KafkaBridge metadata: name: my-bridge spec: replicas: 1 bootstrapServers: my-cluster-kafka-bootstrap:9092 http: port: 8443 tls: certificateAndKey: secretName: my-bridge-cert-secret certificate: cert.crt key: key.key关键点spec.http.portREST 服务监听端口启用 TLS 时通常使用 8443spec.http.tls.certificateAndKey引用一个持有 PEM 格式服务端证书cert.crt与私钥key.key的 Kubernetes Secret桥接器以此证书对外提供 HTTPS 服务该示例与系统测试套件互补系统测试重点覆盖桥接器作为 Kafka 客户端的 TLS 认证链路而该 YAML 展示的是桥接器作为 HTTP 服务端的 TLS 证书配置。七、总结一条可复用的端到端 TLS 验证范式从HttpBridgeTlsST可以提炼出 Strimzi 验证 Kafka Bridge TLS 功能的完整范式环境侧为 Kafka 配置唯一的 TLS 监听器tls: truetype: tls认证从源头强制加密通过 KafkaNodePool 分离 broker 与 controller 角色贴近 KRaft 生产形态身份侧用KafkaUserTemplates.tlsUser创建 TLS 用户由 User Operator 自动签发证书客户端包括 Bridge 自身通过trustedCertificates信任集群 CA流量侧分别构造HTTP 进 → Kafka 出与Kafka 进 → HTTP 出两条消息路径用waitForClientSuccess以消息数作为成功判据双向验证 TLS 链路的收发正确性隔离侧依赖TestStorage的并行命名空间隔离与NetworkPolicyUtils的按标签放行使用例可在ParallelTest模式下安全并行。这套测试代码与 kafka-bridge-tls.yaml 示例配置互为表里既是 Strimzi 自身回归质量的红线也为读者在自己的集群上手工验证 Bridge TLS 部署提供了可直接照搬的清单。若需在本地运行该套件可参考 TESTING.md 中的系统测试执行指引在已就绪的 Kubernetes 环境上通过 Maven 以-DtestHttpBridgeTlsST方式运行。【免费下载链接】strimzi-kafka-operatorApache Kafka® running on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/st/strimzi-kafka-operator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表