/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
🌟 Kafbat UI
Kafbat UI 是一款开源的 Apache Kafka 可视化管理工具,它为 Kafka 集群提供了一个直观、美观的 Web 界面。如果你厌倦了在命令行里敲各种 kafka-topics.sh、kafka-console-consumer.sh 来查看 Topic、消费消息、监控集群状态,那么 Kafbat UI 就是为你准备的。
| 📊 集群监控 | 实时查看 Broker 状态、Topic 列表、消费者组偏移量、分区分布等核心指标 |
| 📨 消息管理 | 浏览、搜索、发送消息,支持 Avro、Protobuf、JSON Schema 等多种格式 |
| 🔧 运维操作 | 创建/删除 Topic、调整分区数、重置消费者组偏移量,一应俱全 |
| 🔐 安全集成 | 支持 SSL、SASL、Schema Registry、Kafka Connect 等企业级特性 |
💡 Kafbat UI 把 Kafka 的命令行能力全部搬进了浏览器,让开发和运维效率提升一个数量级。

文章目录
-
- 🌟 Kafbat UI
- 🏗️ 概览
-
- 架构要点解读
- 🚀 快速上手 Demo
-
- 一键启动命令
- 三步上手
- 📦 镜像分发详解
-
- 镜像类型对比
-
- Release 镜像 🎯
- Snapshot 镜像 ⚡
- 三大镜像仓库
- ⚙️ 配置入门
-
- 两种配置方式对比
- YAML 配置结构
- 配置加载的优先级
- 🛠️ 部署方式大全
-
- 方式一:Docker Compose 持久化部署 📦
- 方式二:Helm Chart(Kubernetes)☸️
-
- 基础安装
- 配置方式 1:YAML Dict 模式
- 配置方式 2:ConfigMap(配置文件)模式
- 配置方式 3:ConfigMap(环境变量)模式
- 方式三:源码构建 🔨
- 💚 健康检查
-
- Kubernetes 健康检查配置示例
- 📚 进阶资源
- 📖 参考来源
🏗️ 概览
Kafbat UI 是一个纯客户端应用——它本身不存储任何数据,所有信息都来自你配置的 Kafka 集群及其相关组件。
#mermaid-svg-siCtyfeO0SzpAGqD{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-siCtyfeO0SzpAGqD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-siCtyfeO0SzpAGqD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-siCtyfeO0SzpAGqD .error-icon{fill:#552222;}#mermaid-svg-siCtyfeO0SzpAGqD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-siCtyfeO0SzpAGqD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-siCtyfeO0SzpAGqD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-siCtyfeO0SzpAGqD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-siCtyfeO0SzpAGqD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-siCtyfeO0SzpAGqD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-siCtyfeO0SzpAGqD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-siCtyfeO0SzpAGqD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-siCtyfeO0SzpAGqD .marker.cross{stroke:#333333;}#mermaid-svg-siCtyfeO0SzpAGqD svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-siCtyfeO0SzpAGqD p{margin:0;}#mermaid-svg-siCtyfeO0SzpAGqD .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-siCtyfeO0SzpAGqD .cluster-label text{fill:#333;}#mermaid-svg-siCtyfeO0SzpAGqD .cluster-label span{color:#333;}#mermaid-svg-siCtyfeO0SzpAGqD .cluster-label span p{background-color:transparent;}#mermaid-svg-siCtyfeO0SzpAGqD .label text,#mermaid-svg-siCtyfeO0SzpAGqD span{fill:#333;color:#333;}#mermaid-svg-siCtyfeO0SzpAGqD .node rect,#mermaid-svg-siCtyfeO0SzpAGqD .node circle,#mermaid-svg-siCtyfeO0SzpAGqD .node ellipse,#mermaid-svg-siCtyfeO0SzpAGqD .node polygon,#mermaid-svg-siCtyfeO0SzpAGqD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-siCtyfeO0SzpAGqD .rough-node .label text,#mermaid-svg-siCtyfeO0SzpAGqD .node .label text,#mermaid-svg-siCtyfeO0SzpAGqD .image-shape .label,#mermaid-svg-siCtyfeO0SzpAGqD .icon-shape .label{text-anchor:middle;}#mermaid-svg-siCtyfeO0SzpAGqD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-siCtyfeO0SzpAGqD .rough-node .label,#mermaid-svg-siCtyfeO0SzpAGqD .node .label,#mermaid-svg-siCtyfeO0SzpAGqD .image-shape .label,#mermaid-svg-siCtyfeO0SzpAGqD .icon-shape .label{text-align:center;}#mermaid-svg-siCtyfeO0SzpAGqD .node.clickable{cursor:pointer;}#mermaid-svg-siCtyfeO0SzpAGqD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-siCtyfeO0SzpAGqD .arrowheadPath{fill:#333333;}#mermaid-svg-siCtyfeO0SzpAGqD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-siCtyfeO0SzpAGqD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-siCtyfeO0SzpAGqD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-siCtyfeO0SzpAGqD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-siCtyfeO0SzpAGqD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-siCtyfeO0SzpAGqD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-siCtyfeO0SzpAGqD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-siCtyfeO0SzpAGqD .cluster text{fill:#333;}#mermaid-svg-siCtyfeO0SzpAGqD .cluster span{color:#333;}#mermaid-svg-siCtyfeO0SzpAGqD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-siCtyfeO0SzpAGqD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-siCtyfeO0SzpAGqD rect.text{fill:none;stroke-width:0;}#mermaid-svg-siCtyfeO0SzpAGqD .icon-shape,#mermaid-svg-siCtyfeO0SzpAGqD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-siCtyfeO0SzpAGqD .icon-shape p,#mermaid-svg-siCtyfeO0SzpAGqD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-siCtyfeO0SzpAGqD .icon-shape .label rect,#mermaid-svg-siCtyfeO0SzpAGqD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-siCtyfeO0SzpAGqD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-siCtyfeO0SzpAGqD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-siCtyfeO0SzpAGqD :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
🎯 Kafka 生态层
📦 Kafbat UI 应用层
👤 用户层
HTTP/WebSocket
Kafka 协议
Kafka 协议
Kafka 协议
HTTP
HTTP
🌐 浏览器 (Web UI)
Spring Boot 后端
REST API 接口
⚙️ 动态配置 (可选)
💾 Kafka Broker
💾 Kafka Broker
💾 Kafka Broker
📋 Schema Registry
🔌 Kafka Connect
图 1:Kafbat UI 架构示意图
架构要点解读
-
✅ 无状态设计:Kafbat UI 本身不持久化业务数据,重启不会丢失 Kafka 中的任何消息
-
✅ 多集群支持:一个 UI 实例可以同时管理多个 Kafka 集群,通过左侧菜单切换
-
✅ 可选动态配置:开启 DYNAMIC_CONFIG_ENABLED=true 后,可通过 Web 界面动态修改配置并存入本地文件
-
✅ 丰富的集成:原生支持 Schema Registry、Kafka Connect、Kafka Streams 等周边组件
🚀 快速上手 Demo
一键启动命令
docker run -it -p 8080:8080 \\
-e DYNAMIC_CONFIG_ENABLED=true \\
ghcr.io/kafbat/kafka-ui
三步上手
第 1 步 · 执行启动命令
在终端中运行上面的 Docker 命令。首次运行会自动拉取镜像,耐心等待即可。
第 2 步 · 打开 Web 界面
浏览器访问 http://localhost:8080,你就会看到 Kafbat UI 的欢迎页面。
第 3 步 · 添加你的 Kafka 集群
通过 UI 上的配置向导,输入你的 Kafka Broker 地址,即可开始管理集群。
🔍 DYNAMIC_CONFIG_ENABLED 是什么?
这个环境变量开启了「动态配置」模式。开启后,你可以直接在 Web 界面上添加/修改 Kafka 集群配置,而不需要手动编辑配置文件。对于 Demo 和开发环境非常方便,生产环境则建议使用固定的 YAML 配置文件。
⚠️ Demo 模式的局限
这种方式虽然简单,但有两个问题: ① 配置信息不会持久化(容器删除就没了) ② 只适合快速体验,不适合生产环境使用
如果需要持久化安装,请继续阅读下面的内容。
📦 镜像分发详解
Kafbat UI 通过 Docker 镜像分发,理解镜像的类型和获取渠道,可以帮助你根据场景选择最合适的版本。
镜像类型对比
Kafbat UI 发布两种类型的镜像,分别对应不同的使用场景:
| Release(正式版) | latest / v1.0.0 | 数周一次 | ⭐⭐⭐⭐⭐ 高 | 生产环境、对稳定性要求高的场景 |
| Snapshot(快照版) | main / b241abe | 每次提交 | ⭐⭐⭐ 中 | 需要最新功能、愿意尝鲜的开发者 |
Release 镜像 🎯
Release 镜像是经过完整测试的正式版本,使用语义化版本号(Semantic Versioning)命名,例如 v1.0.0。同时,latest 标签始终指向最新的正式版。
📌 生产环境建议:使用具体的版本号标签(如 v1.0.0),而不是 latest,这样可以避免意外升级带来的风险。
Snapshot 镜像 ⚡
Snapshot 镜像对应 main 分支的每一次代码提交,标签就是提交的短 SHA 值(如 b241abe)。main 标签则始终指向 main 分支的最新构建。
💡 小技巧
如果你需要某个还没正式发布的新功能,可以使用 Snapshot 镜像。为了避免版本漂移,建议使用具体的 SHA 标签(如 b241abe)而不是 main,这样每次拉取的镜像都是固定的。
三大镜像仓库
Kafbat UI 将镜像发布到三个不同的容器仓库,它们各有特点,你可以根据网络环境和需求选择:
| GHCR(主仓库) | ghcr.io/kafbat/kafka-ui | Release + Snapshot | 需要认证 | ⭐⭐⭐⭐⭐ 首选 |
| AWS ECR(镜像) | public.ecr.aws/kafbat/kafka-ui | 仅 Release | 无明确限制 | ⭐⭐⭐⭐ 备用 |
| Docker Hub(镜像) | kafbat/kafka-ui | 仅 Release | 匿名用户有拉取限制 | ⭐⭐⭐ 备选 |
📌 为什么 GHCR 是首选?
GHCR(GitHub Container Registry)是 Kafbat UI 的主要镜像仓库,原因有三: ① 包含所有镜像类型(Release 和 Snapshot 都有) ② 与 GitHub 代码仓库集成紧密,发布最快 ③ 认证后拉取速度稳定,没有 Docker Hub 那样的匿名限流问题
⚙️ 配置入门
体验完 Demo 之后,就该认真配置了。Kafbat UI 支持 两种配置方式:YAML 配置文件 和 环境变量。它们可以单独使用,也可以组合使用。
两种配置方式对比
| 可读性 | ⭐⭐⭐⭐⭐ 结构清晰,易于阅读 | ⭐⭐⭐ 层级多时较长 |
| 复杂配置 | ✅ 天然支持嵌套结构 | ⚠️ 需要下划线转义 |
| 版本管理 | ✅ 方便 Git 跟踪 | ⚠️ 散落在各处 |
| 容器部署 | 需要挂载文件 | 直接传入即可 |
| 官方推荐 | ✅ 强烈推荐 | 用于覆盖特定配置 |
💡 最佳实践
主体配置使用 YAML 文件,环境变量仅用于覆盖不同环境的差异项(如数据库密码、集群地址等)。官方也提供了一个在线转换工具,可以在 YAML 和环境变量之间互相转换。
YAML 配置结构
配置文件的核心是 kafka.clusters 数组——你可以在这里定义一个或多个 Kafka 集群。下面是一个典型的配置示例,展示了最常用的配置项:
# ============================================================
# Kafbat UI 核心配置
# ============================================================
kafka:
clusters:
# —- 集群 1:本地开发集群 —-
– name: local–dev # 集群名称(UI 中显示)
bootstrap-servers: kafka1:9092,kafka2:9092 # Broker 地址列表
# SSL 安全连接配置(可选)
ssl:
truststore-location: /path/to/truststore.jks
truststore-password: your–password
verify-ssl: true
# Schema Registry 集成(可选)
schemaRegistry: http://schema–registry:8085
schemaRegistryShowNullValues: true
# Kafka Connect 集成(可选)
kafkaConnect:
– name: connect–cluster–1
address: http://kafka–connect:8083
# ============================================================
# 服务器配置
# ============================================================
server:
port: 8080 # 服务端口
servlet:
context-path: / # 上下文路径
# ============================================================
# 动态配置(可选)
# ============================================================
dynamic:
config:
enabled: true # 启用 Web 界面动态配置
file: /etc/kafkaui/dynamic_config.yaml # 动态配置文件路径
配置加载的优先级
当 YAML 和环境变量同时存在时,它们的关系是「互补」而非「互斥」。理解加载顺序可以帮你排查配置不生效的问题:
#mermaid-svg-mRhyf68u1sQTzuNZ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mRhyf68u1sQTzuNZ .error-icon{fill:#552222;}#mermaid-svg-mRhyf68u1sQTzuNZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mRhyf68u1sQTzuNZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mRhyf68u1sQTzuNZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mRhyf68u1sQTzuNZ .marker.cross{stroke:#333333;}#mermaid-svg-mRhyf68u1sQTzuNZ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mRhyf68u1sQTzuNZ p{margin:0;}#mermaid-svg-mRhyf68u1sQTzuNZ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-mRhyf68u1sQTzuNZ .cluster-label text{fill:#333;}#mermaid-svg-mRhyf68u1sQTzuNZ .cluster-label span{color:#333;}#mermaid-svg-mRhyf68u1sQTzuNZ .cluster-label span p{background-color:transparent;}#mermaid-svg-mRhyf68u1sQTzuNZ .label text,#mermaid-svg-mRhyf68u1sQTzuNZ span{fill:#333;color:#333;}#mermaid-svg-mRhyf68u1sQTzuNZ .node rect,#mermaid-svg-mRhyf68u1sQTzuNZ .node circle,#mermaid-svg-mRhyf68u1sQTzuNZ .node ellipse,#mermaid-svg-mRhyf68u1sQTzuNZ .node polygon,#mermaid-svg-mRhyf68u1sQTzuNZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mRhyf68u1sQTzuNZ .rough-node .label text,#mermaid-svg-mRhyf68u1sQTzuNZ .node .label text,#mermaid-svg-mRhyf68u1sQTzuNZ .image-shape .label,#mermaid-svg-mRhyf68u1sQTzuNZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-mRhyf68u1sQTzuNZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mRhyf68u1sQTzuNZ .rough-node .label,#mermaid-svg-mRhyf68u1sQTzuNZ .node .label,#mermaid-svg-mRhyf68u1sQTzuNZ .image-shape .label,#mermaid-svg-mRhyf68u1sQTzuNZ .icon-shape .label{text-align:center;}#mermaid-svg-mRhyf68u1sQTzuNZ .node.clickable{cursor:pointer;}#mermaid-svg-mRhyf68u1sQTzuNZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mRhyf68u1sQTzuNZ .arrowheadPath{fill:#333333;}#mermaid-svg-mRhyf68u1sQTzuNZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mRhyf68u1sQTzuNZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mRhyf68u1sQTzuNZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mRhyf68u1sQTzuNZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mRhyf68u1sQTzuNZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mRhyf68u1sQTzuNZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mRhyf68u1sQTzuNZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mRhyf68u1sQTzuNZ .cluster text{fill:#333;}#mermaid-svg-mRhyf68u1sQTzuNZ .cluster span{color:#333;}#mermaid-svg-mRhyf68u1sQTzuNZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mRhyf68u1sQTzuNZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mRhyf68u1sQTzuNZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-mRhyf68u1sQTzuNZ .icon-shape,#mermaid-svg-mRhyf68u1sQTzuNZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mRhyf68u1sQTzuNZ .icon-shape p,#mermaid-svg-mRhyf68u1sQTzuNZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mRhyf68u1sQTzuNZ .icon-shape .label rect,#mermaid-svg-mRhyf68u1sQTzuNZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mRhyf68u1sQTzuNZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mRhyf68u1sQTzuNZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mRhyf68u1sQTzuNZ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
DYNAMIC_CONFIG_ENABLED=true 时生效
📄 YAML 配置文件 (基础配置)
⚙️ 最终生效配置
🌱 环境变量 (覆盖/补充)
🖱️ 动态配置文件 (Web UI 修改)
图 2:配置加载优先级示意
⚠️ 注意事项
环境变量的命名规则是将 YAML 的层级用下划线 _ 连接,并转为大写。 例如 kafka.clusters[0].name 对应的环境变量是 KAFKA_CLUSTERS_0_NAME。
🛠️ 部署方式大全
从本地 Demo 到生产环境,Kafbat UI 提供了多种部署方案。选择哪种取决于你的基础设施和运维习惯。
方式一:Docker Compose 持久化部署 📦
这是最常用的部署方式——比裸 Docker 更规范,比 Helm 更简单。通过挂载配置文件,你的配置可以在容器重启后保留。
version: '3.8'
services:
kafbat-ui:
container_name: kafbat–ui
image: ghcr.io/kafbat/kafka–ui:latest
ports:
– "8080:8080"
environment:
DYNAMIC_CONFIG_ENABLED: true
volumes:
# 将本地配置文件挂载到容器中
– ./config.yml:/etc/kafkaui/dynamic_config.yaml
restart: unless–stopped
📌 配置文件从哪来?
如果挂载的配置文件不存在,容器会自动创建一个空的。你可以开启 DYNAMIC_CONFIG_ENABLED=true,在 Web UI 中配置好集群后,配置就会自动写入挂载的文件中。也可以从官方示例直接参考。
方式二:Helm Chart(Kubernetes)☸️
如果你的基础设施在 Kubernetes 上,使用 Helm Chart 是最标准的做法。Kafbat UI 提供了官方 Helm 仓库,安装非常简单。
基础安装
# 添加 Helm 仓库
helm repo add kafbat-ui https://kafbat.github.io/helm-charts
helm repo update
# 安装(默认配置)
helm install kafbat-ui kafbat-ui/kafka-ui
配置方式 1:YAML Dict 模式
创建 values.yml 文件,在 yamlApplicationConfig 下写入完整的 YAML 配置:
# values.yml
yamlApplicationConfig:
kafka:
clusters:
– name: my–cluster
bootstrapServers: kafka–broker:9092
auth:
type: disabled
management:
health:
ldap:
enabled: false
helm install kafbat-ui kafbat-ui/kafka-ui -f values.yml
配置方式 2:ConfigMap(配置文件)模式
如果你习惯用 ConfigMap 管理配置,可以先创建 ConfigMap,再通过 Helm 引用:
# configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: kafbat–ui–configmap
data:
config.yml: |–
kafka:
clusters:
– name: my–cluster
bootstrapServers: kafka–broker:9092
kubectl apply -f configmap.yml
helm install kafbat-ui kafbat-ui/kafka-ui \\
–set yamlApplicationConfigConfigMap.name="kafbat-ui-configmap" \\
–set yamlApplicationConfigConfigMap.keyName="config.yml"
配置方式 3:ConfigMap(环境变量)模式
# configmap-env.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: kafbat–ui–helm–values
data:
KAFKA_CLUSTERS_0_NAME: "kafka-cluster-name"
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka-cluster-broker-endpoints:9092"
AUTH_TYPE: "DISABLED"
MANAGEMENT_HEALTH_LDAP_ENABLED: "FALSE"
kubectl apply -f configmap-env.yml
helm install kafbat-ui kafbat-ui/kafka-ui –set existingConfigMap="kafbat-ui-helm-values"
🔄 三种 Helm 配置方式怎么选?
| YAML Dict | 配置项不多时最简单,全部写在 values.yml 里 |
| ConfigMap(配置文件) | 配置复杂时更清晰,单独管理配置文件 |
| ConfigMap(环境变量) | 适合少量配置覆盖,或与现有 ConfigMap 体系对齐 |
方式三:源码构建 🔨
如果你需要自定义修改代码,或者你的环境无法访问 Docker Registry,可以选择从源码构建。这需要 Java 和 Node.js 环境,具体步骤可以参考官方的构建指南。
⚠️ 适用人群
源码构建主要面向需要二次开发的高级用户。大多数情况下,使用官方镜像就足够了。如果你只是想使用最新功能,Snapshot 镜像通常是更省事的选择。
💚 健康检查
在生产环境中,健康检查是必不可少的。Kafbat UI 基于 Spring Boot Actuator 提供了标准的健康检查端点,方便你集成到 Kubernetes、Docker Compose 或其他运维系统中。
| ❤️ Liveness / Readiness | /actuator/health — 同时用作存活检查和就绪检查 |
| ℹ️ 应用信息 | /actuator/info — 返回版本号、构建信息等元数据 |
Kubernetes 健康检查配置示例
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
💡 为什么 initialDelay 不一样?
Liveness probe 的 initialDelaySeconds 设得更长(30秒),给应用足够的启动时间,避免刚启动就被误杀。Readiness probe 则更激进(10秒),确保应用准备好之后才接收流量。这是 Spring Boot 应用的典型配置方式。
📚 进阶资源
读完本指南,你应该已经对 Kafbat UI 有了全面的了解。如果想深入学习,以下资源可以帮你更进一步:
| 🧙 配置向导 | Web UI 中的可视化集群配置工具 | configuration/configuration-wizard |
| 📄 配置文件详解 | 完整的 YAML 配置项说明 | configuration/configuration-file |
| 📦 Compose 示例 | 各种场景的 Docker Compose 配置模板 | configuration/compose-examples |
| ⚙️ 杂项配置属性 | 所有环境变量和配置属性的完整列表 | configuration/misc-configuration-properties |
| ☸️ Helm Chart | Kubernetes 部署的完整指南 | configuration/helm-charts/quick-start |
| 🤝 贡献指南 | 想参与开源?从这里开始 | development/contributing |
🎯 写在最后
Kafbat UI 是一个活跃的开源项目,社区一直在迭代更新。如果你在使用中遇到问题,可以通过 GitHub Issues 寻求帮助,也欢迎参与贡献,让这个工具变得更好。
📖 参考来源
Kafbat UI 官方文档 – Getting Started:https://ui.docs.kafbat.io/overview/getting-started






