当前位置: 首页 > news >正文

Rabbitmq+STS+discovery_k8s +localpv部署排坑详解

#作者:朱雷

文章目录

  • 一、部署排坑
    • 1.1. configmap配置文件
    • 1.2. pv文件
    • 1.3. sc文件
    • 1.4. serviceAccount文件
    • 1.5. headless-service文件
    • 1.6. sts文件
  • 二、RabbitMQ集群部署关键问题总结

一、部署排坑

1.1. configmap配置文件

编辑cm.yaml 文件

apiVersion: v1
kind: ConfigMap
metadata:name: rabbitmq-confignamespace: rabbitmq-clu-9
data:rabbitmq.conf: |# 基础配置listeners.tcp.default = 5672# management.listener.port = 15672# management.listener.ssl = falsedisk_free_limit.absolute = 1GBcluster_formation.peer_discovery_backend = k8s  #指定集群发现通过k8s插件# cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8scluster_formation.k8s.host = kubernetes.default.svc.cluster.local
cluster_formation.k8s.address_type = hostname
# 后缀中rabbitmq-clu-9 为namespace 名称保持和sts 文件中的namespace一致cluster_formation.k8s.hostname_suffix = .rabbitmq-headless.rabbitmq-clu-9.svc.cluster.localcluster_formation.discovery_retry_limit = 10
cluster_formation.discovery_retry_interval = 3000
# service_name与headless 中保持一致cluster_formation.k8s.service_name = rabbitmq-headlesscluster_formation.node_cleanup.interval = 30cluster_formation.node_cleanup.only_log_warning = falsecluster_formation.etcd.ssl_options.verify = verify_none# 内存配置vm_memory_high_watermark.relative = 0.6vm_memory_high_watermark_paging_ratio = 0.5# 日志配置log.console = truelog.console.level = debuglog.file = false# 临时启用调试日志log.connection.level = debuglog.channel.level = debuglog.queue.level = debug

1.2. pv文件

apiVersion: v1
kind: PersistentVolume
metadata:name: rabbitmq-cluster-pv-0
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncestorageClassName: hostpath-storagehostPath:path: /tmp/rabbitmq/0type: DirectoryOrCreatenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.88.201   #修改为绑定的node的hostname
---
apiVersion: v1
kind: PersistentVolume
metadata:name: rabbitmq-cluster-pv-1
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncestorageClassName: hostpath-storagehostPath:path: /tmp/rabbitmq/1type: DirectoryOrCreatenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.88.202    #修改为绑定的node的hostname
---
apiVersion: v1
kind: PersistentVolume
metadata:name: rabbitmq-cluster-pv-2
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncestorageClassName: hostpath-storagehostPath:path: /tmp/rabbitmq/2type: DirectoryOrCreatenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.88.203   #修改为绑定的node的hostname

坑1:node选择器绑定时使用的是集群node 的hostname,如node 的IP 和Hostname 不一致,填写IP 会导致pod 为运行pending状态。

1.3. sc文件

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: hostpath-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

1.4. serviceAccount文件

apiVersion: v1
kind: ServiceAccount
metadata:name: rabbitmqnamespace: rabbitmq-clu-9
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: rabbitmq-peer-discovery
rules:
- apiGroups: [""]resources: ["nodes", "pods", "endpoints"]verbs: ["get", "list", "watch"]
- apiGroups: ["discovery.k8s.io"]resources: ["endpointslices"] verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: rabbitmq-peer-discovery
subjects:
- kind: ServiceAccountname: rabbitmqnamespace: rabbitmq-clu-9
roleRef:kind: ClusterRolename: rabbitmq-peer-discoveryapiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: rabbitmq-configmapnamespace: rabbitmq-clu-9
rules:
- apiGroups: [""]resources: ["configmaps"]verbs: ["get", "update"]resourceNames: ["rabbitmq-config"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: rabbitmq-configmapnamespace: rabbitmq-clu-9
subjects:
- kind: ServiceAccountname: rabbitmq
roleRef:kind: Rolename: rabbitmq-configmapapiGroup: rbac.authorization.k8s.io

坑2:在启动pod 的过程中如果集群角色rabbitmq-peer-discovery未授权nodes资源则pod一直报错启动失败

1.5. headless-service文件

apiVersion: v1
kind: Service
metadata:name: rabbitmq-headlesslabels:app: rabbitmq
spec:clusterIP: Noneports:- name: amqpport: 5672targetPort: 5672- name: managementport: 15672 targetPort: 15672- name: epmdport: 4369targetPort: 4369- name: distport: 25672targetPort: 25672selector:app: rabbitmqpublishNotReadyAddresses: true

坑3:上面这几个端口都需要暴漏出来,否则集群创建失败

1.6. sts文件

apiVersion: apps/v1
kind: StatefulSet
metadata:name: rabbitmqnamespace: rabbitmq-clu-9labels:app: rabbitmq
spec:serviceName: rabbitmq-headlessreplicas: 3#podManagementPolicy: "Parallel"selector:matchLabels:app: rabbitmqtemplate:metadata:labels:app: rabbitmqspec:terminationGracePeriodSeconds: 10affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- rabbitmqtopologyKey: kubernetes.io/hostnameserviceAccountName: rabbitmq        containers:- name: rabbitmqimage: rabbitmq:3.8.27-managementimagePullPolicy: IfNotPresentports:- containerPort: 5672name: amqp- containerPort: 15672name: httpenv:- name: RABBITMQ_USE_LONGNAMEvalue: "true"        - name: RABBITMQ_ERLANG_COOKIEvalue: "secret-cookie"- name: RABBITMQ_DEFAULT_USERvalue: "admin"- name: RABBITMQ_DEFAULT_PASSvalue: "admin123"volumeMounts:- name: configmountPath: /etc/rabbitmq/rabbitmq.confsubPath: rabbitmq.conf- name: datamountPath: /var/lib/rabbitmqreadOnly: false#readinessProbe:#  exec:#    command: ["rabbitmq-diagnostics", "status"]#  initialDelaySeconds: 20#  periodSeconds: 30livenessProbe:exec:command: ["rabbitmq-diagnostics", "ping"]initialDelaySeconds: 60periodSeconds: 30volumes:- name: configconfigMap:name: rabbitmq-configvolumeClaimTemplates:- metadata:name: datanamespace: rabbitmq-clu-9spec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1000MstorageClassName: hostpath-storage

坑4:RABBITMQ_USE_LONGNAME 环境变量需要指定为true,指定使用FQDN格式避免截全节点通信失败,集群建立失败。

坑5:如果podManagementPolicy 策略不为 “Parallel”, 则readiness 探针需要关闭,避免集群启动失败。

二、RabbitMQ集群部署关键问题总结

以上总结了RabbitMQ集群部署中的五大核心问题,建议在实施前逐项核查配置,可显著提升部署成功率。

  1. 节点选择器绑定:必须使用集群节点的Hostname而非IP,否则Pod会陷入Pending状态。
  2. 角色授权:确保rabbitmq-peer-discovery角色已授权nodes资源,否则Pod启动报错。
  3. 端口暴露:必须开放4369(EPMD)、25672(Erlang分布式通信)等核心端口,否则集群初始化失败。
  4. 长名称配置:环境变量RABBITMQ_USE_LONGNAME需设为true,强制使用FQDN格式避免节点通信截断。
  5. Pod管理策略:若未采用Parallel策略,需关闭readiness探针,防止集群启动阻塞。
http://www.xdnf.cn/news/1296667.html

相关文章:

  • 希尔排序专栏
  • C++ 仿RabbitMQ实现消息队列项目
  • Trae x Figma MCP一键将设计稿转化为精美网页
  • 通信算法之313:FPGA中实现滑动相关消耗DSP资源及7045/7035的乘法器资源
  • Mysql基本使用语句(一)
  • 读《精益数据分析》:移情(Empathy)—— 验证真实需求,避免伪需求陷阱
  • OpenLayers与Vue.js结合实现前端地图应用
  • 51单片机-驱动LED模块教程
  • 机器视觉之图像处理篇
  • 相较于传统AR作战环境虚拟仿真系统,其优势体现在哪些方面?
  • Flutter 顶部导航标签组件Tab + TabBar + TabController
  • 读From GPT-2 to gpt-oss: Analyzing the Architectural Advances
  • 线上故障定位:从报警到根因的实战指南
  • 计算机如何进行“卷积”操作:从图像到矩阵的奥秘
  • 设计模式笔记_行为型_责任链模式
  • [机器学习]08-基于逻辑回归模型的鸢尾花数据集分类
  • 高分辨率PDF压缩技巧:保留可读性的最小体积方案
  • 通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
  • 【数据结构初阶】--排序(一):直接插入排序,希尔排序
  • MySQL的索引(索引的创建和设计原则):
  • 并发编程 - 读写锁(ReentrantReadWriteLock)的探究
  • JVM的逃逸分析深入学习
  • T05_卷积神经网络
  • 消费级显卡分布式智能体协同:构建高性价比医疗AI互动智能体的理论与实践路径
  • TypeScript 中,! 是 非空断言操作符
  • 上网行为安全概述和组网方案
  • EN 61010电子电气设备安全要求标准
  • 抗辐照CANFD通信芯片在高安全领域国产化替代的研究
  • 从根源到生态:Apache Doris 与 StarRocks 的深度对比 —— 论开源基因与长期价值的优越性
  • Gemma 3 多模态推理 通过vllm运行Gemma-3-27B-IT模型的推理服务