feat: 补充 MongoDB 配置和 RabbitMQ 集群部署

This commit is contained in:
chengcheng
2026-07-13 16:52:09 +08:00
parent 821ffe9e70
commit 13048672a9
8 changed files with 266 additions and 13 deletions
+124
View File
@@ -0,0 +1,124 @@
# RabbitMQ 自建生产集群
本目录用于在客户自己的 Kubernetes 集群中部署 RabbitMQ,不依赖云厂商消息队列服务。模板使用 RabbitMQ 官方 Cluster Operator 管理三节点集群。
该组件独立于 EasyAI 主应用的 production overlay,需先部署 RabbitMQ,再把 Operator 生成的连接凭据写入 EasyAI 配置。
## 架构
- 3 个 RabbitMQ 节点,分别调度到不同 Worker 节点;
- 每个 RabbitMQ Pod 使用独立的 RWO PVC
- 优先跨可用区调度;
- 客户端通过 `easyai-rabbitmq.easyai.svc.cluster.local:5672` 访问;
- 新建的普通持久化业务队列默认使用 quorum queue
- Operator 负责 StatefulSet、内部 Service、节点发现和滚动更新,模板额外提供 `maxUnavailable: 1` 的 PodDisruptionBudget。
## 前提条件
- Kubernetes 集群至少有 3 个可调度 Worker 节点;
- 已有支持动态创建 RWO PVC 的 StorageClass
- 已安装与客户 Kubernetes 版本兼容的 RabbitMQ Cluster Operator
- 节点可以拉取 `rabbitmq:4.3.2-management`,或已将该镜像同步到客户私有仓库。
安装 Operator 前请先核对官方兼容要求:
<https://www.rabbitmq.com/kubernetes/operator/install-operator>
联网环境可按官方方式安装:
```bash
kubectl apply -f https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml
kubectl -n rabbitmq-system rollout status deploy/rabbitmq-cluster-operator --timeout=10m
```
生产环境建议下载并审计 Operator YAML,将其中镜像同步到客户私有仓库后再安装,避免部署时依赖公网和浮动版本。
## 修改模板
编辑 `rabbitmq-cluster.yaml`
1.`CHANGE_ME_RABBITMQ_STORAGE_CLASS` 替换为客户的 RWO StorageClass
2. 根据消息量调整每个节点的 `storage`、CPU 和内存;
3. 无法访问 Docker Hub 时,将 `image` 替换为客户私有仓库中的同版本镜像;
4. 如果 Worker 节点不足 3 个,先扩容节点,不要删除主机级反亲和规则后直接用于生产。
检查占位符并渲染:
```bash
grep -R -n 'CHANGE_ME' k8s/addons/rabbitmq-cluster
kubectl kustomize k8s/addons/rabbitmq-cluster > /tmp/easyai-rabbitmq.yaml
```
## 部署
先创建 EasyAI namespace,再部署 RabbitMQ
```bash
kubectl apply -f k8s/overlays/production/namespace.yaml
kubectl apply -k k8s/addons/rabbitmq-cluster
```
等待集群就绪:
```bash
kubectl -n easyai wait rabbitmqcluster/easyai-rabbitmq \
--for=condition=AllReplicasReady \
--timeout=15m
kubectl -n easyai get rabbitmqcluster easyai-rabbitmq
kubectl -n easyai get pod,svc,pvc,pdb \
-l app.kubernetes.io/name=easyai-rabbitmq
```
## 配置 EasyAI
Operator 会生成 `easyai-rabbitmq-default-user` Secret。初次连通性验证时可读取该 Secret 中的用户名和密码:
```bash
kubectl -n easyai get secret easyai-rabbitmq-default-user \
-o jsonpath='{.data.username}' | base64 --decode
echo
kubectl -n easyai get secret easyai-rabbitmq-default-user \
-o jsonpath='{.data.password}' | base64 --decode
echo
```
将读取到的值写入 `k8s/overlays/production/app-secret.yaml`
```yaml
CONFIG_MQ_USER: Operator生成的用户名
CONFIG_MQ_PASSWORD: Operator生成的密码
```
Operator 生成的是集群默认管理用户。正式生产环境建议使用该用户完成初始化后,另行创建仅供 EasyAI 使用的应用用户,并只授予目标 vhost 的 configure/write/read 权限;随后将 `CONFIG_MQ_USER``CONFIG_MQ_PASSWORD` 替换为应用用户凭据。不要在多个系统之间共用默认管理用户。
修改 `k8s/overlays/production/app-config.yaml`
```yaml
CONFIG_MQ_PROTOCOL: amqp
CONFIG_MQ_HOST: easyai-rabbitmq.easyai.svc.cluster.local
CONFIG_MQ_PORT: "5672"
CONFIG_MQ_VHOST: /
```
然后按仓库根目录 README 部署 EasyAI 主应用。
## 验证
```bash
kubectl -n easyai exec easyai-rabbitmq-server-0 -- rabbitmq-diagnostics -q ping
kubectl -n easyai exec easyai-rabbitmq-server-0 -- rabbitmqctl cluster_status
kubectl -n easyai exec easyai-rabbitmq-server-0 -- rabbitmqctl list_queues name type durable messages consumers
```
预期 `cluster_status` 中有 3 个运行节点,EasyAI 启动后业务持久化队列的 `type``quorum`
## 运维注意事项
- 不要直接修改 Operator 生成的 StatefulSet;通过 `RabbitmqCluster` 资源修改集群。
- 不要同时重启两个 RabbitMQ 节点;维护前确认 quorum 状态正常。
- 模板保留 Operator 的默认终止宽限期,使 preStop 能在节点退出前检查 quorum 安全状态;不要为了加快删除而随意缩短。
- PVC 只解决节点重建时的数据持久化,不等同于备份。应定期导出 definitions,并结合存储快照制定恢复方案。
- 升级 RabbitMQ 或 Operator 前,先在测试环境验证队列声明、发布消费、断线重连和节点故障切换。
- 若要启用 AMQPS,应按客户证书体系配置 `spec.tls`,并将 EasyAI 的协议和端口调整为 `amqps`/`5671`
@@ -0,0 +1,6 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- rabbitmq-cluster.yaml
- pdb.yaml
+13
View File
@@ -0,0 +1,13 @@
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: easyai-rabbitmq
namespace: easyai
labels:
app.kubernetes.io/name: easyai-rabbitmq
app.kubernetes.io/part-of: easyai
spec:
maxUnavailable: 1
selector:
matchLabels:
app.kubernetes.io/name: easyai-rabbitmq
@@ -0,0 +1,47 @@
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: easyai-rabbitmq
namespace: easyai
labels:
app.kubernetes.io/part-of: easyai
spec:
replicas: 3
image: rabbitmq:4.3.2-management
service:
type: ClusterIP
persistence:
storageClassName: CHANGE_ME_RABBITMQ_STORAGE_CLASS
storage: 50Gi
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- easyai-rabbitmq
topologyKey: kubernetes.io/hostname
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- easyai-rabbitmq
topologyKey: topology.kubernetes.io/zone
rabbitmq:
additionalConfig: |
default_queue_type = quorum
disk_free_limit.relative = 1.5
collect_statistics_interval = 10000
+1 -1
View File
@@ -6,7 +6,7 @@
| 依赖 | 说明 |
| --- | --- |
| MongoDB | 主服务本地业务数据 |
| MongoDB | 主服务本地业务数据,数据库名为 `aidraw` |
| Redis | 队列、缓存、WebSocket 集群状态 |
| RabbitMQ | 本地消息队列 |
| PostgreSQL/pgvector | Agent 治理和记忆服务数据库 |
+2 -1
View File
@@ -4,7 +4,8 @@ metadata:
name: easyai-app-secret
type: Opaque
stringData:
CONFIG_DB_MONGO_URI: mongodb://mongo:27017
CONFIG_DB_MONGO_URI: mongodb://mongo:27017/?authSource=admin
CONFIG_DB_MONGO_DBNAME: aidraw
CONFIG_DB_MONGO_USERNAME: username
CONFIG_DB_MONGO_PASSWORD: password
MONGO_INITDB_ROOT_USERNAME: username
+2 -3
View File
@@ -4,11 +4,10 @@ metadata:
name: easyai-app-secret
type: Opaque
stringData:
CONFIG_DB_MONGO_URI: mongodb://CHANGE_ME_MONGO_HOST:27017
CONFIG_DB_MONGO_URI: mongodb://CHANGE_ME_MONGO_HOST:27017/?authSource=admin
CONFIG_DB_MONGO_DBNAME: aidraw
CONFIG_DB_MONGO_USERNAME: CHANGE_ME_MONGO_USERNAME
CONFIG_DB_MONGO_PASSWORD: CHANGE_ME_MONGO_PASSWORD
MONGO_INITDB_ROOT_USERNAME: CHANGE_ME_MONGO_USERNAME
MONGO_INITDB_ROOT_PASSWORD: CHANGE_ME_MONGO_PASSWORD
CONFIG_COMFYUI_QUENE_REDIS_PASSWORD: CHANGE_ME_REDIS_PASSWORD
GATEWAY_CLUSTER_REDIS_PASSWORD: CHANGE_ME_REDIS_PASSWORD