rabbitmq-集群部署

场景:单个pod,部署在主节点,基础版没有插件,进阶版多了一个插件

基础版本:

复制代码
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: rabbitmq-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  hostPath:
    path: /data/rabbitmq
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rabbitmq-pvc
  namespace: middle-ware
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rabbitmq
  namespace: middle-ware
spec:
  serviceName: rabbitmq-headless
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      labels:
        app: rabbitmq
    spec:
      dnsPolicy: ClusterFirst
      # 时间同步配置
      #hostNetwork: true
      #hostPID: true
      hostname: rabbitmq-0
      subdomain: rabbitmq-headless
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"    
      # 存储权限初始化
      initContainers:
      - name: volume-permissions
        image: busybox:1.28
        command: ["sh", "-c", "chown -R 1000:1000 /var/lib/rabbitmq"]
        volumeMounts:
        - name: rabbitmq-storage
          mountPath: /var/lib/rabbitmq
      
      containers:
      - name: rabbitmq
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3-management
        #imagePullPolicy: IfNotPresent
        
        # 端口配置
        ports:
        - containerPort: 5672
          name: amqp
        - containerPort: 15672
          name: management
        
        # 卷挂载
        volumeMounts:
        - name: rabbitmq-config
          mountPath: /etc/rabbitmq/rabbitmq.conf
          subPath: rabbitmq.conf
        - name: rabbitmq-storage
          mountPath: /var/lib/rabbitmq
        - name: timezone
          mountPath: /etc/localtime
        
        # 精简后的环境变量
        env:
        - name: RABBITMQ_USE_LONGNAME  
          value: "true" 
        - name: RABBITMQ_NODENAME
          value: "rabbit@rabbitmq-0.rabbitmq-headless.middle-ware.svc.cluster.local"
        - name: HOSTNAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: RABBITMQ_ERLANG_COOKIE
          value: "secretcookie"
        - name: RABBITMQ_DEFAULT_USER
          valueFrom:
            secretKeyRef:
              name: rabbitmq-credentials
              key: RABBITMQ_DEFAULT_USER
        # 资源限制
        resources:
          requests:
            cpu: "500m"
            memory: "1Gi"
          limits:
            cpu: "1"
            memory: "5Gi"
      
      # 存储声明
      volumes:
      - name: timezone
        hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai
      - name: rabbitmq-config
        configMap:
          name: rabbitmq-config
      - name: rabbitmq-storage
        persistentVolumeClaim:
          claimName: rabbitmq-pvc
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-config
  namespace: middle-ware
data:
  rabbitmq.conf: |
    default_user = admin
    default_pass = admin123
    loopback_users = none
    listeners.tcp.default = 5672
    management.tcp.port = 15672
    cluster_name = k8s_rabbitmq
    cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
    cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
    cluster_formation.k8s.address_type = hostname
    cluster_formation.k8s.service_name = rabbitmq-headless
    #use_longname = true
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-nodeport
  namespace: middle-ware
spec:
  type: NodePort
  selector:
    app: rabbitmq
  ports:
  - port: 5672
    targetPort: 5672
    nodePort: 30672
    name: amqp
  - port: 15672
    targetPort: 15672
    nodePort: 31672
    name: management
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-headless
  namespace: middle-ware
spec:
  clusterIP: None
  selector:
    app: rabbitmq
  ports:
  - port: 5672
    name: amqp
  - port: 15672
    name: management
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-service
  namespace: middle-ware
spec:
  type: ClusterIP
  selector:
    app: rabbitmq
  ports:
  - port: 5672
    name: amqp
  - port: 15672
    name: management
---
apiVersion: v1
kind: Secret
metadata:
  name: rabbitmq-credentials
  namespace: middle-ware
type: Opaque
stringData:
  RABBITMQ_DEFAULT_USER: "admin"   # 用户名
  RABBITMQ_DEFAULT_PASS: "admin123"  # 密码
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: rabbitmq-peer-discovery
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rabbitmq-peer-discovery
  namespace: middle-ware
subjects:
- kind: ServiceAccount
  name: default  # 或你的自定义 ServiceAccount
  namespace: middle-ware
roleRef:
  kind: ClusterRole
  name: rabbitmq-peer-discovery
  apiGroup: rbac.authorization.k8s.io

封装版本:

新增方式:在原有的镜像上将插件拷贝进来,封装多了一个插件文件到/opt/rabbitmq/plugins

复制代码
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rabbitmq-plugins-pvc
spec:
  storageClassName: ""  # 空字符串表示不使用动态存储分配
  volumeName: rabbitmq-pv  # 指定已有的 PV 名称
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: rabbitmq-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  hostPath:
    path: /data/rabbitmq
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rabbitmq-pvc
  namespace: middle-ware
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rabbitmq
  namespace: middle-ware
spec:
  serviceName: rabbitmq-headless
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      labels:
        app: rabbitmq
    spec:
      dnsPolicy: ClusterFirst
      # 时间同步配置
      #hostNetwork: true
      #hostPID: true
      hostname: rabbitmq-0
      subdomain: rabbitmq-headless
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"    
      # 存储权限初始化
      initContainers:
      - name: volume-permissions
        image: busybox:1.28
        command: ["sh", "-c", "mkdir -p /var/lib/rabbitmq && chown -R 1000:1000 /var/lib/rabbitmq"]
        volumeMounts:
        - name: rabbitmq-storage
          mountPath: /var/lib/rabbitmq
      containers:
      - name: rabbitmq
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3-management
        #imagePullPolicy: IfNotPresent
        
        # 端口配置
        ports:
        - containerPort: 5672
          name: amqp
        - containerPort: 15672
          name: management
        
        # 卷挂载
        volumeMounts:
        - name: rabbitmq-config
          mountPath: /etc/rabbitmq/rabbitmq.conf
          subPath: rabbitmq.conf
        - name: rabbitmq-storage
          mountPath: /var/lib/rabbitmq
        - name: timezone
          mountPath: /etc/localtime    
        - name: rabbitmq-plugins
          mountPath: /opt/rabbitmq/publish
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "rabbitmq-plugins enable rabbitmq_delayed_message_exchange"]          
        # 精简后的环境变量
        env:
        - name: RABBITMQ_USE_LONGNAME  
          value: "true" 
        - name: RABBITMQ_NODENAME
          value: "rabbit@rabbitmq-0.rabbitmq-headless.middle-ware.svc.cluster.local"
        - name: HOSTNAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: RABBITMQ_ERLANG_COOKIE
          value: "secretcookie"
        - name: RABBITMQ_DEFAULT_USER
          valueFrom:
            secretKeyRef:
              name: rabbitmq-credentials
              key: RABBITMQ_DEFAULT_USER
        # 资源限制
        resources:
          requests:
            cpu: "500m"
            memory: "1Gi"
          limits:
            cpu: "1"
            memory: "2Gi"
      
      # 存储声明
      volumes:
      - name: rabbitmq-plugins
        persistentVolumeClaim:
          claimName: rabbitmq-plugins-pvc
      - name: timezone
        hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai
      - name: rabbitmq-config
        configMap:
          name: rabbitmq-config
      - name: rabbitmq-storage
        persistentVolumeClaim:
          claimName: rabbitmq-pvc
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-config
  namespace: middle-ware
data:
  rabbitmq.conf: |
    #default_user = admin
    #default_pass = admin123
    loopback_users = none
    listeners.tcp.default = 5672
    management.tcp.port = 15672
    cluster_name = k8s_rabbitmq
    cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
    cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
    cluster_formation.k8s.address_type = hostname
    cluster_formation.k8s.service_name = rabbitmq-headless
    #use_longname = true
    plugins = rabbitmq_delayed_message_exchange
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-nodeport
  namespace: middle-ware
spec:
  type: NodePort
  selector:
    app: rabbitmq
  ports:
  - port: 5672
    targetPort: 5672
    nodePort: 30672
    name: amqp
  - port: 15672
    targetPort: 15672
    nodePort: 31672
    name: management
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-headless
  namespace: middle-ware
spec:
  clusterIP: None
  selector:
    app: rabbitmq
  ports:
  - port: 5672
    name: amqp
  - port: 15672
    name: management
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-service
  namespace: middle-ware
spec:
  type: ClusterIP
  selector:
    app: rabbitmq
  ports:
  - port: 5672
    name: amqp
  - port: 15672
    name: management
---
apiVersion: v1
kind: Secret
metadata:
  name: rabbitmq-credentials
  namespace: middle-ware
type: Opaque
stringData:
  RABBITMQ_DEFAULT_USER: "admin"   # 用户名
  RABBITMQ_DEFAULT_PASS: "admin123"  # 密码
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: rabbitmq-peer-discovery
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rabbitmq-peer-discovery
  namespace: middle-ware
subjects:
- kind: ServiceAccount
  name: default  # 或你的自定义 ServiceAccount
  namespace: middle-ware
roleRef:
  kind: ClusterRole
  name: rabbitmq-peer-discovery
  apiGroup: rbac.authorization.k8s.io

封装版本的镜像是需要制作的,制作流程如下:

mkdir test && cd test

ls

tar-1.34.tar.gz rabbitmq_delayed_message_exchange.tar

vim Dockerfile

复制代码
#-----第一阶段,为了制作tar包,第二阶段应用到rabbitmq里,第三阶段时rabbitmq插件加载
#FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/selectdb/alpine:latest AS builder
# 修改软件源为国内镜像
#RUN sed -i 's|https://dl-cdn.alpinelinux.org/alpine/|http://mirrors.tuna.tsinghua.edu.cn/alpine/|g' /etc/apk/repositories
# 安装完整的编译工具链和依赖库
#RUN apk update && apk add --no-cache \
#    build-base \
#    gcc \
#    make \
#    autoconf \
#    automake \
#    bison \
#    gettext \
#    libtool \
#    elfutils-dev \
#    ncurses-dev \
#    readline-dev \
#    zlib-dev \
#    musl-dev
# 复制 tar-1.34.tar.gz
#COPY tar-1.34.tar.gz /tar-1.34.tar.gz
# 解压、编译并安装 tar
#RUN tar -zxf /tar-1.34.tar.gz && \
#    cd /tar-1.34 && \
#    FORCE_UNSAFE_CONFIGURE=1 ./configure --prefix=/usr/local && \
#    make && \
#    make install && \
#    rm -rf /tar-1.34 /tar-1.34.tar.gz
# 第二阶段:使用 RabbitMQ 镜像
#FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3-management
# 从第一阶段复制编译好的 tar
#COPY --from=builder /usr/local /usr/local

##docker build -t rabbitmq-tar:1.1 .
##ls
##tar-1.34.tar.gz Dockerfile

#----
#添加插件并且运行容器自动启动
#FROM rabbitmq-tar:1.1
# # 将本地插件包复制到容器内的 /opt/rabbitmq/plugins 目录
#COPY rabbitmq_delayed_message_exchange-3.13.0.ez /opt/rabbitmq/plugins
#启动时加载插件
#RUN rabbitmq-plugins enable --offline rabbitmq_delayed_message_exchange
#
#

#制作镜像

##docker build -t rabbitmq_delayed_message_exchange:1.4 .

##ls

##rabbitmq_delayed_message_exchange.ez Dockerfile

#然后再yaml文件里引用最新镜像即可

#测试是否自动加载插件成功

kubectl exec -it rabbitmq-0 -n middle-ware -- rabbitmq-plugins list |grep rabbitmq_delayed_message_exchange


部署在新环境:pv和pvc大小,账密更改,端口更改,pv目录授权,登录31672/admin/admin123默认的,建议更改

登录curl测试:

http://10.10.10.150:31672/#/

admin/admin123

镜像基于swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3-management封装了一层,添加了tar包,还有rabbitmq_delayed_message_exchange.ez插件包,并且每次运行容器会自动启动插件

rabbitmq_delayed_message_exchange.tar是镜像包

使用的话docker load -i rrabbitmq_delayed_message_exchange.tar导入这个tar包

相关推荐
女神下凡14 分钟前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾1 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
且从容.4 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道4 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达6 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.7 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界9 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨9 小时前
WSL2的安装与使用
linux·wsl
微小的鱼9 小时前
Linux的渲染与显示系统链路
android·java·linux