消息队列 (messaging)
messaging 类收纳集群的消息与分布式协调中间件,目前有 Kafka、NATS、RabbitMQ、ZooKeeper 四个组件。它们各自独占一个 namespace(kafka / nats / rabbitmq / zookeeper),均以 StatefulSet 单副本部署,没有配置 HPA / VPA / PDB。
四个组件当前都是
replicas: 1 的单实例,不是多副本集群形态。Kafka 依赖 ZooKeeper 做元数据协调,二者构成一组事件流栈;NATS 与 RabbitMQ 则是相互独立的消息队列。总览
这四个组件的镜像版本、监听端口与密钥来源都可以从 manifest 直接核对,下面按组件分别列出可验证的事实。集群整体的层次结构见 集群架构,节点标签与调度约定见 README 中的拓扑说明。
组件清单
- Name
- kafka
- Description
- 事件流。镜像
bitnami/kafka:3.6,namespacekafka,StatefulSet 单副本,调度到workload: app节点。容器端口 9092(PLAINTEXT 客户端)/ 9093(INTERNAL broker 间通信)。通过 envKAFKA_CFG_ZOOKEEPER_CONNECT连到zookeeper.zookeeper.svc.cluster.local:2181,开启自动建 topic、日志保留 24 小时。Service:ClusterIPkafka(9092)+ headlesskafka-headless(9092/9093)。无 ExternalSecret、无 ServiceMonitor、无 Ingress。
- Name
- nats
- Description
- 消息队列(启用 JetStream 持久化)。镜像
nats:2.14-alpine,namespacenats,StatefulSet 单副本,调度到node-role: database节点。容器端口 4222(client)/ 8222(monitoring)/ 6222(cluster)。配置来自 ConfigMapnats-config,JetStream 存储在/data/jetstream(max_memory_store 1Gi、max_file_store 10Gi)。凭据由 ExternalSecretnats-secret从 Vaultsecret/database/prod/nats拉取 username / password。监控由独立 Deploymentnats-exporter(natsio/prometheus-nats-exporter:0.20.1,端口 7777)抓取,ServiceMonitornats采集其/metrics。Ingressnats.yldm.tech经 Cloudflare Tunnel 暴露 monitoring 端口 8222。
- Name
- rabbitmq
- Description
- 消息队列(management 版)。镜像
rabbitmq:4.3-management-alpine,namespacerabbitmq,StatefulSet 单副本,调度到node-role: database节点,带专属 ServiceAccount + Role/RoleBinding(读 endpoints、建 events)。容器端口 5672(amqp)/ 15672(management UI)/ 15692(prometheus)。凭据由 ExternalSecretrabbitmq-secret从 Vaultsecret/database/prod/rabbitmq拉取默认用户、密码与 Erlang cookie。Service:ClusterIPrabbitmq(5672/15672)、headlessrabbitmq-headless、外部访问用 NodePortrabbitmq-management(15672 → nodePort 30673)。
- Name
- zookeeper
- Description
- 分布式协调。镜像
bitnami/zookeeper:3.9,namespacezookeeper,StatefulSet 单副本,调度到workload: app节点,开启匿名登录(ALLOW_ANONYMOUS_LOGIN=yes,ZOO_SERVER_ID=1)。容器端口 2181(client)/ 2888(follower)/ 3888(election)。Service:ClusterIPzookeeper(2181)+ headlesszookeeper-headless(2181/2888/3888)。主要作为 Kafka 的元数据协调后端,无 ExternalSecret、无 ServiceMonitor、无 Ingress。
存储与调度
四个组件的持久化方式分两种:Kafka 与 ZooKeeper 用 StatefulSet 的 volumeClaimTemplates 申请 nfs-client 存储(分别 10Gi / 5Gi);NATS 与 RabbitMQ 则挂独立 pvc.yaml,使用 local-path(本节点本地盘,分别 20Gi / 100Gi)—— 这与它们被钉在 node-role: database 节点的调度约定一致。
| 组件 | 镜像 | namespace | 副本 | 节点选择 | 存储 | ExternalSecret | ServiceMonitor / Ingress |
|---|---|---|---|---|---|---|---|
| kafka | bitnami/kafka:3.6 | kafka | 1 | workload: app | volumeClaimTemplates 10Gi (nfs-client) | 无 | 无 / 无 |
| nats | nats:2.14-alpine | nats | 1 | node-role: database | pvc 20Gi (local-path) | secret/database/prod/nats | 有 (经 exporter) / nats.yldm.tech |
| rabbitmq | rabbitmq:4.3-management-alpine | rabbitmq | 1 | node-role: database | pvc 100Gi (local-path) | secret/database/prod/rabbitmq | 无 (内置 :15692) / NodePort 30673 |
| zookeeper | bitnami/zookeeper:3.9 | zookeeper | 1 | workload: app | volumeClaimTemplates 5Gi (nfs-client) | 无 | 无 / 无 |
local-path 把 PV 钉在写入它的那个节点上,所以 NATS / RabbitMQ 的数据不会跟随 Pod 漂移到其它 worker;这也是它们固定调度到 node-role: database 节点的原因。nfs-client 则是共享存储,Kafka / ZooKeeper 的数据可在节点间复用。