ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

OpenReplay 自托管 Kafka 3.x KRaft 集群部署指南:从 Docker Compose 到 Kubernetes 的完整实践

OpenReplay 自托管 Kafka 3.x KRaft 集群部署指南:从 Docker Compose 到 Kubernetes 的完整实践 可观测性开发工具前端后端【免费下载链接】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 仓库中的 scripts/dockerfiles/kafka 目录系统讲解如何构建一个基于 Chainguard Wolfi 基础镜像、采用 KRaft 模式无需 ZooKeeper的 Kafka 3.x 生产级集群覆盖 PLAINTEXT 与 TLS/SSL 两种部署形态、环境变量配置体系、PEM 证书自动转换原理、客户端多语言接入以及故障排查。读完本文你将能够在 Podman/Docker 与 Kubernetes 环境中独立搭建、配置、加密并运维一个可复制的多节点 Kafka 集群并将这些能力直接用于 OpenReplay 自托管基础设施中的消息管道搭建。概述与设计目标该目录提供了一套精简但面向生产的 Kafka Docker 部署方案核心设计取向如下Kafka 3.x Chainguard Wolfi 基础镜像镜像基于cgr.dev/chainguard/wolfi-base以最小化、高安全性无已知 CVE为设计目标KRaft 模式彻底移除 ZooKeeper 依赖由 Kafka 自身承担元数据管理显著降低集群复杂度和运维负担简单的 TLS 配置只需提供 PEM 格式证书启动脚本会自动完成 PEM → PKCS12 → JKS 的转换免去手工创建 keystore 的痛苦2 节点集群默认提供两个 brokercontroller 合一的节点天然支持副本replication能力灵活配置通过环境变量即可覆盖绝大多数 Kafka broker 配置支持从常用命名变量到任意属性透传再到自定义 server.properties的三级定制。快速开始基础集群PLAINTEXT# 构建镜像并启动 podman-compose up -d # 验证集群可用 podman exec kafka-1 /usr/lib/kafka/bin/kafka-topics.sh \ --create --topic test \ --bootstrap-server kafka-1:9092TLS 加密集群# 生成证书 ./generate-certs.sh # 启动 TLS 集群 podman-compose -f docker-compose-tls.yml up -d自定义配置集群消息大小、留存策略等# 使用预设的自定义配置启动 podman-compose -f docker-compose-custom.yml up -d更完整的配置项说明见 CUSTOM_CONFIG.md。部署方式与文件对照Docker Compose文件说明适用场景docker-compose.yml基础 PLAINTEXT 集群kafka-1/kafka-2 双节点开发、测试docker-compose-tls.ymlPLAINTEXT SSL 监听器并存生产环境 TLS 加密docker-compose-custom.yml自定义配置示例10MB 消息、30 天留存、LZ4 压缩、线程调优等高吞吐、大消息场景三个 Compose 文件结构高度一致两个服务kafka-1、kafka-2均build: .基于同一 Dockerfile各自挂载独立命名卷保存数据并接入独立的 bridge 网络kafka-network/kafka-network-tls/kafka-network-custom避免不同形态的集群互相干扰。Kubernetes文件说明适用场景k8s-kafka-kraft.yamlKRaft StatefulSetPLAINTEXTK8s 开发/测试k8s-kafka-kraft-tls.yamlKRaft StatefulSetTLSK8s 生产k8s-generate-certs.sh生成 K8s 场景 TLS 证书TLS 部署准备Kubernetes 快速启动kubectl create namespace db kubectl apply -f k8s-kafka-kraft.yaml # 等待 Pod 就绪 kubectl wait --forconditionready pod -l app.kubernetes.io/namekafka -n db --timeout300s连接地址kafka.db.svc.cluster.local:9092。TLS 部署则在apply前先执行./k8s-generate-certs.shSSL 连接地址为kafka-ssl.db.svc.cluster.local:9094。与旧版 Helm ZooKeeper 方案的关键差异参见 K8S_QUICK_START.md新方案不再依赖 ZooKeeper只部署 kafka 一种 PodPVC、Service 命名保持兼容整体复杂度显著下降。更完整的 K8s 部署、扩缩容与 ZooKeeper 迁移说明见 K8S_DEPLOYMENT.md。端口规划标准集群节点PLAINTEXTCONTROLLERkafka-19092映射宿主 90929093映射宿主 9093kafka-29092 内部映射宿主 90949093 内部映射宿主 9095TLS 集群节点PLAINTEXTCONTROLLERSSLkafka-19092宿主 90929093宿主 90939094宿主 9094kafka-29092 内部宿主 90959093 内部宿主 90969094 内部宿主 9097注意 kafka-2 的对外端口9094/9095/9097是宿主端口映射容器内两个节点仍统一使用 9092/9093 内部端口broker 间通过容器网络内的主机名互访。架构解析镜像与启动链路从 Dockerfile 可以看到镜像的完整构成FROM cgr.dev/chainguard/wolfi-base RUN apk add --no-cache kafka~3 openssl bash tini \ mkdir -p /bitnami/kafka /usr/lib/kafka/logs \ chown -R 1001:1001 /bitnami/kafka /usr/lib/kafka/logs COPY start-kafka.sh /usr/local/bin/start-kafka.sh RUN chmod x /usr/local/bin/start-kafka.sh \ chown 1001:1001 /usr/local/bin/start-kafka.sh USER 1001 ENV LOG_DIR/bitnami/kafka/logs \ PATH/usr/lib/kafka/bin:$PATH ENTRYPOINT [/sbin/tini, --, /usr/local/bin/start-kafka.sh] CMD [/usr/lib/kafka/config/kraft/server.properties]关键点版本策略apk add kafka~3将 Kafka 锁定在 3.x 大版本当前工作目录的 CLUSTER_INFO.md 记录实测版本为 3.9.0既享受 3.x 特性又避免小版本漂移非 root 运行USER 1001数据目录、日志目录、启动脚本均属主 UID 1001符合容器安全最佳实践init 进程以 tini 作为 PID 1 包装启动脚本正确回收子进程、处理信号数据目录/bitnami/kafka/data由KAFKA_LOG_DIRS决定默认KAFKA_LOG_DIRS${KAFKA_LOG_DIRS:-/bitnami/kafka/data}日志目录/bitnami/kafka/logs对应LOG_DIR环境变量。启动脚本的核心职责start-kafka.sh 是整个方案的大脑其执行流程可以概括为四步PEM → JKS 自动转换start-kafka.sh当检测到KAFKA_SSL_CERT_FILE与KAFKA_SSL_KEY_FILE同时存在时先用openssl pkcs12 -export将 PEM 证书与私钥合成 PKCS12再用keytool -importkeystore转为 JKS keystore若提供KAFKA_SSL_CA_FILE则进一步导入生成 truststore最后导出KAFKA_SSL_KEYSTORE_LOCATION等变量供后续写配置。默认密码为kafka-ssl-pass可用KAFKA_SSL_KEYSTORE_PASSWORD覆盖动态生成 server.properties当检测到KAFKA_NODE_ID时以/usr/lib/kafka/config/kraft/server.properties为底稿sed删除node.id、process.roles、listeners、advertised.listeners等默认行再追加由环境变量拼装的自定义配置输出到/tmp/server.propertiesKRaft 存储格式化start-kafka.sh若$DATA_DIR/meta.properties不存在则调用kafka-storage.sh format。多节点场景下必须共享同一个KAFKA_CLUSTER_ID否则各节点会形成互相独立的集群启动 Kafka最终exec kafka-server-start.sh $CONFIG_FILE完成主进程接管。此外脚本还支持两个实用特性K8s 环境下KAFKA_NODE_ID若形如kafka-0/kafka-1会自动推导出数字节点 IDkafka-0 → 1、kafka-1 → 2见 start-kafka.shadvertised.listeners支持${MY_POD_NAME}占位符替换start-kafka.sh这正是 K8s StatefulSet 按 Pod 名宣告监听地址的实现基础。调试时设置DEBUG1可打印完整的生成配置。环境变量参考集群模式必填变量变量说明示例KAFKA_NODE_ID唯一节点标识1KAFKA_CLUSTER_ID集群共享 UUID多节点必须一致Sjg_Rr1iQbO9xpahgDbYpQKAFKA_PROCESS_ROLES节点角色broker,controllerKAFKA_LISTENERS监听器定义PLAINTEXT://:9092,CONTROLLER://:9093KAFKA_ADVERTISED_LISTENERS对外广播的监听地址PLAINTEXT://kafka-1:9092KAFKA_CONTROLLER_QUORUM_VOTERS控制器节点列表1kafka-1:9093,2kafka-2:9093辅助变量还包括KAFKA_CONTROLLER_LISTENER_NAMES默认CONTROLLER、KAFKA_INTER_BROKER_LISTENER_NAME默认PLAINTEXT、KAFKA_LISTENER_SECURITY_PROTOCOL_MAPTLS 集群必需例如PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,SSL:SSL、KAFKA_LOG_DIRS默认/bitnami/kafka/data、LOG_DIR默认/bitnami/kafka/logs。TLS 相关变量变量说明示例KAFKA_SSL_CERT_FILE服务端证书 PEM 路径/bitnami/kafka/certs/kafka-1-cert.pemKAFKA_SSL_KEY_FILE私钥 PEM 路径/bitnami/kafka/certs/kafka-1-key.pemKAFKA_SSL_CA_FILECA 证书路径可选/bitnami/kafka/certs/ca-cert.pemKAFKA_SSL_CLIENT_AUTH客户端认证模式默认requiredrequiredKAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM主机名校验默认https开发环境可置空常用自定义变量变量说明示例KAFKA_MESSAGE_MAX_BYTES单条消息最大字节数默认 1MB1048576010MBKAFKA_REPLICA_FETCH_MAX_BYTES副本拉取最大字节数10485760KAFKA_LOG_RETENTION_HOURS留存时长小时默认 168 7 天72030 天KAFKA_LOG_RETENTION_BYTES留存大小上限1073741824010GBKAFKA_LOG_SEGMENT_BYTES日志段文件大小默认 1GB1073741824KAFKA_COMPRESSION_TYPE压缩算法gzip/snappy/lz4/zstd/uncompressedlz4KAFKA_CFG_*任意 Kafka broker 属性透传KAFKA_CFG_NUM_NETWORK_THREADS8完整参考见 CUSTOM_CONFIG.md。配置定制三种层级方式一常用命名变量最简单针对消息大小、留存、压缩等高频需求提供语义化变量environment: KAFKA_MESSAGE_MAX_BYTES: 10485760 KAFKA_REPLICA_FETCH_MAX_BYTES: 10485760 KAFKA_LOG_RETENTION_HOURS: 168 KAFKA_COMPRESSION_TYPE: lz4这些变量会在启动脚本中映射为对应的 broker 配置KAFKA_MESSAGE_MAX_BYTES → message.max.bytes、KAFKA_REPLICA_FETCH_MAX_BYTES → replica.fetch.max.bytes、KAFKA_LOG_RETENTION_HOURS → log.retention.hours、KAFKA_LOG_RETENTION_BYTES → log.retention.bytes、KAFKA_LOG_SEGMENT_BYTES → log.segment.bytes、KAFKA_COMPRESSION_TYPE → compression.type对应 start-kafka.sh 中的处理逻辑。方式二KAFKA_CFG_前缀透传最灵活任何 Kafka broker 属性都能用KAFKA_CFG_前缀注入规则为点号变下划线、转大写、加前缀。启动脚本通过遍历所有KAFKA_CFG_开头的环境变量自动写入配置start-kafka.shenvironment: # num.network.threads8 KAFKA_CFG_NUM_NETWORK_THREADS: 8 # min.insync.replicas2 KAFKA_CFG_MIN_INSYNC_REPLICAS: 2 # auto.create.topics.enablefalse KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: false # log.flush.interval.messages10000 KAFKA_CFG_LOG_FLUSH_INTERVAL_MESSAGES: 10000映射示例num.network.threads → KAFKA_CFG_NUM_NETWORK_THREADS、min.insync.replicas → KAFKA_CFG_MIN_INSYNC_REPLICAS、auto.create.topics.enable → KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE。方式三自定义 server.properties高级直接挂载完整配置文件通过KAFKA_CONFIG_FILE指向services: kafka-1: volumes: - ./custom-server.properties:/tmp/custom.properties:ro environment: KAFKA_CONFIG_FILE: /tmp/custom.properties需要同步扩展 start-kafka.sh 以支持KAFKA_CONFIG_FILE即脚本首个位置参数对应CONFIG_FILE${1:-...}的机制将配置文件路径作为参数传入。常见定制场景增加消息大小上限docker-compose.yml 中追加environment: KAFKA_MESSAGE_MAX_BYTES: 10485760 # 10MB KAFKA_REPLICA_FETCH_MAX_BYTES: 10485760调整留存周期environment: KAFKA_LOG_RETENTION_HOURS: 720 # 30 天启用压缩environment: KAFKA_COMPRESSION_TYPE: lz4典型业务场景配置组合高吞吐 / 大消息CUSTOM_CONFIG.mdenvironment: # 允许 50MB 消息 KAFKA_MESSAGE_MAX_BYTES: 52428800 KAFKA_REPLICA_FETCH_MAX_BYTES: 52428800 # 增大缓冲区 KAFKA_CFG_SOCKET_SEND_BUFFER_BYTES: 1048576 KAFKA_CFG_SOCKET_RECEIVE_BUFFER_BYTES: 1048576 KAFKA_CFG_SOCKET_REQUEST_MAX_BYTES: 104857600 # 更多 I/O 线程 KAFKA_CFG_NUM_IO_THREADS: 16 # 使用压缩 KAFKA_COMPRESSION_TYPE: lz4客户端需同步设置max.request.size52428800、buffer.memory67108864。长期存储environment: KAFKA_LOG_RETENTION_HOURS: 8760 # 保留 1 年-1 表示不限制 KAFKA_CFG_LOG_CLEANUP_POLICY: compact,delete KAFKA_CFG_LOG_CLEANER_ENABLE: true低延迟 / 实时environment: KAFKA_CFG_LOG_FLUSH_INTERVAL_MESSAGES: 1 KAFKA_CFG_LOG_FLUSH_INTERVAL_MS: 1 KAFKA_LOG_SEGMENT_BYTES: 268435456 # 256MB KAFKA_CFG_NUM_NETWORK_THREADS: 16 KAFKA_COMPRESSION_TYPE: uncompressed注意频繁 flush 会降低吞吐仅在延迟敏感场景使用。灾备 / 高可用environment: KAFKA_CFG_MIN_INSYNC_REPLICAS: 2 KAFKA_CFG_DEFAULT_REPLICATION_FACTOR: 3 KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR: 2 KAFKA_CFG_REPLICA_LAG_TIME_MAX_MS: 30000TLS 加密两步搞定两步启用 TLS# 1. 生成证书 ./generate-certs.sh # 2. 启动 TLS 集群 podman-compose -f docker-compose-tls.yml up -d启用后的集群同时保留PLAINTEXT 与 SSL 两类监听器便于灰度迁移kafka-1 提供 9092明文/9093控制器/9094SSLkafka-2 提供 9095/9096/9097。配置只需要 3 个 PEM 文件每个 broker 只需声明证书、私钥、CA 三个路径docker-compose-tls.ymlenvironment: KAFKA_SSL_CERT_FILE: /bitnami/kafka/certs/kafka-1-cert.pem # 服务端证书 KAFKA_SSL_KEY_FILE: /bitnami/kafka/certs/kafka-1-key.pem # 私钥 KAFKA_SSL_CA_FILE: /bitnami/kafka/certs/ca-cert.pem # CA可选容器启动时会自动将 PEM 转换为 JKS转换流水线为检测 PEM 文件 →openssl pkcs12转 PKCS12 →keytool转 JKS keystore CA 生成 truststore→ 配置 Kafka → 清理临时文件 → 启动详见上文启动脚本流程与 TLS_SETUP.md。整个过程无需任何手工 keystore 操作。测试 SSL 连接# 创建客户端配置 cat client-ssl.properties EOF security.protocolSSL ssl.truststore.location/bitnami/kafka/certs/ca-cert.pem ssl.truststore.typePEM EOF # 通过 SSL 端口列 topic podman exec kafka-1-tls /usr/lib/kafka/bin/kafka-topics.sh \ --list --bootstrap-server kafka-1:9094 \ --command-config client-ssl.properties更完整的 SSL 创建 topic、生产、消费验证# 创建 topic podman exec kafka-1-tls /usr/lib/kafka/bin/kafka-topics.sh \ --create --topic secure-topic \ --bootstrap-server kafka-1:9094 \ --command-config client-ssl.properties # 生产消息 echo Hello TLS! | podman exec -i kafka-1-tls \ /usr/lib/kafka/bin/kafka-console-producer.sh \ --topic secure-topic \ --bootstrap-server kafka-1:9094 \ --producer.config client-ssl.properties # 消费消息 podman exec kafka-1-tls /usr/lib/kafka/bin/kafka-console-consumer.sh \ --topic secure-topic \ --from-beginning \ --bootstrap-server kafka-1:9094 \ --consumer.config client-ssl.properties \ --max-messages 1使用自有证书# 1. 拷贝证书kafka-1 与 kafka-2 各自替换 cp your-kafka-1-cert.pem certs/kafka-1-cert.pem cp your-kafka-1-key.pem certs/kafka-1-key.pem cp your-ca-cert.pem certs/ca-cert.pem # 2. 启动集群 podman-compose -f docker-compose-tls.yml up -d同样无需手工转换 keystore。TLS 生产环境清单使用 CA 签名证书将自签名证书替换为 CA如 Lets Encrypt、DigiCert签发的证书启用主机名校验删除 docker-compose-tls.yml 中的KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: 默认值为httpsbroker 间通信启用 SSL将KAFKA_INTER_BROKER_LISTENER_NAME改为SSL可选纯 SSL 集群从KAFKA_LISTENERS中移除 PLAINTEXT例如KAFKA_LISTENERS: CONTROLLER://:9093,SSL://:9094、KAFKA_ADVERTISED_LISTENERS: SSL://kafka-1:9094加固证书权限chmod 600 certs/*-key.pem、chmod 644 certs/*-cert.pem使用密钥管理生产环境优先采用 Kubernetes Secrets、HashiCorp Vault、AWS Secrets Manager 或 Docker Secrets。进阶SASL SSL需要更强认证时可在 SSL 之上叠加 SASLenvironment: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL,CONTROLLER:PLAINTEXT KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN KAFKA_SASL_ENABLED_MECHANISMS: SCRAM-SHA-512 # ... 其余 SSL 配置同上日常管理命令构建镜像make buildMakefile 还提供make dev构建并前台运行与make kube构建、推送镜像并直接应用到 K8s。默认镜像名为local/kafka:3构建器为podman可通过builder与image变量覆盖。查看日志podman logs kafka-1 podman logs kafka-2创建带副本的 topicpodman exec kafka-1 /usr/lib/kafka/bin/kafka-topics.sh \ --create --topic my-topic \ --bootstrap-server kafka-1:9092 \ --replication-factor 2 --partitions 3列出 topicpodman exec kafka-1 /usr/lib/kafka/bin/kafka-topics.sh \ --list --bootstrap-server kafka-1:9092生产消息podman exec -it kafka-1 /usr/lib/kafka/bin/kafka-console-producer.sh \ --topic my-topic --bootstrap-server kafka-1:9092消费消息podman exec -it kafka-2 /usr/lib/kafka/bin/kafka-console-consumer.sh \ --topic my-topic --from-beginning --bootstrap-server kafka-2:9092查看 broker 配置podman exec kafka-1 cat /tmp/server.properties # 或精确检查某项 podman exec kafka-1 grep message.max.bytes /tmp/server.properties # 通过 Kafka 工具查看生效配置 podman exec kafka-1 /usr/lib/kafka/bin/kafka-configs.sh \ --bootstrap-server localhost:9092 \ --entity-type brokers \ --entity-name 1 \ --describe集群启停与清理podman stop kafka-1 kafka-2 podman start kafka-1 kafka-2 # 彻底移除连同数据卷与网络 podman stop kafka-1 kafka-2 podman rm kafka-1 kafka-2 podman volume rm kafka-1-data kafka-2-data podman network rm kafka-network客户端连接指南连接方式总览PLAINTEXT无加密kafka-1 用kafka-1:9092kafka-2 用kafka-2:9092容器网络内从宿主访问用localhost:9092与localhost:9095。SSL加密kafka-1 用kafka-1:9094kafka-2 用kafka-2:9094容器网络内从宿主访问用localhost:9094与localhost:9097。客户端只需 CA 证书文件位于certs/目录即ca-cert.pembootstrap.serverskafka-1:9094,kafka-2:9094 security.protocolSSL ssl.truststore.location/path/to/ca-cert.pem ssl.truststore.typePEM ssl.endpoint.identification.algorithm从另一个容器接入# 启动客户端容器须与 broker 同网络 podman run -d --name kafka-client \ --network kafka-network-tls \ -v /path/to/certs:/certs:ro \ --entrypoint /bin/sh \ your-kafka-image:latest \ -c while true; do sleep 3600; done # 写入 SSL 客户端配置 podman exec kafka-client sh -c cat /tmp/ssl-client.properties EOF security.protocolSSL ssl.truststore.location/certs/ca-cert.pem ssl.truststore.typePEM ssl.endpoint.identification.algorithm EOF # 测试明文 podman exec kafka-client kafka-topics.sh --list --bootstrap-server kafka-1:9092 # 测试SSL podman exec kafka-client kafka-topics.sh --list \ --bootstrap-server kafka-1:9094 \ --command-config /tmp/ssl-client.properties常见语言接入示例Pythonkafka-pythonfrom kafka import KafkaProducer # PLAINTEXT producer KafkaProducer( bootstrap_servers[kafka-1:9092, kafka-2:9092] ) # SSL producer KafkaProducer( bootstrap_servers[kafka-1:9094, kafka-2:9094], security_protocolSSL, ssl_check_hostnameFalse, ssl_cafile/path/to/ca-cert.pem )Node.jskafkajsconst { Kafka } require(kafkajs) // SSL const kafka new Kafka({ clientId: my-app, brokers: [kafka-1:9094, kafka-2:9094], ssl: { rejectUnauthorized: false, ca: [fs.readFileSync(/path/to/ca-cert.pem, utf-8)] } })Gosaramaconfig : sarama.NewConfig() config.Net.TLS.Enable true caCert, _ : ioutil.ReadFile(/path/to/ca-cert.pem) caCertPool : x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) tlsConfig : tls.Config{ RootCAs: caCertPool, InsecureSkipVerify: true, } config.Net.TLS.Config tlsConfig brokers : []string{kafka-1:9094, kafka-2:9094}Java/Spring Boot 的对应配置为security.protocolSSL、ssl.truststore.location/path/to/ca-cert.pem、ssl.truststore.typePEM、ssl.endpoint.identification.algorithm: 。更多示例与网络要求细节见 CONNECTION_GUIDE.md。网络要求同网络容器使用主机名kafka-1/kafka-2必须位于同一 Podman/Docker 网络如kafka-network-tls宿主机访问使用localhost 映射端口PLAINTEXT9092/9095SSL9094/9097外部网络访问需修改KAFKA_ADVERTISED_LISTENERS为公网 IP/主机名并确保防火墙放行 9092-9097 端口。开发环境不校验证书的 TLS对 Python/Node.js/Go/.NET/Rust/Ruby/PHP 等非 Java 客户端可关闭证书校验仅保留加密不提供身份认证与中间人防护详见 INSECURE_TLS.md# Python跳过校验 import ssl ssl_context ssl.create_default_context() ssl_context.check_hostname False ssl_context.verify_mode ssl.CERT_NONE producer KafkaProducer( bootstrap_servers[kafka-1:9094, kafka-2:9094], security_protocolSSL, ssl_contextssl_context )// Node.js接受自签名证书 const kafka new Kafka({ clientId: my-app, brokers: [kafka-1:9094, kafka-2:9094], ssl: { rejectUnauthorized: false } })// Go跳过验证 config.Net.TLS.Config tls.Config{ InsecureSkipVerify: true }各类客户端参数对照Pythonssl_check_hostnameFalse, ssl_cert_reqsssl.CERT_NONENode.jsssl: { rejectUnauthorized: false }GoInsecureSkipVerify: true.NETEnableSslCertificateVerification falseRust/PHPenable.ssl.certificate.verificationfalseRubyssl_verify_hostname: false。注意Java/Kafka CLI 工具没有简单的insecure开关必须提供ca-cert.pem文件很小分发方便这是由 Java SSL 实现强制校验决定的。故障排查检查集群状态podman ps | grep kafka查看错误日志podman logs kafka-1 | tail -50 podman logs kafka-1 | grep -i error测试连通性podman exec kafka-1 /usr/lib/kafka/bin/kafka-broker-api-versions.sh \ --bootstrap-server kafka-1:9092消息过大MessageSizeTooLargeExceptionbroker、producer、consumer 三处必须对齐BrokerKAFKA_MESSAGE_MAX_BYTES: 10485760Producermax.request.size10485760Consumerfetch.max.bytes10485760。留存策略未生效时间与大小任一条件满足即触发删除CUSTOM_CONFIG.mdKAFKA_LOG_RETENTION_HOURS: 168 # 7 天后删除 KAFKA_LOG_RETENTION_BYTES: 10737418240 # 或超过 10GB 时删除设为-1表示不限制。SSL 连接被拒绝或握手失败# 检查 SSL 监听器 podman exec kafka-1-tls netstat -tlnp | grep 9094 # 检查 SSL 相关日志 podman logs kafka-1-tls | grep -i ssl证书主机名不匹配时为证书 SAN 添加 broker 主机名openssl req ... -addext subjectAltNameDNS:your-broker-hostname,DNS:localhost或开发环境临时关闭校验KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: 。Keystore was tampered with 通常意味着证书与私钥不匹配用模数比对验证openssl x509 -noout -modulus -in cert.pem | openssl md5 openssl rsa -noout -modulus -in key.pem | openssl md5 # 两个输出应一致客户端无法解析主机名确保容器位于同一网络或改用 IP/localhost 端口映射podman port kafka-1-tls可查看实际映射。生产环境上线清单使用 CA 签名证书而非自签名启用 TLS 主机名校验broker 间通信使用 SSL设置合理的消息大小上限配置留存策略调整性能参数线程、缓冲区关闭自动建 topicKAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: false配置监控JMX、Prometheus配置日志聚合实施备份策略使用密钥管理承载证书延伸阅读本目录下的配套文档构成了完整的部署知识体系TLS_SETUP.md — TLS 完整配置指南含 SASLSSL 进阶CUSTOM_CONFIG.md — 自定义 Kafka 设置消息大小、留存等与生产级完整 Compose 示例CLUSTER_INFO.md — 集群状态与测试命令CONNECTION_GUIDE.md — 应用连接指引INSECURE_TLS.md — 免证书校验的开发用 TLSK8S_QUICK_START.md 与 K8S_DEPLOYMENT.md — Kubernetes 快速启动与完整部署结合 Dockerfile、start-kafka.sh 以及三份 Compose 文件你可以从镜像层、启动链路、配置生成机制到运维命令全链路掌握这套 Kafka 部署方案并将其复用于 OpenReplay 自托管环境的任意消息基础设施场景。赞分享可观测性开发工具前端后端【免费下载链接】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 的 Kubernetes KRaft 快速部署指南OpenReplay 自托管 Kafka 的 Kubernetes KRaft 快速部署指南 导读 本指南面向在 Kubernetes 上部署 OpenRepl可观测性开发工具前端后端OpenReplay 自托管 Kafka 的 Kubernetes KRaft 部署指南以 StatefulSet 平滑替换 Helm ZooKeeperOpenReplay 自托管 Kafka 的 Kubernetes KRaft 部署指南以 StatefulSet 平滑替换 Helm ZooKeeper可观测性开发工具前端后端如何自托管部署OpenReplayDocker Compose与Kubernetes等5种方式完整指南如何自托管部署OpenReplayDocker Compose与Kubernetes等5种方式完整指南 OpenReplay 是一款开源的 会话回放Sess可观测性开发工具前端后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表