k8s1.20版本部署RabbitMQ集群(持久化)——2023.05

news2024/11/27 4:20:59

文章目录

    • 一、集群概况
    • 二、RabbitMQ集群部署
      • 2.1 安装NFS
      • 2.2 创建storageclass存储类
      • 2.3 部署RabbitMQ集群
      • 2.4 测试

一、集群概况

  1. 主机规划
节点IP
k8s-master1192.168.2.245
k8s-master2192.168.2.246
k8s-master3192.168.2.247
k8s-node1192.168.2.248
NFS、Rancher192.168.2.251
  1. 版本介绍
服务版本
centos7.9
Rancher(单节点)2.5.12
kubernetes1.20.15
RabbitMQ3.7-management

二、RabbitMQ集群部署

2.1 安装NFS

NFS Server IP(服务端):192.168.2.251
NFS Client IP(客户端):192.168.2.245

1. NFS Server端安装NFS
操作主机:NFS、Rancher|192.168.2.251

# 1.安装nfs与rpc
yum install -y nfs-utils rpcbind
# 查看是否安装成功
rpm -qa | grep nfs
rpm -qa | grep rpcbind

在这里插入图片描述

# 2.创建共享存储文件夹
mkdir -p /k8s/rmq-cluster 

# 3.配置nfs
vim /etc/exports
/k8s/rmq-cluster 192.168.2.0/24(rw,no_root_squash,no_all_squash,sync)
# 4.启动服务
systemctl start nfs
systemctl start rpcbind
#添加开机自启
systemctl enable nfs
systemctl enable rpcbind

# 5.配置生效
exportfs -r

# 6.查看挂载情况
showmount -e localhost
#输出下面信息表示正常
Export list for localhost:
/nfs/k8s_data 192.168.2.0/24
  1. NFS Client安装NFS
    操作主机:除了NFS server,其他所有主机
yum -y install nfs-utils

2.2 创建storageclass存储类

1. 创建ServiceAccount账号

vim rabbitmq-rbac.yaml
#复制以下内容:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: rmq-cluster
  namespace: public-service
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rmq-cluster
  namespace: public-service
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rmq-cluster
  namespace: public-service
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: rmq-cluster
subjects:
- kind: ServiceAccount
  name: rmq-cluster
  namespace: public-service
# 创建资源
kubectl create -f rabbitmq-rbac.yaml

2. 创建provisioner
(也可称为供应者、置备程序、存储分配器)

vim nfs-client-provisioner.yaml
# 复制以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  namespace: public-service
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: rmq-cluster                                #这个serviceAccountName就是上面创建ServiceAccount账号
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME                    #PROVISIONER_NAME的值就是本清单的顶部定义的name
              value: nfs-client-provisioner
            - name: NFS_SERVER                                  #这个NFS_SERVER参数的值就是nfs服务器的IP地址
              value: 192.168.2.251
            - name: NFS_PATH                                    #这个NFS_PATH参数的值就是nfs服务器的共享目录
              value: /k8s/rmq-cluster
      volumes:
        - name: nfs-client-root
          nfs:                                                                  #这里就是配置nfs服务器的ip地址和共享目录
            server: 192.168.2.251
            path: /k8s/rmq-cluster
# 创建资源
kubectl create -f nfs-client-provisioner.yaml

3. 创建StorageClass

vim nfs-storageclass.yaml
# 复制以下内容:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rabbitmq-storageclass
parameters:
  archiveOnDelete: 'false'
provisioner: nfs-client-provisioner     # 与provisioner的name一致
reclaimPolicy: Delete
volumeBindingMode: Immediate
# 创建资源:
kubectl create -f nfs-storageclass.yaml	

2.3 部署RabbitMQ集群

1. 创建命名空间

kubectl create namespace public-service

2. 创建访问rabbitmq集群的service和屋头service

vim rabbitmq-service-lb.yaml
复制以下内容:

kind: Service
apiVersion: v1
metadata:
  labels:
    app: rmq-cluster
    type: LoadBalancer
  name: rmq-cluster-balancer
  namespace: public-service
spec:
  ports:
  - name: http
    port: 15672
    protocol: TCP
    targetPort: 15672
  - name: amqp
    port: 5672
    protocol: TCP
    targetPort: 5672
  selector:
    app: rmq-cluster
  type: NodePort
vim rabbitmq-service-cluster.yaml
复制以下内容:

apiVersion: v1
metadata:
  labels:
    app: rmq-cluster
  name: rmq-cluster
  namespace: public-service
spec:
  clusterIP: None
  ports:
  - name: amqp
    port: 5672
    targetPort: 5672
  selector:
    app: rmq-cluster
# 创建资源
kubectl create -f  rabbitmq-service-lb.yaml rabbitmq-service-cluster.yaml 

3. 创建一个secret对象,用来存储rabbitmq的用户名、密码

vim rabbitmq-secret.yaml
复制以下内容:

kind: Secret
apiVersion: v1
metadata:
  name: rmq-cluster-secret
  namespace: public-service
stringData:
  cookie: ERLANG_COOKIE
  password: RABBITMQ_PASS
  url: amqp://RABBITMQ_USER:RABBITMQ_PASS@rmq-cluster-balancer
  username: RABBITMQ_USER
type: Opaque
# 创建资源:
kubectl apply -f rabbitmq-secret.yaml

4. Configmap创建 rabbitmq配置文件

vim rabbitmq-configmap.yaml
复制以下内容:

kind: ConfigMap
apiVersion: v1
metadata:
  name: rmq-cluster-config
  namespace: public-service
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
data:
    enabled_plugins: |
      [rabbitmq_management,rabbitmq_peer_discovery_k8s].
    rabbitmq.conf: |
      loopback_users.guest = false

      default_user = RABBITMQ_USER
      default_pass = RABBITMQ_PASS
      ## Clustering
      cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
      cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
      cluster_formation.k8s.address_type = hostname
      #################################################
      # public-service is rabbitmq-cluster's namespace#
      #################################################
      cluster_formation.k8s.hostname_suffix = .rmq-cluster.public-service.svc.cluster.local
      cluster_formation.node_cleanup.interval = 10
      cluster_formation.node_cleanup.only_log_warning = true
      cluster_partition_handling = autoheal
      ## queue master locator
      queue_master_locator=min-masters
# 创建资源
kubectl apply -f rabbitmq-configmap.yaml

5. 通过statefulset类型创建rabbitmq集群

vim rabbitmq-cluster-sts.yaml
复制以下内容:

kind: StatefulSet
apiVersion: apps/v1
metadata:
  labels:
    app: rmq-cluster
  name: rmq-cluster
  namespace: public-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: rmq-cluster
  serviceName: rmq-cluster
  template:
    metadata:
      labels:
        app: rmq-cluster
    spec:
      containers:
      - args:
        - -c
        - cp -v /etc/rabbitmq/rabbitmq.conf ${RABBITMQ_CONFIG_FILE}; exec docker-entrypoint.sh
          rabbitmq-server
        command:
        - sh
        env:      
        - name: RABBITMQ_DEFAULT_USER     #登陆用户名和密码都存储在一个secret对象中
          valueFrom:
            secretKeyRef:
              key: username
              name: rmq-cluster-secret
        - name: RABBITMQ_DEFAULT_PASS
          valueFrom:
            secretKeyRef:
              key: password
              name: rmq-cluster-secret
        - name: RABBITMQ_ERLANG_COOKIE
          valueFrom:
            secretKeyRef:
              key: cookie
              name: rmq-cluster-secret
        - name: K8S_SERVICE_NAME
          value: rmq-cluster
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: RABBITMQ_USE_LONGNAME
          value: "true"
        - name: RABBITMQ_NODENAME
          value: rabbit@$(POD_NAME).rmq-cluster.$(POD_NAMESPACE).svc.cluster.local
        - name: RABBITMQ_CONFIG_FILE
          value: /var/lib/rabbitmq/rabbitmq.conf
        image: registry.cn-hongkong.aliyuncs.com/susie/rabbitmq:3.7-management
        imagePullPolicy: IfNotPresent
        livenessProbe:
          exec:
            command:
            - rabbitmqctl
            - status
          initialDelaySeconds: 30
          timeoutSeconds: 10
        name: rabbitmq
        ports:
        - containerPort: 15672
          name: http
          protocol: TCP
        - containerPort: 5672
          name: amqp
          protocol: TCP
        readinessProbe:
          exec:
            command:
            - rabbitmqctl
            - status
          initialDelaySeconds: 10
          timeoutSeconds: 10
        volumeMounts:
        - mountPath: /etc/rabbitmq
          name: config-volume
          readOnly: false
#        - mountPath: /var/lib/rabbitmq
#          name: rabbitmq-storage
#          readOnly: false
      serviceAccountName: rmq-cluster
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          items:
          - key: rabbitmq.conf
            path: rabbitmq.conf
          - key: enabled_plugins
            path: enabled_plugins
          name: rmq-cluster-config
        name: config-volume
  volumeClaimTemplates:
  - metadata:
      name: rabbitmq-storage
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: "rabbitmq-storage-class"    # 配置前面创建好的storageclass名称
      resources:
        requests:
          storage: 1Gi    #设置大小
# 创建资源:
kubectl apply -f rabbitmq-cluster-sts.yaml
查看资源创建情况:
kubectl get pod,svc,pv,pvc -n public-service

在这里插入图片描述
可以看到3个pod 已经running,并且pvc 均已自动绑定。

2.4 测试

1. 进入一个pod,查看rabbitmq集群状态:

[root@k8s-master1 rabbitmq]# kubectl exec -it rmq-cluster-0 -n public-service bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

root@rmq-cluster-0:/# rabbitmqctl cluster_status
Cluster status of node rabbit@rmq-cluster-0.rmq-cluster.public-service.svc.cluster.local ...
[{nodes,
     [{disc,
          ['rabbit@rmq-cluster-0.rmq-cluster.public-service.svc.cluster.local',
           'rabbit@rmq-cluster-1.rmq-cluster.public-service.svc.cluster.local',
           'rabbit@rmq-cluster-2.rmq-cluster.public-service.svc.cluster.local']}]},
 {running_nodes,
     ['rabbit@rmq-cluster-2.rmq-cluster.public-service.svc.cluster.local',
      'rabbit@rmq-cluster-1.rmq-cluster.public-service.svc.cluster.local',
      'rabbit@rmq-cluster-0.rmq-cluster.public-service.svc.cluster.local']},
 {cluster_name,
     <<"rabbit@rmq-cluster-0.rmq-cluster.public-service.svc.cluster.local">>},
 {partitions,[]},
 {alarms,
     [{'rabbit@rmq-cluster-2.rmq-cluster.public-service.svc.cluster.local',[]},
      {'rabbit@rmq-cluster-1.rmq-cluster.public-service.svc.cluster.local',[]},
      {'rabbit@rmq-cluster-0.rmq-cluster.public-service.svc.cluster.local',
          []}]}]

2. RabbitMQ Management 管理界面查看集群状态
http://nodeip:service暴露的IP登录管理界面,这里是http://192.168.2.248:31149/
在这里插入图片描述
部署完成。

参考文章:
k8s部署rabbitMQ集群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里巴巴 菜鸟Java面经

目录 1.ArrayList和LinkedList的区别2.两个各自装啥数据合适3.final和finally的区别4.catch里面有个return&#xff0c;finally执行不执行5.线程的创建方式6.ThreadLocal7.序列化8.抽象类和接口的区别9.数据库的四大特性10.事务的一致性是啥11.事务的隔离级别12.可重复读是个啥…

inspect.exe安装使用

官网下载 https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/ 官网教程 https://learn.microsoft.com/zh-cn/windows/win32/winauto/inspect-objects 要求 系统要求 Windows SDK 具有以下最低系统要求&#xff1a; 支持的操作系统 Windows 10版本 150…

chatgpt赋能Python-pycharm如何跳过教程

PyCharm如何跳过教程&#xff1a;快速掌握Python编程 如果你是一个有10年python编程经验的工程师&#xff0c;那么你肯定不需要再从头开始学习python&#xff0c;更不需要花费大量时间来学习PyCharm的教程。你需要的是一个快速而高效地使用PyCharm的方法&#xff0c;以便能够更…

chatgpt赋能Python-pandas预处理

介绍 Pandas是一个强大的Python库&#xff0c;专门用于数据操作和分析。在数据处理和分析的过程中&#xff0c;Pandas是一个不可或缺的工具。它提供了简单而灵活的数据结构&#xff0c;如Series和DataFrame&#xff0c;这些数据结构可以帮助我们快速预处理数据。 本文将介绍P…

虚拟机 01 jdk环境的安装与配置

01.第一步&#xff1a;进入到工作目录中&#xff0c;然后将目录中所有的资源都删掉 &#xff0c;此处的工作目录/usr/local/src 使用的命令是rm -rf * 02.第二步&#xff1a;将windows系统的jdk8的安装文件上传到Linux中 直接在window界面中选中压缩文件拖到Linux命令行中 完…

区间预测 | MATLAB实现QGPR高斯过程分位数回归时间序列区间预测

区间预测 | MATLAB实现QGPR高斯过程分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QGPR高斯过程分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QGPR高斯过程分位数回归时间序列区间预测 1.基于高斯过程回归&#…

chatgpt赋能Python-pycharm怎么粘贴代码

PyCharm&#xff1a;如何在编辑器中粘贴代码 作为一个有多年 Python 编程经验的工程师&#xff0c;我可以说 PyCharm 是 Python 编辑器中的佼佼者&#xff0c;它凭借其智能化、强大的功能和用户友好的界面而受到广泛赞誉。在该编程软件中&#xff0c;如果你需要粘贴代码&#…

【我的C++入门之旅】(上)

前言 C的发展史 1979年&#xff0c;贝尔实验室的Bjarne等人试图分析unix内核的时候&#xff0c;试图将内核模块化&#xff0c;但是发现C语言有很多的不足之处&#xff0c;于是在C语言的基础上进行扩展&#xff0c;增加了类的机制&#xff0c;完成了一个可以运行的预处理程序&…

chatgpt赋能Python-pycharm备份

PyCharm备份——数据安全之道 在软件开发过程中&#xff0c;数据备份是一项至关重要的任务。特别是对于PyCharm这样的IDE来说&#xff0c;开发者在其中执行大量的代码编写、调试、测试、运行等操作&#xff0c;需要在相对固定的时间点 backup 数据&#xff0c;以防止数据丢失带…

【AFNetWorking源码一】

文章目录 前言一.原生的网络请求发送方式1.1 原生GET1.2 原生PSOT 二.AFN2.1 AFN的基本架构分析2.2 以GET为例分析AFN使用流程&#xff08;AFHTTPSessionManager2.2.1 AFN如何生生成对应的sessionManager2.2.2. AFURLSessionManager的初始化2.2.3 task的三种代理2.2.3.1 setDel…

力扣sql中等篇练习(二十二)

力扣sql中等篇练习(二十二) 1 坚定的友谊 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below # ①求出所有朋友关系的总表 WITH T as (SELECT user1_id ,user2_idFROM friendshipUNION SELECT user2_id user1…

前端学习--Vue(1)webpack

前端工程化 模块化&#xff08;js、css模块化、资源模块化&#xff09; 组件化&#xff08;复用现有的UI结构、样式、行为&#xff09; 规范化&#xff08;目录结构划分、编码规范化、接口文档规范化、git分支管理&#xff09; 自动化&#xff08;自动化构建、自动部署、自动化…

试用阿里云云拨测对Web网站的网页性能进行测试并分析

目录 前言 云拨测操作步骤 1.开通应用实时监控服务ARMS 2.成功登录后&#xff0c;在产品类别下选择中间件>应用实时监控服务&#xff0c;在云拨测卡片上单击立即试用。 3.登录ARMS控制台&#xff0c;在左侧导航栏中选择云拨测>定时拨测&#xff0c;在定时拨测页面右上…

chatgpt赋能Python-pycharm怎么与python关联

Pycharm怎么与Python关联&#xff1f; 介绍 对于Python开发人员来说&#xff0c;Pycharm是一个非常强大的IDE。它提供了各种工具和功能&#xff0c;用于快速开发和调试Python代码。但是&#xff0c;在开始开发之前&#xff0c;必须将Pycharm与Python关联起来。否则&#xff0…

chatgpt赋能Python-pulp_python

Pulp Python: 介绍与优点 在数据分析和决策优化领域&#xff0c;线性规划是一种非常有效的数学模型。而Pulp Python是一款优秀的线性规划库&#xff0c;它可以帮助用户快速进行线性规划求解&#xff0c;同时还具备可扩展性和易使用性等优点。 什么是线性规划&#xff1f; 线…

chatgpt赋能Python-pycharm_滚轮字体大小设置

Pycharm滚轮字体大小设置 Pycharm是一款非常流行的Python IDE&#xff0c;广泛用于Python编程。然而&#xff0c;每个开发者都有其自己的偏好设置&#xff0c;包括字体大小。此文将介绍如何使用滚轮控制Pycharm中编辑器的字体大小。 界面操作 在Pycharm中&#xff0c;您可以…

南京邮电大学Web技术双语实验二(Web服务端脚本编写)

文章目录 一、 实验目的和要求二、实验环境(实验设备)三、实验原理及内容1首先编写html页面2 html页面效果如下图所示3 编写服务端php脚本4 服务端页面显示如下 四、实验小结&#xff08;包括问题和解决方法、心得体会、意见与建议等&#xff09; 一、 实验目的和要求 1 显示一…

进程通信 — 管道

目录 进程通信前提进程间通信的目的进程间通信发展进程间通信分类管道认识管道匿名管道站在文件描述符角度&#xff0c;深度理解管道 管道读取规则读写规则 管道特点命名管道命名管道的打开规则 匿名管道与命名管道的区别命名管道的打开规则 匿名管道与命名管道的区别 进程通信…

chatgpt赋能Python-pycharm怎么关联python

PyCharm怎么关联Python PyCharm是一款非常流行的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;它经常被Python开发者用来编写、调试和测试他们的代码。为了让PyCharm正常工作&#xff0c;需要将其与Python相关联。在这篇文章中&#xff0c;我们将讨论如何在PyCh…

最小二乘法

本文结合对ChatGTP的提问&#xff0c;用自己的理解讲一讲最小二乘法。 最小二乘法&#xff1a; yi是实际值&#xff0c;yhat是理论值&#xff0c;就是拟合值&#xff0c;比方说一次函数做拟合&#xff0c;那就是在这个x点位置时的值。累加所有yi-yhat的平方&#xff0c;得到E并…