本文主要介绍了在k8s中使用有状态服务Statfulset方式部署一个RabbitMQ 3.8.3 版本的集群
更新于 2021-03-20
准备
本文使用的 k8s版本为 1.20.4
版本,将使用storageclass
作为持久化存储,底层为nfs
,使用default
namespace部署。
RabbitMQ
在k8s
集群中通过rabbitmq_peer_discovery_k8s plugin
与k8s apiserver
进行交互,获取各个服务的URL
,且RabbitMQ
在k8s
集群中必须用statefulset
和headless service
进行匹配;
rabbitmq_peer_discovery_k8s
是
RabbitMQ官方基于第三方开源项目
rabbitmq-autocluster开发,对
3.7.X及以上版本提供的
Kubernetes下的对等发现插件,可实现
rabbitmq集群在
k8s中的自动化部署,因此低于3.7.X版本请使用
rabbitmq-autocluster
这里部署使用的版本是3.8.3
,其他版本信息可以参看官方文档:rabbitmq download
部署
创建相关文件
创建一个rabbitmq-configmap.yaml
的文件:
1 | kind: ConfigMap |
enabled_plugins
:声明开启的插件;default_user/default_pass
:指定用户名和密码;cluster_formation.k8s.address_type
:从k8s
返回的Pod
容器列表中计算对等节点列表,这里只能使用主机名,官方示例中是ip
,但是默认情况下在k8s
中pod
的ip
都是不固定的,因此可能导致节点的配置和数据丢失,后面的yaml
中会通过引用元数据的方式固定pod
的主机名;
创建一个rabbitmq-service.yaml
的文件:
1 | kind: Service |
这里定义了两个service,一个是
NodePort
用于用户通过web访问的管理页面,另一个是用于rabbitmq服务通信;
创建一个rabbitmq-rbac.yaml
的文件:
1 | apiVersion: v1 |
创建一个rabbitmq-cluster-sts.yaml
的文件:
1 | kind: StatefulSet |
这里指定了storageclass的名字为:
managed-nfs-storage
,需要根据实际情况调整
部署服务
执行下面的命令完成部署:
1 | kubectl apply -f . |
检查
执行下面的命令检查资源创建情况,确保pod都处于运行状态:
1 | kubectl get pod,sts -n default |

检查pod日志,观察集群建立情况:

进入pod中,通过客户端命令查看集群状态:
1 | kubectl exec -ti rabbitmq-cluster-0 -n default -- rabbitmqctl cluster_status |

访问管理页面
查看对应service使用的宿主机端口:
1 | kubectl get svc -n default |

通过浏览器访问node节点的30888端口即可打开rabbitmq的管理页面:
