ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OpenReplay 自托管 Kafka Helm Chart 部署指南:KRaft 模式、TLS 与持久化实战

OpenReplay 自托管 Kafka Helm Chart 部署指南:KRaft 模式、TLS 与持久化实战 可观测性开发工具前端后端【免费下载链接】openreplaySession replay, cobrowsing and product analytics you can self-host. Best for reproducing issues and iterating on your product.项目地址https://gitcode.com/gh_mirrors/op/openreplay点击查看免费下载本文是一份以 OpenReplay 仓库中 Kafka Helm Chart 为核心的技术指南。该 Chart 将 Apache Kafka 以 StatefulSet 形式部署到 Kubernetes并默认启用 KRaft 模式无需 ZooKeeper支持可选 TLS 加密、持久化存储、Pod 反亲和与资源配额。读者将掌握如何用helm install一键拉起 Kafka 集群、如何为多副本环境准备并挂载 TLS 证书、如何根据生产规模调整监听器、副本数、保留策略与资源参数以及如何安全地扩容、卸载并清理数据卷。一、Chart 概览与能力边界Kafka Helm Chart 位于 scripts/helmcharts/databases/charts/kafka是 OpenReplay 自托管数据库 Helm 体系scripts/helmcharts/databases中负责消息中间件的子 Chart。从 Chart.yaml 可以看到它是一个type: application的 v2 Chartchart 版本11.8.6appVersion: 3对应仓库维护的 Kafka 3.x 镜像。其核心能力依据 IMPLEMENTATION_SUMMARY.md 与模板实现包括KRaft 模式不依赖 ZooKeeperbroker 与 controller 角色合并运行StatefulSet 部署稳定网络标识 有序存储天然适配 Kafka 的副本与数据语义可选 TLS/SSL通过 init 容器按 Pod 序号分发证书支持客户端认证多监听器CLIENT9092、INTERNAL9093、SSL9094三套监听器可独立开关可配置持久化基于volumeClaimTemplates为每个 broker 生成独立 PVC高可用调度默认配置 Pod 反亲和尽量将副本分散到不同节点资源与探针可配置 requests/limits 以及 liveness/readiness TCP 探针。实现依据详见dockerfiles/kafka/kube下的原生 YAML 与 statefulset.yamlChart 把原来分散的 Kafka KRaft 部署清单改造成标准 Helm 模板并在 IMPLEMENTATION_SUMMARY.md 中记录了完整改造过程删除 deployment/ingress/hpa 等不适用的模板新增 headless 与 ssl Service。二、前置条件Kubernetes 1.19StatefulSet、volumeClaimTemplates、init 容器等特性均在此版本以上稳定可用Helm 3.0Chart 使用 v2 API 与 Go 模板函数需 Helm 3 渲染PV provisioner默认启用持久化persistence.enabled: true底层集群必须提供可用的 StorageClass 或动态供给能力否则 PVC 会一直处于 Pending 状态。三、快速安装3.1 默认安装无 TLS在 Chart 目录下执行helm install kafka . --namespace db --create-namespace--create-namespace会同时创建db命名空间。安装完成后可验证部署状态kubectl get statefulset -n db kubectl get pods -n db -l app.kubernetes.io/namekafka kubectl get svc -n db -l app.kubernetes.io/namekafka3.2 使用自定义 values 文件helm install kafka . -f values.yaml helm install kafka . -f values-tls.yaml其中 values-tls.yaml 是仓库内置的 TLS 示例配置开启 SSL 监听器并指向kafka-tls-certs证书 Secret。3.3 渲染校验正式安装前可用helm template先行渲染确认模板输出符合预期见 IMPLEMENTATION_SUMMARY.md 的验证命令helm template test-kafka . helm template test-kafka . -f values-tls.yaml安装后NOTES.txt 会打印出可用的 bootstrap 地址、SSL 端点若启用、副本数与 KRaft 集群 ID 等概要信息。四、关键配置参数详解完整参数以 values.yaml 为准下表列出文档标注的核心参数及其默认值参数说明默认值replicaCountKafka broker 副本数2image.repository镜像仓库ghcr.io/openreplay/kafkaimage.tag镜像标签3kraft.enabled启用 KRaft 模式truekraft.clusterIdKRaft 集群 IDSjg_Rr1iQbO9xpahgDbYpQkraft.processRoles进程角色broker,controllerkraft.controllerListenerNamescontroller 监听器名INTERNALlisteners.client.portCLIENT 监听端口PLAINTEXT9092listeners.internal.portINTERNAL 监听端口PLAINTEXT9093listeners.ssl.portSSL 监听端口9094tls.enabled启用 TLS/SSLfalsetls.secretName存放证书的 Secretkafka-tls-certstls.clientAuth客户端认证方式requiredtls.endpointIdentificationAlgorithm主机名校验算法空串禁用persistence.enabled启用持久化truepersistence.size每副本 PV 大小100Gipersistence.storageClass存储类空则用默认persistence.accessModes访问模式ReadWriteOnceresources.requests.cpuCPU 请求500mresources.requests.memory内存请求1Giresources.limits.cpuCPU 上限2000mresources.limits.memory内存上限2GipodManagementPolicyPod 管理策略ParallelupdateStrategy.type更新策略RollingUpdateservice.typeService 类型ClusterIPheadlessService.enabled是否创建 headless Servicetrue注意README 表格中镜像仓库写为rjshrjndrn/kafka而当前仓库 values.yaml 与上层 databases/values.yaml 中实际值为ghcr.io/openreplay/kafka。部署时应以仓库实际值为准若沿用镜像则无需修改。4.1 安全上下文与探针Pod 默认设置fsGroup: 1001容器以非 root 用户runAsUser: 1001运行并禁止提权allowPrivilegeEscalation: false符合生产环境的最小权限原则。健康检查采用 TCP 探针liveness 初始延迟 30s、readiness 初始延迟 20s均探测kafka-client端口readiness 的failureThreshold为 6给足 broker 启动时间。五、KRaft 模式从模板到原理5.1 KRaft 配置项KRaft 是 Kafka 2.8 引入、3.x 起生产可用的元数据管理模式用内部 KRaft 协议取代 ZooKeeper 存储 topic、分区与 broker 元数据。本 Chart 中由kraft.*一组参数驱动kraft: enabled: true # Cluster ID可用 kafka-storage.sh random-uuid 生成 clusterId: Sjg_Rr1iQbO9xpahgDbYpQ processRoles: broker,controller controllerListenerNames: INTERNALprocessRoles: broker,controller每个 broker 同时承担 broker 与 controller 职责combined 模式无需单独部署 controller 节点controllerListenerNames: INTERNALcontroller 通信复用 9093 端口的 INTERNAL 监听器clusterId集群唯一 ID需为合法的 base64 UUID。若更换或清空数据卷建议用kafka-storage.sh random-uuid重新生成避免多集群冲突见 values.yaml 注释。5.2 动态 Quorum Voters 生成KRaft 需要每个 broker 知道 controller 仲裁成员的完整地址。模板 _helpers.tpl 中的kafka.controllerQuorumVoters函数会按replicaCount动态生成idhost:port列表1release-kafka-0.release-kafka-headless.namespace.svc.cluster.local:9093, 2release-kafka-1.release-kafka-headless.namespace.svc.cluster.local:9093节点 ID 从 1 开始按序分配主机名基于 StatefulSet 的稳定 Pod 名与 headless Service 拼接。这意味着扩容副本数后需重新执行helm upgrade让 quorum 列表随之更新。5.3 监听器与通告地址_helpers.tpl中还包含三个关键渲染函数kafka.listeners生成KAFKA_LISTENERS形如CLIENT://:9092,INTERNAL://:9093[,SSL://:9094]kafka.advertisedListeners生成KAFKA_ADVERTISED_LISTENERS使用${MY_POD_NAME}.fullname-headless.namespace.svc.cluster.local的通告地址保证集群内任意节点都能按 Pod 名直达目标 brokerkafka.listenerSecurityProtocolMap生成CLIENT:PLAINTEXT,INTERNAL:PLAINTEXT,SSL:SSL的安全协议映射。在 statefulset.yaml 中这些值通过KAFKA_NODE_ID、KAFKA_CLUSTER_ID、KAFKA_PROCESS_ROLES、KAFKA_CONTROLLER_QUORUM_VOTERS、KAFKA_LISTENERS、KAFKA_ADVERTISED_LISTENERS等环境变量注入镜像入口脚本从而完成 KRaft 集群的引导。Pod 的MY_POD_NAME由metadata.name字段注入因此通告地址天然跟随每个 Pod 的唯一名称。六、TLS 加密配置实战6.1 证书与 Secret 结构开启 TLS 前需要为每个 broker 单独签发证书并将它们放进同一个 Secret。Secret 键名规则见 values.yaml 注释为ca-cert.pem集群 CA 证书kafka-N-cert.pem第 N 个 broker 的服务端证书kafka-N-key.pem第 N 个 broker 的服务端私钥。其中N从 0 开始对应 StatefulSet 的 Pod 序号。以 2 副本为例创建命令kubectl create secret generic kafka-tls-certs \ --from-fileca-cert.pem./certs/ca-cert.pem \ --from-filekafka-0-cert.pem./certs/kafka-0-cert.pem \ --from-filekafka-0-key.pem./certs/kafka-0-key.pem \ --from-filekafka-1-cert.pem./certs/kafka-1-cert.pem \ --from-filekafka-1-key.pem./certs/kafka-1-key.pem \ -n db证书签发可复用仓库dockerfiles/kafka目录下的generate-certs.sh脚本也可用openssl req -new -x509 -keyout ca-key.pem -out ca-cert.pem -days 365 -nodes -subj /CNkafka-ca手工生成 CA详见 QUICKSTART.md。6.2 启用 TLS在 values 中开启 TLS 并激活 SSL 监听器tls: enabled: true secretName: kafka-tls-certs listeners: ssl: enabled: true port: 9094也可以直接使用仓库提供的 values-tls.yaml 整体覆盖。6.3 init 容器分发证书当tls.enabled为 true 时StatefulSet 会注入名为setup-certs的 init 容器busybox 镜像。它从metadata.name提取当前 Pod 序号将kafka-N-cert.pem/kafka-N-key.pem重命名为通用的server-cert.pem/server-key.pem写入空目录并设置server-key.pem权限为 600见 statefulset.yamlPOD_ID$(echo $POD_NAME | sed s/fullname-//) cp /tls-secret/ca-cert.pem /tls/ca-cert.pem cp /tls-secret/kafka-${POD_ID}-cert.pem /tls/server-cert.pem cp /tls-secret/kafka-${POD_ID}-key.pem /tls/server-key.pem chmod 644 /tls/*.pem chmod 600 /tls/server-key.pem随后主容器通过KAFKA_SSL_CERT_FILE/tls/server-cert.pem、KAFKA_SSL_KEY_FILE/tls/server-key.pem、KAFKA_SSL_CA_FILE/tls/ca-cert.pem环境变量启用 SSL。tls.clientAuth: required表示强制要求客户端证书双向 TLSendpointIdentificationAlgorithm默认留空以禁用主机名校验——在证书不包含 Pod DNS 名称的场景下这是必要的若希望启用主机名校验需自行设置该参数。6.4 客户端验证 TLS 连接将 CA 证书导出并构造 client.properties 后即可验证 SSL 端点kubectl get secret kafka-tls-certs -n db -o jsonpath{.data.ca-cert\.pem} | base64 -d ca-cert.pem cat client.properties EOL security.protocolSSL ssl.truststore.locationca-cert.pem ssl.truststore.typePEM EOL kubectl run kafka-client --rm -it --imageconfluentinc/cp-kafka:latest --namespace db -- bash # 容器内执行 kafka-topics --bootstrap-server kafka-ssl.db.svc.cluster.local:9094 --command-config client.properties --list七、集群内访问 Kafka安装后会在db命名空间生成三类 Service详见 service.yaml、service-headless.yaml、service-ssl.yaml端点说明kafka.db.svc.cluster.local:9092ClusterIP 客户端入口PLAINTEXTkafka-headless.db.svc.cluster.local:9092Headless Service可直接访问各 Podkafka-ssl.db.svc.cluster.local:9094SSL 端点仅启用 TLS 时创建headless Service 设置了publishNotReadyAddresses: true即使 broker 尚未 Ready 也会发布 Pod 地址这对 Kafka 集群引导阶段至关重要controller 需要先互相发现。快速验证连通性kubectl run test-pod --rm -it --imagebusybox --namespace db -- sh # 容器内执行 nc -zv kafka.db.svc.cluster.local 9092 nc -zv kafka-0.kafka-headless.db.svc.cluster.local 9092八、Kafka 运行参数调优除了部署形态Chart 还通过kafka.*段透传了大量 server 属性以KAFKA_CFG_*环境变量注入见 statefulset.yaml消息与副本messageMaxBytes/replicaFetchMaxBytes默认31457283MB对应单条消息与副本拉取上限保留策略logRetentionHours: 1687 天、logRetentionBytes: 10737418241GB、logSegmentBytes: 10737418241GB时间与大小双维度保留刷盘logFlushIntervalMessages: 10000、logFlushIntervalMs: 1000消息数或时间任一达到即触发刷盘副本因子defaultReplicationFactor、offsetsTopicReplicationFactor、transactionStateLogReplicationFactor默认均为 1多副本集群建议调大以提升容错线程模型numIoThreads: 8、numNetworkThreads: 3、numPartitions: 1、numRecoveryThreadsPerDataDir: 1网络缓冲socketReceiveBufferBytes/socketSendBufferBytes为102400socketRequestMaxBytes为104857600100MB安全autoCreateTopicsEnable: true、deleteTopicEnable: false、allowEveryoneIfNoAclFound: true、superUsers: User:admin默认允许无 ACL 访问并指定 admin 为超级用户。上层 databases/values.yaml 将这份参数作为子 Chart 的默认覆盖值整体继承因此通过 databases 聚合 Chart 安装时这些调优同样生效。需要额外注入自定义配置时可用extraEnvVars如KAFKA_CFG_CUSTOM_SETTING、extraVolumes与extraVolumeMounts扩展。九、扩容、升级与卸载9.1 扩容与调参helm upgrade kafka . --namespace db --set replicaCount3扩容后 quorum voters 列表由模板动态重建新 Pod 会自动加入仲裁同时应为新副本补充对应的kafka-2-cert.pem/kafka-2-key.pem到 TLS Secret若启用 TLS。缩容需谨慎——小于最小 ISR 的副本数会破坏数据冗余。9.2 卸载与清理helm uninstall kafkaChart 卸载不会删除 PVC。Kafka 数据仍保留在持久卷中需要彻底清理时按标签删除kubectl delete pvc -l app.kubernetes.io/namekafka在 databases 聚合部署中对应命令为helm uninstall kafka --namespace db加kubectl delete pvc -n db -l app.kubernetes.io/namekafka见 QUICKSTART.md 清理章节。十、生产化检查清单综合 QUICKSTART.md 与仓库模板生产部署至少应确认启用持久化并确认 StorageClass 可动态供给设置合理的资源 requests/limits3 副本以上并开启 Pod 反亲和保障跨节点高可用启用 TLS 并妥善管理证书轮换配置监控JMX、Prometheus与告警制定备份与灾难恢复方案明确保留策略时间/大小并文档化。常见故障排查Pod 无法启动时kubectl describe pod kafka-0 -n db查看事件重点排查资源不足、PVC 未绑定、证书缺失三类问题QUICKSTART.mdTLS 连接失败时用kubectl get secret kafka-tls-certs -n db -o yaml核对 Secret 键名并用openssl x509 -noout -dates检查证书有效期。十一、与 OpenReplay 数据库体系的集成该 Kafka Chart 并非孤立组件而是被 databases/values.yaml 以enabled: false的子 Chart 形式收纳。启用方式是在 databases 聚合部署时打开开关kafka: enabled: true fullnameOverride: kafka replicaCount: 3 ...启用后OpenReplay 的 sink 等服务即可通过kafka.db.svc.cluster.local:9092消费会话事件流。仓库 IMPLEMENTATION_SUMMARY.md 记录的验证命令make db-template可整体渲染 databases 聚合 Chart确保 Kafka 子 Chart 与其他数据库组件协同无误。参考资料Kafka Helm Chart README本指南对应的原始文档QUICKSTART.md完整部署、验证与故障排查命令IMPLEMENTATION_SUMMARY.mdChart 实现细节与设计取舍values.yaml全部可配置项与默认值statefulset.yamlStatefulSet、init 容器与环境变量注入_helpers.tplquorum voters、监听器与通告地址生成逻辑赞分享可观测性开发工具前端后端【免费下载链接】openreplaySession replay, cobrowsing and product analytics you can self-host. Best for reproducing issues and iterating on your product.项目地址https://gitcode.com/gh_mirrors/op/openreplay点击查看免费下载相关推荐OpenReplay 自托管 Kafka Helm Chart 部署实战KRaft 模式、TLS 加密与生产化配置全指南OpenReplay 自托管 Kafka Helm Chart 部署实战KRaft 模式、TLS 加密与生产化配置全指南 本文以 OpenReplay 仓库中可观测性开发工具前端后端OpenReplay 自托管 Kafka 的 Kubernetes KRaft 快速部署指南OpenReplay 自托管 Kafka 的 Kubernetes KRaft 快速部署指南 导读 本指南面向在 Kubernetes 上部署 OpenRepl可观测性开发工具前端后端OpenReplay 自托管 Kafka 的 Kubernetes KRaft 部署指南以 StatefulSet 平滑替换 Helm ZooKeeperOpenReplay 自托管 Kafka 的 Kubernetes KRaft 部署指南以 StatefulSet 平滑替换 Helm ZooKeeper可观测性开发工具前端后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进