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包

相关推荐
安达发1 小时前
安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
大数据·运维·人工智能·自动化·aps排产软件·智能优化排产软件
xbd_zc1 小时前
【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook
linux·ubuntu·自动化·ansible·虚拟机·vagrant·virtualbox
lsnm3 小时前
【LINUX操作系统】线程操作
linux·jvm·c++·ubuntu·centos·gnu
Nueuis3 小时前
微信小程序分页和下拉刷新
服务器·前端·微信小程序
FREEDOM_X3 小时前
Ubuntu 20.04 安装 ROS 2 Foxy Fitzroy
linux·ubuntu·机器人
华纳云IDC服务商4 小时前
如何利用Rust提升Linux服务器效率(详细操作指南)
linux·服务器·rust
桦04 小时前
【Linux】g++安装教程
linux·运维·服务器
Once_day5 小时前
Linux之netlink(2)libnl使用介绍(1)
linux·netlink·libnl3
小草cys6 小时前
[零基础]内网ubuntu映射到云服务器上,http访问(frp内网穿透)
运维·服务器