Skip to main content

在 K8S 中使用 Helm 快速部署 Rabbitmq

准备条件

  • Kubernetes 1.23+
  • Helm 3.8.0+
  • 底层基础设施动态存储类:storageClass
  • Nginx Ingress Controller 流量网关类 ingressClass

获取 Chart

添加仓库:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

查看 bitnami/rabbitmq 仓库历史版本的 Charts,选择一个版本

helm search repo bitnami/rabbitmq --versions
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/rabbitmq 14.7.0 3.13.7 RabbitMQ is an open source general-purpose mess...
bitnami/rabbitmq 14.6.10 3.13.7 RabbitMQ is an open source general-purpose mess...
bitnami/rabbitmq 14.6.9 3.13.7 RabbitMQ is an open source general-purpose mess...
bitnami/rabbitmq 14.6.8 3.13.7 RabbitMQ is an open source general-purpose mess...
bitnami/rabbitmq 14.6.7 3.13.7 RabbitMQ is an open source general-purpose mess...
bitnami/rabbitmq 14.6.6 3.13.6 RabbitMQ is an open source general-purpose mess...
bitnami/rabbitmq 14.6.5 3.13.6 RabbitMQ is an open source general-purpose mess...
bitnami/rabbitmq 14.6.4 3.13.6 RabbitMQ is an open source general-purpose mess...
...

本实例选择 Chart 14.7.0,对应的 RabbitMQ 版本为 3.13.7,获取 Chart

# 获取离线 Chart
helm pull bitnami/rabbitmq --version 14.7.0

# 获取默认 values.yaml
helm show values rabbitmq-14.7.0.tgz > values-rabbitmq.yaml

配置 values.yaml

erlangCookie

RabbitMQ 中,erlang.cookie 是一个用于 Erlang 节点之间认证的秘密字符串。RabbitMQ 是基于 Erlang 开发的,因此它使用 Erlang 的分布式特性来实现节点间的通信和管理。erlang.cookie 文件的存在确保了只有拥有相同 cookie 的节点才能相互通信。

erlang.cookie 保存位置:/var/lib/rabbitmq/.erlang.cookie

在首次部署时为了以后扩展方便,提前与生成,可以使用随机字符串生成工具生成一个 20 字符的随机字符串:

openssl rand -base64 20

初始化管理员密码、erlangCookie 等:

auth.username: admin
auth.password: "$RABBITMQ_PASSWORD"
auth.erlangCookie: "$RABBITMQ_ERLANG_COOKIE"

水平伸缩(可选)

水平扩展通过修改 replicaCount 参数:

replicaCount=1

缩减时,不需要的 RabbitMQ 节点会自动停止,但不会从集群中删除。必须通过命令手动删除这些节点:

rabbitmqctl forget_cluster_node

例如,如果 RabbitMQ 最初安装了三个副本,然后缩减为两个副本,则运行以下命令(假设发布名称为rabbitmq且集群类型为hostname):

kubectl exec rabbitmq-0 --container rabbitmq -- rabbitmqctl forget_cluster_node rabbit@rabbitmq-2.rabbitmq-headless.default.svc.cluster.local
kubectl delete pvc data-rabbitmq-2
注意

升级 Release 时必须指定首次安装设置的密码和 Erlang cookie。否则,新的 pod 将无法加入集群。

添加额外的环境变量

如果您想添加额外的环境变量(对于自定义初始化脚本等高级操作很有用),您可以使用该 extraEnvVars 属性。

extraEnvVars:
- name: TZ
value: "Asia/Shanghai"
- name: LOG_LEVEL
value: erro

服务

改用 NodePort 暴露服务,方便前期测试。

service:
type: NodePort

Ingress 暴露服务

以下为生产环境配置案例,分别以白名单、TLS 在公网环境下安全加固:

ingress:
enabled: true
path: /
pathType: ImplementationSpecific
hostname: rabbitmqmg.example.com
annotations:
# 白名单
nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
tls: true

# 绑定自定义 TLS secret
extraTls:
- hosts:
- rabbitmqmg.example.com
secretName: ssl-star-example-com

# 指定 ingressclass 负载均衡器网关
ingressClassName: "clb"

限制资源 方式1

resourcesPreset 根据一个通用预设设置容器资源(允许的值:none、nano、micro、small、medium、large、xlarge、2xlarge)。如果设置了资源,则忽略此项(建议在生产中使用资源)。

resourcesPreset: micro

限制资源 方式2(推荐)

resources 为不同的资源(如 CPU 或内存)设置容器请求和限制(对于生产工作负载至关重要)

resources:
requests:
cpu: "0.5"
memory: "1Gi"
limits:
cpu: "0.5"
memory: "1Gi"
注意

WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:

  • resources

数据持久化

Bitnami RabbitMQ 镜像将 RabbitMQ 数据和配置存储在容器的路径:/opt/bitnami/rabbitmq/var/lib/rabbitmq/

本案例使用事先准备好动态存储类 storageClass=cfs 来持久化数据

# 全局部分设置使用 storageClass
global:
storageClass: "cfs"

# 局部参数设置
persistence:
enabled: true
storageClass: "cfs"
size: 100Gi
提示:

动态存储类使用的是 腾讯云 TKE CFS-CSI 组件完成, size 大小会根据实际用量进行按量付费。

使用插件

Bitnami Docker RabbitMQ 镜像附带一组插件 K8s 上运行所必需:

plugins: "rabbitmq_management rabbitmq_peer_discovery_k8s"

要启用额外的插件,请将 extraPlugins 参数设置为要启用的插件列表。

communityPlugins 参数还可用于指定 RabbitMQ 自定义插件的 URL 列表(以空格分隔)。

rabbitmq_delayed_message_exchange

例如,要增加部署一个延迟队列插件(死信队列):

communityPlugins: "https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.13.0/rabbitmq_delayed_message_exchange-3.13.0.ez"
extraPlugins: "rabbitmq_delayed_message_exchange"
提示

插件对 RabbitMQ 的版本是有要求的,更多信息请查看 GitHub

在以下 Web 后台中找到 x-delayed-message 表示插件安装并启用成功。

安装 Chart

helm -n ${APP_NAMESPACE} install rabbitmq rabbitmq-14.7.0.tgz -f values-rabbitmq.yaml

更新 Release

helm -n ${APP_NAMESPACE} upgrade --install rabbitmq rabbitmq-14.7.0.tgz -f values-rabbitmq.yaml

访问服务

# 获取凭据信息
Credentials:
echo "Username : admin"
echo "Password : $(kubectl get secret --namespace ${APP_NAMESPACE} rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 -d)"
echo "ErLang Cookie : $(kubectl get secret --namespace ${APP_NAMESPACE} rabbitmq -o jsonpath="{.data.rabbitmq-erlang-cookie}" | base64 -d)"

# 获取暴露 NodePort
To Access the RabbitMQ AMQP port:

echo "URL : amqp://$NODE_IP:$NODE_PORT_AMQP/"

To Access the RabbitMQ Management interface:

echo "URL : http://$NODE_IP:$NODE_PORT_STATS/"

参考文档

总结

该文档围绕生产环境下 Kubernetes 集群中 RabbitMQ 的快速部署展开,详细阐述所需前提条件,包括特定版本的 Kubernetes 与 Helm、底层动态存储类及 Nginx Ingress Controller 流量网关类,介绍获取 bitnami/rabbitmq Chart 并选择合适版本的方法,深入讲解 values.yaml 文件中关键参数(如 erlangCookie、水平伸缩、环境变量、服务暴露、资源限制、数据持久化等)的配置,提及插件使用方式,最后给出 Chart 安装、Release 更新以及服务访问的具体操作步骤与命令。