Strimzi KRaft模式部署指南:无ZooKeeper的Kafka集群如何配置?
【免费下载链接】strimzi-kafka-operatorApache Kafka® running on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/st/strimzi-kafka-operator
Strimzi 是运行在 Kubernetes 上的 Apache Kafka® 发行版,通过 Cluster Operator 自动化管理 Kafka 集群的创建、升级与扩缩容。从 Kafka 4.0 开始,KRaft 模式(Kafka Raft 元数据)彻底取代了 ZooKeeper 依赖,Strimzi 也随之移除对 ZooKeeper 集群的支持——如今部署无 ZooKeeper 的 Kafka 集群,只需两个自定义资源:Kafka与KafkaNodePool。本文将带你用最少的配置完成 Strimzi KRaft 模式部署,并讲清每种节点角色的取舍。
一、为什么选择 KRaft 模式部署 Kafka
传统 Kafka 依赖一个独立的 ZooKeeper 集群来存储元数据和协调集群状态,这意味着多维护一套有状态组件。KRaft 模式把元数据管理直接内置到 Kafka 中:
- 更少组件:无需部署和运维 ZooKeeper,降低操作与安全风险
- 更高效率:元数据以
__cluster_metadata单分区日志形式存储,通过 Raft 共识协议复制 - 更强扩展性:Broker 与控制平面解耦,架构更简洁
需要注意的是:Kafka 4.0 仅以 KRaft 模式运行,因此使用 Strimzi 0.46+ 部署新集群时,KRaft 不是"可选项"而是唯一路径。旧版 ZooKeeper 集群需要先迁移再升级(参考 con-migrate-kraft-pre-0.39.adoc)。
二、核心概念:两个资源搞定整个集群
在 KRaft 模式下,Strimzi 用两个自定义资源描述集群:
| 资源 | 职责 | 关键属性 |
|---|---|---|
Kafka | 集群级配置 | version、metadataVersion、listeners、config |
KafkaNodePool | 节点池(一组同角色节点) | roles、replicas、storage |
节点池通过.spec.roles声明节点扮演的角色,这正是 KRaft 的精髓:
- Controller:控制平面,管理集群元数据与状态
- Broker:数据平面,负责消息的读写与存储
- Dual-role(双角色):一个节点同时承担两者,适合开发测试
KafkaNodePool中未指定的配置会继承自Kafka资源,因此"集群统一配置 + 节点池差异化配置"的组合非常灵活。官方对节点池的详细设计说明见 con-kafka-concepts-node-pools.adoc。
三、三种部署模式,按需选择
Strimzi 在 examples/kafka/ 目录下提供了现成的 KRaft 部署示例,覆盖典型场景:
3.1 开发测试:双角色节点(推荐起步)
示例文件:kafka-with-dual-role-nodes.yaml
3 个节点同时担任 Controller 和 Broker,一个节点池搞定一切,配置最简单:
kind: KafkaNodePool spec: replicas: 3 roles: - controller - broker3.2 生产环境:Controller 与 Broker 分离
示例文件:kafka-persistent.yaml
生产环境推荐专用 3 个 Controller 节点 + 独立的 Broker 节点池:Controller 不受消息流量干扰,Broker 池可独立扩缩容,故障域更清晰。
3.3 单机体验:一个节点全都要
示例文件:kafka-single-node.yaml
适合本地学习 KRaft 架构,将副本因子调为 1 即可运行。
四、快速部署步骤(5 分钟跑起来)
1️⃣安装 Cluster Operator:应用 install/cluster-operator/ 下的清单文件(CRD、RBAC、ConfigMap 与 Deployment 已齐备)。
2️⃣获取示例文件(如需克隆仓库):
git clone https://gitcode.com/GitHub_Trending/st/strimzi-kafka-operator3️⃣应用 KRaft 集群(以双角色节点为例):
kubectl apply -f examples/kafka/kafka-with-dual-role-nodes.yaml4️⃣检查部署状态:
kubectl get pods当输出中my-cluster-pool-a-0/1/2的STATUS显示Running时,集群就绪。节点 ID 从 0 开始跨所有节点池连续分配,扩容/缩容规则详见 proc-deploy-kafka-cluster-kraft.adoc。
五、必须了解的关键配置
metadataVersion:KRaft 元数据版本必须与version中的 Kafka 版本兼容,两者都在Kafka资源中声明(示例中使用4.3.1+4.3-IV0)。- 副本因子:生产环境建议显式设置
default.replication.factor: 3、min.insync.replicas: 2。⚠️ 若删除min.insync.replicas,Cluster Operator 会强制回退为 1,降低持久性。 kraftMetadata:JBOD 多卷存储时,可用该属性指定元数据日志存放的磁盘卷,说明见 con-config-storage-kraft-metadata.adoc。- 静态仲裁限制:当前 Strimzi 使用静态 Controller 仲裁,不支持动态增删/扩缩 Controller 节点池,改造角色前请阅读 assembly-kraft-mode.adoc 中的限制章节。
六、安全与生产建议
- 启用 TLS:官方示例均配置了
plain(9092) 与tls(9093) 双监听器,生产环境客户端应走 TLS 端口 - 命名空间隔离:同一命名空间内不要部署多个 Kafka 集群,避免命名冲突
- 资源配额:为节点池设置
resources的 requests/limits,避免资源争抢 - Entity Operator:保留
entityOperator配置,自动获得 Topic 与 User 管理能力
七、继续深入:文档与源码索引
| 想了解什么 | 去哪里看 |
|---|---|
| Kafka 完整配置属性 | con-config-kafka-kraft.adoc |
| 节点池配置详解 | con-config-node-pools.adoc |
| 节点角色变更(拆池/合池) | con-config-node-pool-roles.adoc |
| 集群 API 模型源码 | api/src/main/java/io/strimzi/api/kafka/model/kafka/ |
| Cluster Operator 核心代码 | cluster-operator/src/main/java/ |
| 更多部署示例 | examples/kafka/ 与 examples/security/ |
总结
Strimzi 让"无 ZooKeeper 的 Kafka"变得极其简单:一份Kafka资源定集群,一个或多个KafkaNodePool定角色,kubectl apply之后即可得到完整运行的 KRaft 模式集群。开发用双角色节点起步,生产用 Controller/Broker 分离架构——掌握这两套模式,你已经完成了 KRaft 集群部署的核心功。🚀
【免费下载链接】strimzi-kafka-operatorApache Kafka® running on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/st/strimzi-kafka-operator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考