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

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

一、集群概况

  1. 主机规划
节点 IP
k8s-master1 192.168.2.245
k8s-master2 192.168.2.246
k8s-master3 192.168.2.247
k8s-node1 192.168.2.248
NFS、Rancher 192.168.2.251


  1. 版本介绍
服务 版本
centos 7.9
Rancher(单节点) 2.5.12
kubernetes 1.20.15
RabbitMQ 3.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


c28c2e876de44438a906b8ada16b6812.png

# 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

a0dce66a667148b0bae74131b346eca4.png

可以看到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/

51fba42c951146f3b4f6cdc4093f8c58.png

部署完成。

参考文章:

k8s部署rabbitMQ集群

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
5天前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
借助阿里云ACK One注册集群,充分利用阿里云强大ACS GPU算力,实现DeepSeek推理模型高效部署。
|
5天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
152 91
|
10天前
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
本教程演示如何在ACK中使用vLLM框架快速部署DeepSeek R1模型推理服务。
|
11天前
|
存储 人工智能 弹性计算
NVIDIA NIM on ACK:优化生成式AI模型的部署与管理
本文结合NVIDIA NIM和阿里云容器服务,提出了基于ACK的完整服务化管理方案,用于优化生成式AI模型的部署和管理。
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
148 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
87 2
|
2月前
|
消息中间件 存储 运维
2024最全RabbitMQ集群方案汇总
本文梳理了RabbitMQ集群的几种方案,主要包括普通集群、镜像集群(高可用)、Quorum队列(仲裁队列)、Streams集群模式(高可用+负载均衡)和插件方式。重点介绍了每种方案的特点、优缺点及适用场景。搭建步骤包括安装Erlang和RabbitMQ、配置集群节点、修改hosts文件、配置Erlang Cookie、启动独立节点并创建集群,以及配置镜像队列以提高可用性和容错性。推荐使用Quorum队列与Streams模式,其中Quorum队列适合高可用集群,Streams模式则同时支持高可用和负载均衡。此外,还有Shovel和Federation插件可用于特定场景下的集群搭建。
330 2

热门文章

最新文章