---
title: "Monedula GitOps：面向 CLI 与 Kubernetes 的声明式 Kafka 管理"
date: 2026-08-24T00:00:00.000Z
author: "grzegorz"
excerpt: "Monedula GitOps 用纳入版本控制的清单来管理 Kafka 主题、访问权限、配额、schema、用户与 Confluent RBAC，既可以通过 CLI，也可以通过 Kubernetes operator。"
---
Kafka 的配置很少集中在一个地方。

主题由一个脚本创建，ACL 由另一个脚本创建，schema 来自应用的流水线，配额由管理员设置，Confluent RBAC 的角色绑定又由另一套工具管理。时间一长，运行中的集群成了这个系统唯一可靠的描述——但那既不是有意设计出来的描述，也不是能被评审的描述。

这正是我们做 [Monedula GitOps](https://github.com/monedula-dev/monedula-gitops) 的原因：一个把 Kafka 资源当作声明式、可版本化 YAML 来管理的开源工具。

目标很简单：

> 在 Git 中描述期望的 Kafka 状态，像评审代码一样评审它，把它和运行中的集群做比较，再让集群向它收敛。

本文介绍首个公开版本 `v0.1.0`。它聚焦于模型和基本工作流，而不是重复完整文档。

## 为什么还要再做一个 Kafka 的 GitOps 工具？

GitOps 给基础设施带来清晰的事实来源、评审历史、可重复的变更和漂移检测。但 Kafka 不只是主题。一个真正好用的管理工具还必须理解访问规则、消费者组、配额、schema、凭据，以及在 Confluent Platform 里的 RBAC 角色绑定。

还有一个落地问题：大多数 Kafka 集群早就存在了。在采用 GitOps 之前手工把它们的完整状态重建成清单，是一道很高的迁移门槛。

Monedula GitOps 就是围绕这两个问题设计的：

* 覆盖那些通常要放在一起的 Kafka 专有资源；
* 让最常见的场景保持简单，尤其是一个主题以及被允许使用它的应用；
* 通过导入流程支持已有集群；
* 用不用 Kubernetes 都能工作。

## 一套声明式模型，两种运行方式

最核心的设计决定是：CLI 和 Kubernetes operator 使用同一套资源模型和同一个协调（reconciliation）引擎。

在 CLI 模式下，可以在开发机或 CI/CD 流水线中校验、比较、应用和验证清单。在 operator 模式下，同样这些 Kubernetes 风格的资源被安装为 CRD，并在 Kubernetes 集群内部持续协调。

因此，CLI 使用的 `KafkaTopic` 也可以作为 Kubernetes 自定义资源来应用。凭据的提供方式在两种运行时中自然不同——例如 CLI 用环境变量或文件引用，operator 用 Kubernetes Secret——但期望状态、漂移规则和执行语义保持一致。

这样，团队可以先从流水线驱动的变更开始，之后再引入 operator，而不必设计第二套配置模型。

## 一个清单里写清主题和它的访问权限

用得最多的资源，也应该是最容易描述的资源。

一个 `KafkaTopic` 可以包含分区数、主题配置、Schema Registry 中的 schema，以及常见的生产者和消费者访问规则：

```yaml
apiVersion: gitops.monedula.dev/v1alpha1
kind: KafkaTopic
metadata:
  name: orders
spec:
  clusterRef:
    name: prod
  topicName: orders
  partitions: 6
  config:
    retention.ms: "604800000"
  access:
    producers:
      - principal: User:svc-checkout
    consumers:
      - principal: User:svc-fraud
        group: fraud-orders
```

根据这份清单，Monedula GitOps 会管理该主题，并生成对应的主题 ACL 和消费者组 ACL。

Monedula GitOps 同时支持标准的 Kafka ACL 和 Confluent Platform 特有的 RBAC 角色绑定。常见的、只作用于本主题的 ACL 可以直接写在 `KafkaTopic` 里；对于前缀资源、共享消费者组、主机限制或原始 ACL 操作这类高级场景，模型提供了单独的 `KafkaAccessPolicy` 资源。Confluent RBAC 角色绑定则由 `KafkaRoleBinding` 管理。

## 它能管理什么？

首个版本覆盖了声明式管理所需的主要 Kafka 与 Confluent 实体：

* `KafkaCluster`——连接信息、认证、默认值、Schema Registry，以及可选的 Confluent MDS 配置；
* `KafkaTopic`——主题生命周期、分区、配置、主题本地访问权限和 schema；
* `KafkaAccessPolicy`——高级的和共享的 Kafka ACL 规则；
* `KafkaQuota`——按用户、client-id 和 IP 的配额；
* `KafkaUser`——Kafka SCRAM 凭据；
* `KafkaRoleBinding`——Confluent Platform 的 MDS/RBAC 角色绑定。

CLI 还提供校验、漂移检测、安全预览、预检、应用、验证和导入等命令。

## 安装

用 Homebrew 安装 CLI：

```bash
brew install monedula-dev/tap/monedula-gitops
```

或者用 Go：

```bash
go install github.com/monedula-dev/monedula-gitops/cmd/monedula-gitops@latest
```

预编译二进制可以在 [GitHub releases](https://github.com/monedula-dev/monedula-gitops/releases/latest) 获取。容器镜像发布在 `ghcr.io/monedula-dev/monedula-gitops`。

用 Helm 安装 Kubernetes operator：

```bash
helm install monedula-gitops \
  oci://ghcr.io/monedula-dev/charts/monedula-gitops
```

完整的 [CLI 配置](https://github.com/monedula-dev/monedula-gitops/blob/main/docs/cli.md)和 [operator 安装](https://github.com/monedula-dev/monedula-gitops/blob/main/docs/operator.md)说明见仓库。

## 快速上手

有了一份 `KafkaCluster` 配置和一个或多个清单之后，基本流程很短：

```bash
# 预览 Git 与运行中集群之间的差异
monedula-gitops diff -f ./manifests \
  --cluster-config-file ./cluster.yaml

# 应用期望状态
monedula-gitops apply -f ./manifests \
  --cluster-config-file ./cluster.yaml

# 确认没有残留漂移
monedula-gitops verify -f ./manifests \
  --cluster-config-file ./cluster.yaml
```

发现漂移时 `verify` 会返回非零退出码，因此适合用作 CI 的门禁。有风险的操作都有防护，删除和裁剪（pruning）则必须显式开启。

想要一个完整的本地环境，仓库里有两个可运行的[快速上手示例](https://github.com/monedula-dev/monedula-gitops/tree/main/quickstart)：一个是用 Docker Compose、Kafka 和 Schema Registry 搭起来的 CLI 演练场，另一个是在本地 Kubernetes 集群上的 operator 演练场。

## 用 Import 从已有集群开始

GitOps 工具在空集群上很容易演示。真实环境很少是空的。

`import cluster` 命令会读取当前的 Kafka 状态，并据此生成 Monedula 清单：

```bash
monedula-gitops import cluster \
  --cluster-config-file ./cluster.yaml \
  --output-dir ./imported
```

导入器会重建主题、访问规则、配额、schema、SCRAM 用户，以及受支持情况下的 Confluent RBAC 角色绑定。简单的生产者和消费者 ACL 会被折叠进相应的 `KafkaTopic`；高级或含义不明确的规则则成为独立资源。

Kafka 无法透露已有的 SCRAM 密码，所以导入出来的用户里是占位的 secret 引用，必须先补齐才能应用。

关键性质是往返一致：把导入出来的目录对同一个集群做验证，应当报告没有漂移。

```bash
monedula-gitops verify -f ./imported -R \
  --cluster-config-file ./cluster.yaml
```

所以 Import 不只是一个导出功能。它是一条上手路径，把已有的 Kafka 环境逐步带向由 Git 管理的期望状态。

## 示例是项目的一部分

要学会一套复杂的 Kafka 配置，参考文档未必是最好的方式。

仓库里有一份内容丰富的[场景目录](https://github.com/monedula-dev/monedula-gitops/tree/main/scenarios)，包含 25 组自包含的配置。它们覆盖主题、内联与高级访问规则、配额、schema、漂移与协调、裁剪、删除策略、多租户、Import、SCRAM 用户、SASL_SSL、mTLS、OAuth 以及 Confluent MDS/RBAC。

每个场景都带有清单、说明、预期结果和清理步骤。你可以把它们当例子跑起来，改造成自己的起点，或者作为设计自身配置的灵感。

## 这是首个版本——请动手试试

`v0.1.0` 是 Monedula GitOps 的首个公开版本。

这个工具覆盖了多个 Kafka API、授权模型、认证方式和资源生命周期。它是一个相当复杂的软件，某些组合或边界情况可能还不完全符合预期。

请先从一次性的或非生产环境开始，仔细查看 `diff` 或 `apply --dry-run` 的输出，并且只有在确认过计划中的变更之后再启用破坏性操作。

最重要的是，请动手试试。不同的 Kafka 发行版、安全配置和运维模式，恰恰是真实反馈最有价值的地方。如果你发现 bug、含糊的行为或缺失的用例，欢迎在 [GitHub 上提 issue](https://github.com/monedula-dev/monedula-gitops/issues)。

## 小结

Monedula GitOps 把 Kafka 主题、访问权限、配额、schema、用户和 Confluent RBAC 收进同一套声明式模型，既能通过对 CI 友好的 CLI 使用，也能通过 Kubernetes operator 使用。你可以从空集群起步，也可以导入已有集群，并借助可运行的快速上手示例和成型的场景来熟悉这个工具。

首个版本现已在 [GitHub](https://github.com/monedula-dev/monedula-gitops) 上发布。