Kubernetes 部署 RabbitMQ 集群教程

server/2025/1/19 1:04:11/

本文介绍如何在 Kubernetes 中部署 RabbitMQ 集群,包含从命名空间创建到配置 NFS 存储的详细步骤。

参考文档:
  1. RabbitMQ 集群部署
  2. NFS StorageClass 创建

部署步骤

1. 创建命名空间
kubectl create ns rabbitmq
2. 创建 RBAC 权限

创建文件 rabbitmq-rbac.yaml,内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:name: rmq-clusternamespace: rabbitmq
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: rmq-clusternamespace: rabbitmq
rules:- apiGroups:- ""resources:- endpointsverbs:- get
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: rmq-clusternamespace: rabbitmq
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: rmq-cluster
subjects:
- kind: ServiceAccountname: rmq-clusternamespace: rabbitmq

执行命令应用该配置:

kubectl apply -f rabbitmq-rbac.yaml
3. 创建服务 (Service)

创建文件 rabbitmq-service.yaml,内容如下:

kind: Service
apiVersion: v1
metadata:labels:app: rmq-clustername: rmq-clusternamespace: rabbitmq
spec:clusterIP: Noneports:- name: amqpport: 5672targetPort: 5672selector:app: rmq-cluster
---
kind: Service
apiVersion: v1
metadata:labels:app: rmq-clustertype: LoadBalancername: rmq-cluster-balancernamespace: rabbitmq
spec:ports:- name: httpport: 15672protocol: TCPtargetPort: 15672- name: amqpport: 5672protocol: TCPtargetPort: 5672selector:app: rmq-clustertype: NodePort

执行命令应用该配置:

kubectl apply -f rabbitmq-service.yaml
4. 创建集群的 Secret

创建文件 rabbitmq-secret.yaml,内容如下:

kind: Secret
apiVersion: v1
metadata:name: rmq-cluster-secretnamespace: rabbitmq
stringData:cookie: ERLANG_COOKIEpassword: RABBITMQ_PASSurl: amqp://RABBITMQ_USER:RABBITMQ_PASS@rmq-cluster-balancerusername: RABBITMQ_USER
type: Opaque

执行命令应用该配置:

kubectl apply -f rabbitmq-secret.yaml
5. 创建 ConfigMap

创建文件 rabbitmq-configmap.yaml,内容如下:

kind: ConfigMap
apiVersion: v1
metadata:name: rmq-cluster-confignamespace: rabbitmqlabels:addonmanager.kubernetes.io/mode: Reconcile
data:enabled_plugins: |[rabbitmq_management,rabbitmq_peer_discovery_k8s].rabbitmq.conf: |loopback_users.guest = falsedefault_user = RABBITMQ_USERdefault_pass = RABBITMQ_PASS## Clusteringcluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8scluster_formation.k8s.host = kubernetes.default.svc.cluster.localcluster_formation.k8s.address_type = hostnamecluster_formation.k8s.hostname_suffix = .rmq-cluster.rabbitmq.svc.cluster.localcluster_formation.node_cleanup.interval = 10cluster_formation.node_cleanup.only_log_warning = truecluster_partition_handling = autohealqueue_master_locator = min-masters

执行命令应用该配置:

kubectl apply -f rabbitmq-configmap.yaml
6. 创建 StatefulSet

创建文件 rabbitmq-cluster-sts.yaml,内容如下:

kind: StatefulSet
apiVersion: apps/v1
metadata:labels:app: rmq-clustername: rmq-clusternamespace: rabbitmq
spec:replicas: 3selector:matchLabels:app: rmq-clusterserviceName: rmq-clustertemplate:metadata:labels:app: rmq-clusterspec:containers:- args:- -c- cp -v /etc/rabbitmq/rabbitmq.conf ${RABBITMQ_CONFIG_FILE}; exec docker-entrypoint.sh rabbitmq-servercommand:- shenv:- name: RABBITMQ_DEFAULT_USERvalueFrom:secretKeyRef:key: usernamename: rmq-cluster-secret- name: RABBITMQ_DEFAULT_PASSvalueFrom:secretKeyRef:key: passwordname: rmq-cluster-secret- name: RABBITMQ_ERLANG_COOKIEvalueFrom:secretKeyRef:key: cookiename: rmq-cluster-secret- name: K8S_SERVICE_NAMEvalue: rmq-cluster- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: RABBITMQ_USE_LONGNAMEvalue: "true"- name: RABBITMQ_NODENAMEvalue: rabbit@$(POD_NAME).rmq-cluster.$(POD_NAMESPACE).svc.cluster.local- name: RABBITMQ_CONFIG_FILEvalue: /var/lib/rabbitmq/rabbitmq.confimage: registry.cn-beijing.aliyuncs.com/dotbalo/rabbitmq:3.7-management imagePullPolicy: IfNotPresentlivenessProbe:exec:command:- rabbitmqctl- statusinitialDelaySeconds: 30timeoutSeconds: 10name: rabbitmqports:- containerPort: 15672name: httpprotocol: TCP- containerPort: 5672name: amqpprotocol: TCPreadinessProbe:exec:command:- rabbitmqctl- statusinitialDelaySeconds: 10timeoutSeconds: 10volumeMounts:- mountPath: /etc/rabbitmqname: config-volumereadOnly: false- mountPath: /var/lib/rabbitmqname: rabbitmq-storagereadOnly: falseserviceAccountName: rmq-clusterterminationGracePeriodSeconds: 30volumes:- configMap:items:- key: rabbitmq.confpath: rabbitmq.conf- key: enabled_pluginspath: enabled_pluginsname: rmq-cluster-configname: config-volumevolumeClaimTemplates:- metadata:name: rabbitmq-storagespec:accessModes:- ReadWriteManystorageClassName: "nfs-storage"resources:requests:storage: 4Gi

执行命令应用该配置:

kubectl apply -f rabbitmq-cluster-sts.yaml
7. 配置 NFS StorageClass

详细 NFS 配置步骤可参考:NFS StorageClass 配置指南

7.1 创建命名空间
kubectl create namespace nfs
7.2 配置 RBAC 权限

创建文件 rbac.yaml,内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: nfs
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: nfs
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: nfs
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: nfs
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: nfs
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

应用 RBAC 配置:

kubectl apply -f rbac.yaml
7.3 创建 NFS Provisioner

创建文件 nfs-provisioner.yaml,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionernamespace: nfs
spec:replicas: 1selector:matchLabels:app: nfs-client-provisionerstrategy:type: Recreatetemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage- name: NFS_SERVERvalue: <NFS_SERVER_IP>  # 替换为实际 NFS 服务 IP- name: NFS_PATHvalue: <NFS_PATH>       # 替换为实际 NFS 路径volumes:- name: nfs-client-rootnfs:server: <NFS_SERVER_IP>path: <NFS_PATH>

应用 NFS Provisioner 配置:

kubectl apply -f nfs-provisioner.yaml
7.4 创建 StorageClass

创建文件 nfs-StorageClass.yaml,内容如下:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storage
provisioner: nfs-storage
parameters:archiveOnDelete: "false"

应用 StorageClass 配置:

kubectl apply -f nfs-StorageClass.yaml
7.5 设置默认 StorageClass

列出当前集群的 StorageClass:

kubectl get storageclass

nfs-storage 设置为默认 StorageClass:

kubectl patch storageclass nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
7.6 测试配置

创建测试 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-claimannotations:volume.beta.kubernetes.io/storage-class: "nfs-storage"
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Mi

应用测试 PVC 配置:

kubectl apply -f test-pvc.yaml

检查 PVC 状态:

kubectl get pvc
describe pvc test-claim

如果正常绑定,则配置成功。

7.7 错误处理

如果出现以下错误:

waiting for a volume to be created, either by external provisioner “nfs-storage” or manually created by system administrator

查看 NFS Provisioner Pod 日志:

kubectl logs -n nfs <nfs-client-provisioner-pod-name>

如果日志中报错:

unexpected error getting claim reference: selfLink was empty, can’t make reference

解决方法:

参考链接:CSDN 文章

方法一:
  1. 查找 kube-apiserver.yaml 文件位置:

    find / -name kube-apiserver.yaml
    
  2. 编辑文件,在 spec.containers.args 中添加:

    - --feature-gates=RemoveSelfLink=false
    

    示例:
    在这里插入图片描述

  3. 保存并退出,等待配置生效。

方法二:

对于 1.26 及以上版本的 Kubernetes 集群,可以使用 Helm 安装驱动:

# 添加 Helm 源
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner# 创建 Namespace(可选)
kubectl create ns nfs-sc-default# 安装 NFS 驱动
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \--set storageClass.name=nfs-sc-default \--set nfs.server=192.168.1.102 \--set nfs.path=/data/storage \--set storageClass.defaultClass=true -n nfs-sc-default

通过上述方法,可成功配置 NFS StorageClass 并解决相关问题。

总结

通过以上步骤,您可以在 Kubernetes 中成功部署 RabbitMQ 集群。


http://www.ppmy.cn/server/159495.html

相关文章

9分布式微服务架构

分布式微服务架构不光需要从架构上的设计优化系统&#xff0c;还要在编码上优化达到最好的效果 中心化的设计 中心化的设计比较简单&#xff0c;分布式集群中的角色分为两种&#xff0c;管理者和被管理者。 在一个分布式或者集群中&#xff0c;管理者角色管理着其他处理实际…

Spring Boot 中实现图片文件压缩

图片文件压缩是 Web 应用中常见的需求&#xff0c;尤其是在处理用户上传或动态生成的图片时。压缩图片不仅可以减少服务器的存储空间&#xff0c;还能大幅提高网页加载速度和用户体验。在本文中&#xff0c;我们将探讨如何在 Spring Boot 中实现图片压缩&#xff0c;并提供接口…

STM32 FreeRTOS 信号量

信号量的简介 reeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的&#xff08;只能取0或1&#xff09;也可以是计数型的&#xff08;可以是任意正整数&#xff09;。信号量的基本操作包括“获取”和“释放”。 比如动车上的卫生间&#xff0c;一个…

STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态

目录 任务的挂起与恢复的API函数 任务挂起函数 任务恢复函数 任务恢复函数&#xff08;中断中恢复&#xff09; 函数说明 注意事项 查看任务状态 任务的挂起与恢复的API函数 vTaskSuspend()&#xff1a;挂起任务, 类似暂停&#xff0c;可恢复 vTaskResume()&#xff1a…

使用jupyter notebook没有正常打开浏览器的几种情况解决

迅速记录前期 1.下载 https://www.anaconda.com/products/individual 2.安装 直接默认安装就行 3.打开jupyter notebook 在开始菜单里面可以找到 4.遇到的问题解决 1.运行jupyter notebook&#xff0c;黑窗口自动关了 每次黑窗口迅速的加载完就自己关掉了 也没有打开新…

NumPy;NumPy在数据分析中的应用;NumPy与其他库的搭配使用

NumPy&#xff1b;NumPy在数据分析中的应用&#xff1b;NumPy与其他库的搭配使用 NumPy&#xff1a;Python 数据分析的核心工具什么是 NumPy&#xff1f;NumPy 的主要优势 NumPy 在数据分析中的应用1. 数据处理与清洗2. 数学和统计分析3. 数组变换与矩阵运算 NumPy 与其他库的搭…

云IDE:开启软件开发的未来篇章

敖行客一直致力于将整个研发协作流程线上化&#xff0c;从而打破物理环境依赖&#xff0c;让研发组织模式更加灵活、自由且高效&#xff0c;今天就来聊聊AT Work&#xff08;一站式研发协作平台&#xff09;的重要组成部分-云IDE。 在科技领域&#xff0c;历史常常是未来的风向…

第一次作业三种方式安装mysql(Windows和linux下)作业

在Windows11上安装sever&#xff08;服务&#xff09;端和客户端 server端安装 打开官网MySQL 进入到主页 点击DOWMLOAD 进入下载界面 点击下方MySQL Community (GPL) Downloads 进入社区版mysql下载界面 点击 MySQL Community Server 进入server端下载 选择8.4.3LTS&…