场景:单个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测试:
admin/admin123
rabbitmq_delayed_message_exchange.tar是镜像包
使用的话docker load -i rrabbitmq_delayed_message_exchange.tar导入这个tar包