如何在 Kubernetes 中部署高可用 RabbitMQ 集群

文章导读
在 Kubernetes 中部署高可用 RabbitMQ 集群,最稳妥的方式是使用官方提供的 Kubernetes Operator 或经过社区广泛验证的 Helm Chart,而不是手动编写 StatefulSet。
📋 目录
  1. 一 方案一:使用 Helm Chart 部署
  2. 二 方案二:使用官方 Operator 部署
  3. 三 怎么验证是否生效
  4. 四 常见坑与最佳实践
  5. 五 参考来源
A A

在 Kubernetes 中部署高可用 RabbitMQ 集群,最稳妥的方式是使用官方提供的 Kubernetes Operator 或经过社区广泛验证的 Helm Chart,而不是手动编写 StatefulSet。

先说结论:生产环境建议直接采用官方 Operator 或 Bitnami Helm Chart,避免手动维护集群脚本。

  • 适合:需要持久化消息、要求服务不中断的业务场景
  • 先准备:确认可用的 StorageClass 和足够的存储资源
  • 验收:检查 Pod 状态、集群成员列表及队列类型

方案一:使用 Helm Chart 部署

如果希望快速拉起一个具备高可用基础的集群,可以使用 Helm Chart 进行部署。以下基于 Bitnami Chart 示例,为避免密码泄露,建议使用 values.yaml 文件配置敏感信息,避免在命令行历史中留存明文密码。

1. 准备 values.yaml 配置文件

创建 values.yaml,指定密码、持久化和资源限制。注意内存限制不宜过低,建议至少 1Gi。

auth:
  password: "YOUR_SECURE_PASSWORD"
  erlangCookie: "YOUR_SECURE_COOKIE"

clustering:
  enabled: true

persistence:
  enabled: true
  storageClass: "your-storage-class"
  size: 10Gi

resources:
  requests:
    cpu: 500m
    memory: 1Gi
  limits:
    cpu: 1000m
    memory: 2Gi

2. 执行安装命令

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-rabbitmq bitnami/rabbitmq -f values.yaml

部署完成后,查看 Pod 运行状态:

kubectl get pods -l app.kubernetes.io/name=rabbitmq

方案二:使用官方 Operator 部署

推荐使用 RabbitMQ Kubernetes Operator,它支持自定义资源定义(CRD),能更好地管理生命周期。Operator 会自动处理集群发现、故障转移和证书管理。

1. 安装 Operator

如何在 Kubernetes 中部署高可用 RabbitMQ 集群
kubectl apply -f https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml

2. 创建 RabbitmqCluster 资源

编写 rabbitmq-cluster.yaml,定义集群规格。务必配置资源请求以防止 OOM。

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  name: my-rabbitmq
spec:
  replicas: 3
  rabbitmq:
    additionalPlugins:
      - rabbitmq_management
  resources:
    requests:
      cpu: 500m
      memory: 1Gi
    limits:
      cpu: 1000m
      memory: 2Gi
  persistence:
    storage: 10Gi
  storageClassName: "your-storage-class"

应用配置:

kubectl apply -f rabbitmq-cluster.yaml

怎么验证是否生效

1. 检查 Pod 状态

所有 RabbitMQ Pod 应处于 Running 状态,且 READY 为 1/1。

kubectl get pods -l app.kubernetes.io/name=rabbitmq

2. 检查集群成员

进入任意一个 Pod,使用 rabbitmqctl 查看集群状态,确认所有节点都在列表中。

kubectl exec -it <pod-name> -- rabbitmqctl cluster_status

3. 检查队列类型

登录 RabbitMQ Management UI,查看 Queues 列表,确认关键队列的 Type 为 quorum,而不是 classic。

如何在 Kubernetes 中部署高可用 RabbitMQ 集群

常见坑与最佳实践

1. 内存资源限制过紧

RabbitMQ 基于 Erlang 虚拟机,对内存敏感。如果 K8s 设置的 Memory Limit 过低,可能导致 VM 被 OOM Kill。建议 Request 至少 500m CPU/1Gi 内存,Limit 设置为 Request 的 2 倍左右。

2. 密码与 Cookie 安全

避免在命令行历史中明文传递密码。生产环境建议将密码和 Erlang Cookie 存入 Kubernetes Secret,并在 Helm values 或 Operator 配置中引用 Secret。

3. 存储绑定失败

如果 Pod 一直 Pending,检查 PVC 是否成功绑定 PV。RabbitMQ 每个 Pod 独占一个 PVC(RWO),确保存储类支持动态供给且容量充足。

4. 使用已废弃的镜像队列

官方文档已明确标记 Mirrored Classic Queues 为 deprecated。新建业务请直接使用 Quorum Queues,避免后续升级困难。

channel.queueDeclare("my_queue", true, false, false, false, {"x-queue-type": "quorum"});

参考来源

  • RabbitMQ Official Documentation - Clustering: https://www.rabbitmq.com/clustering.html
  • RabbitMQ Official Documentation - Quorum Queues: https://www.rabbitmq.com/quorum-queues.html
  • RabbitMQ Kubernetes Operator Overview: https://www.rabbitmq.com/kubernetes/operator/operator-overview.html
  • Kubernetes Documentation - StatefulSets: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/