可观测性开发工具前端后端【免费下载链接】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点击查看免费下载导读本指南面向在 Kubernetes 上部署 OpenReplay 自托管所需 Kafka 数据层的开发者完整讲解仓库内scripts/dockerfiles/kafka/kube目录提供的两套 KRaft 模式无需 ZooKeeperStatefulSet 清单PLAINTEXT 与 TLS 两种部署方式。读完本文你将掌握 3 条命令拉起无 TLS Kafka 集群、4 条命令部署带 TLS 加密的集群、验证连接、调整消息大小/保留期/存储/资源配额以及排查 Pod、PVC、证书与仲裁Quorum问题的完整实战方法。背景为什么用 KRaft 取代 ZooKeeperOpenReplay 自托管的 Kafka 镜像scripts/dockerfiles/kafka/README.md基于 Kafka 3.x 构建运行于 KRaft 模式。与旧版 Helm Chart 依赖 ZooKeeper 的架构相比新方案在部署形态上有本质简化方面旧方案Helm/ZooKeeper新方案KRaft依赖需要 ZooKeeper无任何外部依赖运行模式ZooKeeper 模式KRaft 模式Pod 数量kafka zookeeper仅 kafka服务名kafka、kafka-headless同名可无缝替换PVC 名data-kafka-{0,1}同名数据可沿用复杂度较高更低启动更快关键设计是与旧 Helm Chart 保持服务名、PVC 名、端口名kafka-client/kafka-internal、命名空间db与标签app.kubernetes.io/namekafka完全一致见 K8S_SUMMARY.md使其可以作为存量部署的 drop-in 替换。Kafka 3.x 不支持在同一集群内从 ZooKeeper 模式原地迁移到 KRaft因此新老切换需要走新集群 数据复制 切流的路径具体见后文。文件清单与角色scripts/dockerfiles/kafka/kube目录下的文件分工如下文件用途k8s-kafka-kraft.yamlPLAINTEXT 部署清单开发/测试k8s-kafka-kraft-tls.yaml启用 TLS 的部署清单生产k8s-generate-certs.sh生成 TLS 证书并产出 Kubernetes SecretK8S_QUICK_START.md本文对应的 5 分钟快速上手文档K8S_DEPLOYMENT.md完整部署指南TLS 细节、生产清单、扩缩容、迁移K8S_SUMMARY.md新旧方案对比与特性汇总镜像构建命令位于 scripts/dockerfiles/kafka/Makefile默认使用 podman产物 tag 为local/kafka:3。快速部署TL;DRPLAINTEXT 部署3 条命令kubectl create namespace db kubectl apply -f k8s-kafka-kraft.yaml kubectl wait --forconditionready pod -l app.kubernetes.io/namekafka -n db --timeout300s集群内连接地址kafka.db.svc.cluster.local:9092TLS 部署4 条命令kubectl create namespace db ./k8s-generate-certs.sh kubectl apply -f k8s-kafka-kraft-tls.yaml kubectl wait --forconditionready pod -l app.kubernetes.io/namekafka -n db --timeout300s连接地址PLAINTEXT迁移过渡期使用kafka.db.svc.cluster.local:9092SSL加密kafka-ssl.db.svc.cluster.local:9094两种部署形态的架构细节PLAINTEXT 清单k8s-kafka-kraft.yaml清单主体是一个replicas: 2、podManagementPolicy: Parallel的 StatefulSet源码见 k8s-kafka-kraft.yaml核心配置如下端口9092CLIENT/PLAINTEXT、9093INTERNAL同时承担 broker 间通信与 controller 仲裁流量KRaft 关键变量KAFKA_CLUSTER_IDSjg_Rr1iQbO9xpahgDbYpQ两节点共享的集群 IDKAFKA_PROCESS_ROLESbroker,controller每个节点同时承担 broker 与 controller 角色KAFKA_CONTROLLER_QUORUM_VOTERS1kafka-0.kafka-headless.db.svc.cluster.local:9093,2kafka-1.kafka-headless.db.svc.cluster.local:9093仲裁投票者列表KAFKA_CONTROLLER_LISTENER_NAMESINTERNAL节点 ID 自动推导KAFKA_NODE_ID取自 Pod 名metadata.name由 start-kafka.sh 启动脚本将kafka-0 → 1、kafka-1 → 2的规则换算为数值型node.id写入生成的server.properties。Advertised 地址KAFKA_ADVERTISED_LISTENERS使用${MY_POD_NAME}占位符启动脚本会将其替换为实际 Pod 名从而生成形如kafka-0.kafka-headless.db.svc.cluster.local:9092的稳定 broker 地址。服务kafkaClusterIP客户端入口与kafka-headlessclusterIP: None供 StatefulSet 稳定 DNS 与 broker 直连。健康检查livenessinitialDelaySeconds: 30与 readinessinitialDelaySeconds: 20均探测kafka-client端口的 TCP 连通性。存储volumeClaimTemplates声明dataPVCReadWriteOnce默认 100Gi挂载于/bitnami/kafka。TLS 清单k8s-kafka-kraft-tls.yaml在 PLAINTEXT 基础上增加 SSL 监听详见 k8s-kafka-kraft-tls.yaml新增端口9094SSL对应新增kafka-sslClusterIP 服务headless 服务也增加tcp-ssl端口。监听器KAFKA_LISTENERSCLIENT://:9092,INTERNAL://:9093,SSL://:9094KAFKA_LISTENER_SECURITY_PROTOCOL_MAPCLIENT:PLAINTEXT,INTERNAL:PLAINTEXT,SSL:SSL且KAFKA_INTER_BROKER_LISTENER_NAMEINTERNALbroker 间通信仍走内部 PLAINTEXT。证书注入通过initContainers中的setup-certsbusybox把 Secretkafka-tls-certs中按 Pod 序号命名的证书复制到共享 emptyDir/tlskafka-0-cert.pem → server-cert.pem、kafka-0-key.pem → server-key.pem并设置chmod 644/600权限。TLS 环境变量KAFKA_SSL_CERT_FILE/tls/server-cert.pem、KAFKA_SSL_KEY_FILE/tls/server-key.pem、KAFKA_SSL_CA_FILE/tls/ca-cert.pem、KAFKA_SSL_CLIENT_AUTHrequired要求客户端证书、KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM空关闭主机名校验。启动脚本 start-kafka.sh 会检测到KAFKA_SSL_CERT_FILE/KAFKA_SSL_KEY_FILE自动将 PEM 证书经 PKCS12 转换为 JKS keystore/truststore默认密码kafka-ssl-pass再把ssl.keystore.*、ssl.truststore.*、ssl.client.auth、ssl.endpoint.identification.algorithm写入生成的配置。证书生成脚本k8s-generate-certs.shk8s-generate-certs.sh 完成三件事用 openssl 生成自签名 CAk8s-certs/ca-cert.pem有效期 365 天为kafka-0、kafka-1各生成一张带 SAN 的证书SAN 覆盖kafka-{i}、kafka-{i}.kafka-headless、.db、.svc、.cluster.local各级 DNS 名以及localhost/127.0.0.1确保证书可用于 headless 服务全链路 DNS 解析以--dry-runclient -o yaml生成 Secret 清单k8s-certs/kafka-tls-secret.yaml包含ca-cert.pem、kafka-0-cert.pem、kafka-0-key.pem、kafka-1-cert.pem、kafka-1-key.pem五个条目随后可kubectl apply -f应用到db命名空间。如果不使用脚本也可以手动创建 Secretkubectl create secret generic kafka-tls-certs \ --from-fileca-cert.pem./k8s-certs/ca-cert.pem \ --from-filekafka-0-cert.pem./k8s-certs/kafka-0-cert.pem \ --from-filekafka-0-key.pem./k8s-certs/kafka-0-key.pem \ --from-filekafka-1-cert.pem./k8s-certs/kafka-1-cert.pem \ --from-filekafka-1-key.pem./k8s-certs/kafka-1-key.pem \ -n db前置条件与镜像准备Kubernetes 集群1.19kubectl 已配置集群存在可用的 StorageClass用于 PVC 绑定构建并推送 Kafka 镜像# 构建镜像 make build # 打标签推送到你的仓库 docker tag local/kafka:3 your-registry/kafka:3 docker push your-registry/kafka:3 # 替换清单中的镜像引用 sed -i s|local/kafka:3|your-registry/kafka:3|g k8s-kafka-kraft*.yaml注意两份清单默认镜像不同PLAINTEXT 清单为rjshrjndrn/kafka:3imagePullPolicy: AlwaysTLS 清单为local/kafka:3imagePullPolicy: IfNotPresent部署前请统一替换为你自己的镜像地址。服务端点速查PLAINTEXT 部署集群内Bootstrapkafka.db.svc.cluster.local:9092单 broker 直连kafka-0.kafka-headless.db.svc.cluster.local:9092、kafka-1.kafka-headless.db.svc.cluster.local:9092TLS 部署PLAINTEXT迁移期kafka.db.svc.cluster.local:9092SSLkafka-ssl.db.svc.cluster.local:9094单 broker SSL 直连kafka-0.kafka-headless.db.svc.cluster.local:9094、kafka-1.kafka-headless.db.svc.cluster.local:9094部署后验证与测试创建并列出 Topic# 创建测试 topic kubectl run kafka-test -n db --rm -it --restartNever \ --imageyour-registry/kafka:3 -- \ /usr/lib/kafka/bin/kafka-topics.sh \ --create --topic test \ --bootstrap-server kafka.db.svc.cluster.local:9092 \ --replication-factor 1 --partitions 3 # 列出 topics kubectl run kafka-test -n db --rm -it --restartNever \ --imageyour-registry/kafka:3 -- \ /usr/lib/kafka/bin/kafka-topics.sh \ --list \ --bootstrap-server kafka.db.svc.cluster.local:9092进入交互式 Pod 后还可以完整走一遍生产/消费链路# 生产消息 echo Hello Kafka | /usr/lib/kafka/bin/kafka-console-producer.sh \ --topic test-topic \ --bootstrap-server kafka.db.svc.cluster.local:9092 # 消费消息 /usr/lib/kafka/bin/kafka-console-consumer.sh \ --topic test-topic --from-beginning \ --bootstrap-server kafka.db.svc.cluster.local:9092 \ --max-messages 1验证 TLS 连接将 Secret 挂载进测试 Pod使用--overrides注入 volumekubectl run kafka-test-tls -n db --rm -it --restartNever \ --imageyour-registry/kafka:3 \ --overrides { spec: { containers: [{ name: kafka-test-tls, image: your-registry/kafka:3, command: [/bin/bash], stdin: true, tty: true, volumeMounts: [{ name: tls, mountPath: /tls }] }], volumes: [{ name: tls, secret: { secretName: kafka-tls-certs } }] } } \ -- /bin/bashPod 内创建 SSL 客户端配置并执行操作cat /tmp/ssl-client.properties EOF security.protocolSSL ssl.truststore.location/tls/ca-cert.pem ssl.truststore.typePEM ssl.endpoint.identification.algorithm EOF # 通过 SSL 列出 topics /usr/lib/kafka/bin/kafka-topics.sh \ --list \ --bootstrap-server kafka-ssl.db.svc.cluster.local:9094 \ --command-config /tmp/ssl-client.properties # 通过 SSL 创建 topic /usr/lib/kafka/bin/kafka-topics.sh \ --create --topic secure-topic \ --bootstrap-server kafka-ssl.db.svc.cluster.local:9094 \ --command-config /tmp/ssl-client.properties \ --replication-factor 1 --partitions 3 # 通过 SSL 生产 / 消费 echo Hello Secure Kafka | /usr/lib/kafka/bin/kafka-console-producer.sh \ --topic secure-topic \ --bootstrap-server kafka-ssl.db.svc.cluster.local:9094 \ --producer.config /tmp/ssl-client.properties /usr/lib/kafka/bin/kafka-console-consumer.sh \ --topic secure-topic --from-beginning \ --bootstrap-server kafka-ssl.db.svc.cluster.local:9094 \ --consumer.config /tmp/ssl-client.properties \ --max-messages 1检查集群元数据# broker API 版本 kubectl exec kafka-0 -n db -- /usr/lib/kafka/bin/kafka-broker-api-versions.sh \ --bootstrap-server localhost:9092 # 集群 ID kubectl exec kafka-0 -n db -- cat /bitnami/kafka/data/meta.properties | grep cluster.id常用运维操作查看日志kubectl logs -n db kafka-0 --tail50 -f kubectl logs -n db kafka-1 --tail50 -f查看状态kubectl get pods -n db kubectl get svc -n db kubectl get pvc -n db进入 Podkubectl exec -it kafka-0 -n db -- /bin/bash重启集群滚动重启kubectl rollout restart statefulset/kafka -n db删除集群保留数据kubectl delete statefulset kafka -n db kubectl delete svc kafka kafka-headless -n db # PVC 会保留数据不丢删除所有资源kubectl delete namespace db配置项详解与调优清单中的配置通过环境变量注入再由 start-kafka.sh 动态生成/tmp/server.properties。该脚本支持三类变量KRaft 专用变量KAFKA_NODE_ID、KAFKA_CLUSTER_ID、KAFKA_PROCESS_ROLES等、直接映射的快捷变量KAFKA_MESSAGE_MAX_BYTES→message.max.bytes以及通用机制KAFKA_CFG_*前缀——任意以该前缀命名的环境变量都会转换成点分小写的 Kafka 属性如KAFKA_CFG_NUM_NETWORK_THREADS8→num.network.threads8因此几乎任何 broker 配置都能通过环境变量覆盖。消息大小- name: KAFKA_MESSAGE_MAX_BYTES value: 10485760 # 10MB - name: KAFKA_REPLICA_FETCH_MAX_BYTES value: 10485760清单默认值为 31457283MB与当前生产配置一致如需承载大报文例如 OpenReplay 上报较大的网络请求体应同步调大 broker 端message.max.bytes与客户端端max.request.size/fetch.max.bytes。日志保留策略- name: KAFKA_LOG_RETENTION_HOURS value: 720 # 30 天 - name: KAFKA_LOG_RETENTION_BYTES value: 10737418240 # 10GB - name: KAFKA_LOG_SEGMENT_BYTES value: 1073741824清单默认保留 168 小时7 天/ 1GB。KAFKA_LOG_SEGMENT_BYTES控制单个日志段大小影响滚动删除的粒度。存储容量volumeClaimTemplates中的 storage 决定 PVC 大小清单默认 100Gi推荐生产环境 200GivolumeClaimTemplates: - metadata: name: data spec: accessModes: - ReadWriteOnce resources: requests: storage: 200Gi # 修改此处注意PVC 创建后无法在线缩小容量扩容前请评估数据增长速率。资源配额resources: requests: cpu: 500m memory: 1Gi limits: cpu: 2000m memory: 2Gi清单默认值与旧 Helm Chart 一致生产推荐requests: 1000m/2Gi、limits: 4000m/8Gi参考 K8S_SUMMARY.md。副本因子生产环境2 节点集群默认副本因子为 1。生产建议提升冗余- name: KAFKA_CFG_DEFAULT_REPLICATION_FACTOR value: 2 - name: KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR value: 2 - name: KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR value: 2 - name: KAFKA_CFG_MIN_INSYNC_REPLICAS value: 2其余可选调优项还包括KAFKA_CFG_NUM_IO_THREADS默认 8、KAFKA_CFG_NUM_NETWORK_THREADS默认 3、KAFKA_CFG_NUM_PARTITIONS默认 1、socket 收发缓冲区默认 102400、KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE默认 true生产建议关闭、KAFKA_COMPRESSION_TYPE如lz4等。扩缩容注意事项KRaft 的扩缩容与 ZooKeeper 模式不同需要谨慎操作扩容kubectl scale statefulset kafka -n db --replicas3之后必须把新节点加入KAFKA_CONTROLLER_QUORUM_VOTERS并重启全部 Pod操作成本较高。因此建议在初始部署时就按目标规模设置 replicas。缩容可能造成数据丢失。应先 reassign 待移除 broker 上的分区再执行kubectl scale statefulset kafka -n db --replicas1。故障排查Pod 不就绪kubectl describe pod kafka-0 -n db kubectl logs kafka-0 -n db常见原因PVC 未绑定检查 StorageClass、镜像拉取失败检查镜像名与仓库访问权限、配置错误检查环境变量。节点 ID 异常节点 ID 由 Pod 序号推导kafka-0 → 1kafka-1 → 2。验证kubectl exec kafka-0 -n db -- env | grep KAFKA_NODE_ID kubectl exec kafka-1 -n db -- env | grep KAFKA_NODE_ID kubectl logs -n db kafka-0 | grep node.id如果 ID 不正确需要调整 start-kafka.sh 中的推导逻辑。连接问题# 集群内连通性测试 kubectl run test -n db --rm -it --restartNever \ --imagebusybox -- nc -zv kafka.db.svc.cluster.local 9092 # 检查 Service 端点 kubectl get endpoints kafka -n db kubectl get endpoints kafka-headless -n db # 检查端口监听 kubectl exec kafka-0 -n db -- netstat -tlnpPVC 问题kubectl get pvc -n db kubectl describe pvc># 检查 Secret 是否存在及内容 kubectl get secret kafka-tls-certs -n db kubectl describe secret kafka-tls-certs -n db # 检查 Pod 内证书文件 kubectl exec kafka-0 -n db -- ls -la /tls/ # 验证证书内容 kubectl exec kafka-0 -n db -- openssl x509 -in /tls/server-cert.pem -text -noout仲裁Quorum问题# 查看 meta.properties kubectl exec kafka-0 -n db -- cat /bitnami/kafka/data/meta.properties # 打印集群元数据日志 kubectl exec kafka-0 -n db -- /usr/lib/kafka/bin/kafka-metadata.sh \ --snapshot /bitnami/kafka/data/__cluster_metadata-0/00000000000000000000.log \ --print镜像升级# 替换镜像 tag sed -i s|local/kafka:3|local/kafka:4|g k8s-kafka-kraft.yaml # 滚动升级 kubectl apply -f k8s-kafka-kraft.yaml kubectl rollout status statefulset/kafka -n db从 ZooKeeper 部署迁移到 KRaft由于 Kafka 3.x 不支持同一集群原地从 ZooKeeper 迁移到 KRaft推荐按以下步骤切换备份数据导出 topics 与 consumer offsets部署新 KRaft 集群使用本目录的清单数据复制用 MirrorMaker 2 将旧集群数据复制到新集群切流更新各客户端配置指向新集群地址kafka.db.svc.cluster.local:9092等下线移除旧的 ZooKeeper 集群。生产环境检查清单部署前逐项确认使用正规 CA 签发的证书而非自签名并在生产开启主机名校验依据负载设置资源 requests/limits配置合理的保留策略时长与容量双约束副本因子 ≥ 2min.insync.replicas≥ 2使用持久化存储并建立备份机制配置监控Prometheus/Grafana与日志聚合EFK/Loki配置 PodDisruptionBudget 与网络策略为 Kafka 使用专用节点池配置亲和/反亲和规则清单已内置 podAntiAffinity 以分散到不同主机测试故障切换场景并沉淀运行手册更完整的 TLS 细节、升级步骤与高级排障方法可继续阅读 K8S_DEPLOYMENT.md或参考 Docker Compose 形态的 CUSTOM_CONFIG.md 与 TLS_SETUP.md 了解同一镜像在非 K8s 环境的用法。赞分享可观测性开发工具前端后端【免费下载链接】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 仓库中可观测性开发工具前端后端如何自托管部署OpenReplayDocker Compose与Kubernetes等5种方式完整指南如何自托管部署OpenReplayDocker Compose与Kubernetes等5种方式完整指南 OpenReplay 是一款开源的 会话回放Sess可观测性开发工具前端后端OpenReplay 自托管 PostgreSQL 17 镜像解析Bitnami 兼容、非 root 运行与 Kubernetes 部署实战OpenReplay 自托管 PostgreSQL 17 镜像解析Bitnami 兼容、非 root 运行与 Kubernetes 部署实战 本指南围绕 Op可观测性开发工具前端后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
