3. 部署RabbitMQ:使用Helm Chart在K8s上部署RabbitMQ集群

在生产环境中,RabbitMQ 通常以集群模式运行,以保证消息的高可用性和吞吐量。Kubernetes 上的 RabbitMQ 集群部署推荐使用官方 Helm Chart,它封装了 StatefulSet、ConfigMap、Service 等资源,并内置了基于 RabbitMQ Operator 或经典集群模式的配置选项。本章将指导你完成从 Helm 仓库配置到集群验证的完整流程。

3.1 部署架构概览

使用 Helm 部署的 RabbitMQ 集群在 Kubernetes 中由以下核心组件构成:

  • StatefulSet:保证 Pod 的有序启动、稳定的网络标识(如 rabbitmq-0.rabbitmq-headless.default.svc)和持久化存储。
  • Headless Service:用于集群节点间的发现与通信,不提供负载均衡。
  • Service (ClusterIP / LoadBalancer):对外暴露 AMQP(5672)和 Management UI(15672)端口。
  • ConfigMap:存储 rabbitmq.conf 和 enabled_plugins 等配置文件。
  • PersistentVolumeClaim:为每个节点分配独立的存储卷,持久化队列数据和元数据。
RabbitMQ 集群在 Kubernetes 上的部署架构 RabbitMQ 集群在 Kubernetes 上的部署架构 Kubernetes 集群 Helm Chart (rabbitmq) Kubernetes 资源对象 StatefulSet rabbitmq-server Headless Service 集群发现 ConfigMap rabbitmq.conf PVC 持久化存储 Pod 实例 (rabbitmq-0, rabbitmq-1, rabbitmq-2) Service (AMQP:5672 / Management:15672)
架构要点:RabbitMQ 集群依赖 Headless Service 实现节点间互访,每个 Pod 拥有稳定的 DNS 名称。StatefulSet 保证 Pod 的序号和存储卷的绑定关系,即使 Pod 重建,队列数据也不会丢失。

3.2 前置条件

在开始部署之前,请确保你的环境满足以下要求:

组件 版本要求 说明
Kubernetes 集群 ≥ 1.21 支持 StatefulSet 和 PVC
Helm CLI ≥ 3.8 推荐使用 Helm v3
StorageClass 已配置 用于动态创建 PVC,如 standard 或 gp2
kubectl 已配置 能够访问目标集群

3.3 添加 Helm 仓库并更新

RabbitMQ 官方 Helm Chart 托管在 Bitnami 仓库中。执行以下命令添加仓库并更新索引:

# 添加 Bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 更新本地仓库缓存
helm repo update

# 查看可用的 RabbitMQ Chart 版本
helm search repo bitnami/rabbitmq --versions
版本选择建议:在生产环境中,建议锁定一个经过验证的 Chart 版本(如 --version 12.x.x),避免因 Chart 升级导致配置不兼容。本课程使用 bitnami/rabbitmq:12.14.0 作为演示版本。

3.4 创建命名空间

为 RabbitMQ 集群创建独立的命名空间,便于资源隔离和管理:

kubectl create namespace rabbitmq-system

3.5 准备自定义 values 文件

直接使用默认参数部署的 RabbitMQ 集群可能不符合生产要求。我们需要创建一个自定义的 values.yaml 文件,覆盖关键配置项。以下是一个面向生产环境的配置示例:

# values-rabbitmq.yaml
# 集群规模
replicaCount: 3

# 认证配置
auth:
  username: admin
  password: "YourStrongPassword123!"
  erlangCookie: "SecretErlangCookieForCluster"

# 资源配置
resources:
  requests:
    memory: "512Mi"
    cpu: "250m"
  limits:
    memory: "1Gi"
    cpu: "500m"

# 持久化存储
persistence:
  enabled: true
  storageClass: "standard"    # 根据集群实际情况修改
  size: 8Gi

# 服务配置
service:
  type: ClusterIP
  amqpPort: 5672
  managerPort: 15672

# 管理插件
plugins: "rabbitmq_management rabbitmq_peer_discovery_k8s"

# 集群发现
rabbitmq:
  clustering:
    k8s: true
    addressType: hostname
  extraConfig: |-
    cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
    cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
    cluster_formation.k8s.address_type = hostname
    cluster_formation.node_cleanup.interval = 30
    cluster_formation.node_cleanup.only_log_warning = true
    cluster_partition_handling = pause_minority
    queue_master_locator = min-masters
    disk_free_limit.relative = 1.0
    vm_memory_high_watermark.relative = 0.4
安全提醒:上述配置中的密码和 Erlang Cookie 仅为示例。在生产环境中,请使用强密码,并考虑通过 Kubernetes Secret 注入敏感信息,避免明文写在 values 文件中。

3.6 执行 Helm 部署

使用自定义 values 文件执行部署命令:

helm install rabbitmq bitnami/rabbitmq \
  --namespace rabbitmq-system \
  --version 12.14.0 \
  --values values-rabbitmq.yaml \
  --timeout 10m0s

部署过程大约需要 3-5 分钟,期间 Helm 会创建 StatefulSet、Service、ConfigMap 等资源,并等待所有 Pod 进入 Running 状态。

3.7 验证部署状态

部署完成后,执行以下命令验证集群状态:

# 查看 Pod 状态
kubectl get pods -n rabbitmq-system -w

# 查看 Service
kubectl get svc -n rabbitmq-system

# 查看 PVC 是否绑定
kubectl get pvc -n rabbitmq-system

预期输出示例:

NAME          READY   STATUS    RESTARTS   AGE
rabbitmq-0    1/1     Running   0          4m
rabbitmq-1    1/1     Running   0          3m
rabbitmq-2    1/1     Running   0          2m

NAME                     TYPE        CLUSTER-IP      PORT(S)              AGE
rabbitmq                 ClusterIP   10.96.12.34     5672/TCP,15672/TCP   4m
rabbitmq-headless        ClusterIP   None            5672/TCP,4369/TCP    4m

3.8 访问 Management UI

RabbitMQ 提供了基于 Web 的管理界面。你可以通过端口转发或 Ingress 访问:

# 端口转发到本地
kubectl port-forward -n rabbitmq-system svc/rabbitmq 15672:15672

# 在浏览器中打开
# http://localhost:15672
# 用户名: admin
# 密码: YourStrongPassword123!

登录后,在 Admin > Cluster 页面中,你应该能看到三个节点(rabbitmq@rabbitmq-0、rabbitmq@rabbitmq-1、rabbitmq@rabbitmq-2)以集群模式运行。

RabbitMQ 集群节点状态示意 RabbitMQ 集群节点状态示意(Management UI 视图) rabbitmq@rabbitmq-0 状态: 运行中 类型: RAM/Disc 队列数: 12 rabbitmq@rabbitmq-1 状态: 运行中 类型: RAM/Disc 队列数: 8 rabbitmq@rabbitmq-2 状态: 运行中 类型: RAM/Disc 队列数: 10 集群总队列: 30

3.9 常用运维命令

部署完成后,你可能需要执行以下运维操作:

操作 命令
查看集群状态 kubectl exec -n rabbitmq-system rabbitmq-0 -- rabbitmqctl cluster_status
查看队列列表 kubectl exec -n rabbitmq-system rabbitmq-0 -- rabbitmqctl list_queues
查看节点健康 kubectl exec -n rabbitmq-system rabbitmq-0 -- rabbitmqctl node_health_check
升级 Chart helm upgrade rabbitmq bitnami/rabbitmq -n rabbitmq-system -f values-rabbitmq.yaml
卸载集群 helm uninstall rabbitmq -n rabbitmq-system
生产建议:在卸载集群前,请确保已通过 kubectl delete pvc -n rabbitmq-system --all 清理持久卷声明,避免残留的 PV 占用存储资源。如果希望保留数据用于后续恢复,则跳过此步骤。

3.10 常见问题排查

  • Pod 启动失败,CrashLoopBackOff:检查 Erlang Cookie 是否一致,或查看日志 kubectl logs -n rabbitmq-system rabbitmq-0。
  • 集群节点无法互相发现:确认 Headless Service 的 DNS 解析是否正常,执行 kubectl exec -n rabbitmq-system rabbitmq-0 -- nslookup rabbitmq-headless。
  • PVC 处于 Pending 状态:检查 StorageClass 是否存在且可用,执行 kubectl get storageclass。
  • Management UI 无法访问:确认 rabbitmq_management 插件已启用,并检查 Service 端口映射是否正确。