k8s部署rabbitmq高可用集群
基于rabbitmq-peer-discovery-k8s插件集群安装,参考地址:https://github.com/rabbitmq/rabbitmq-peer-discovery-k8s
yaml模板
apiVersion: v1
kind: ServiceAccount
metadata:
name: rabbitmq
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: rabbitmq-peer-discovery-rbac
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: rabbitmq-peer-discovery-rbac
subjects:
- kind: ServiceAccount
name: rabbitmq
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: rabbitmq-peer-discovery-rbac
---
kind: Service
apiVersion: v1
metadata:
name: rabbitmq-cluster-headless
labels:
app: rabbitmq-cluster-headless
spec:
# 防止readinessProbe在服务没启动时找不到DNS
publishNotReadyAddresses: true
ports:
- name: http
port: 15672
- name: amqp
port: 5672
selector:
app: rabbitmq-cluster
---
kind: Service
apiVersion: v1
metadata:
name: rabbitmq-cluster
labels:
app: rabbitmq-cluster
type: LoadBalancer
spec:
type: NodePort
ports:
- name: http
protocol: TCP
port: 15672
targetPort: 15672
nodePort: 31672
- name: amqp
protocol: TCP
port: 5672
targetPort: 5672
nodePort: 30672
selector:
app: rabbitmq-cluster
---
apiVersion: v1
kind: ConfigMap
metadata:
name: rabbitmq-cluster-config
data:
enabled_plugins: |
# 配置启用插件
[rabbitmq_peer_discovery_k8s,rabbitmq_prometheus,rabbitmq_management,rabbitmq_shovel,rabbitmq_shovel_management].
rabbitmq.conf: |
# rabbitmq配置文件
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
cluster_formation.k8s.host = kubernetes.default
cluster_formation.k8s.address_type = hostname
cluster_formation.node_cleanup.interval = 30
cluster_formation.node_cleanup.only_log_warning = true
cluster_partition_handling = pause_minority
queue_master_locator = min-masters
loopback_users.guest = false
listeners.tcp.default = 5672
# 定义登录用户名密码
default_pass = test
default_user = test
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rabbitmq-cluster
spec:
serviceName: rabbitmq-cluster-headless
replicas: 3
selector:
matchLabels:
app: rabbitmq-cluster
template:
metadata:
labels:
app: rabbitmq-cluster
spec:
serviceAccountName: rabbitmq
terminationGracePeriodSeconds: 10
containers:
- name: rabbitmq-cluster
image: rabbitmq:3.8
ports:
- containerPort: 5672
name: amqp
protocol: TCP
- containerPort: 15672
name: http
protocol: TCP
livenessProbe:
exec:
command: ["rabbitmq-diagnostics", "status"]
initialDelaySeconds: 60
periodSeconds: 60
timeoutSeconds: 15
readinessProbe:
exec:
command: ["rabbitmq-diagnostics", "ping"]
initialDelaySeconds: 20
periodSeconds: 60
timeoutSeconds: 10
imagePullPolicy: Always
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: RABBITMQ_USE_LONGNAME
value: "true"
- name: K8S_SERVICE_NAME
value: rabbitmq-cluster-headless
- name: RABBITMQ_NODENAME
value: rabbit@$(MY_POD_NAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local
- name: K8S_HOSTNAME_SUFFIX
value: .$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local
# 定义集群cookie
- name: RABBITMQ_ERLANG_COOKIE
value: "58G3PhkBlaKXmver4mvuk06BAir78lku"
volumeMounts:
- name: config-volume
mountPath: /etc/rabbitmq
- name: persistence
mountPath: /var/lib/rabbitmq/mnesia/
volumes:
- name: config-volume
configMap:
name: rabbitmq-cluster-config
items:
- key: rabbitmq.conf
path: rabbitmq.conf
- key: enabled_plugins
path: enabled_plugins
# 使用storageClass做数据存储
volumeClaimTemplates:
- metadata:
name: persistence
spec:
accessModes:
- ReadWriteOnce
storageClassName: "nfs-storage"
resources:
requests:
storage: 10Gi
创建集群
kubectl apply -f rabbitmq-cluster.yaml
启动后集群默认都为磁盘节点

需要调整ram节点,只需要登录具体的pod更节点状态即可。
#更改节点为磁盘节点命令
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
#查看集群节点状态
rabbitmqctl cluster_status
#查看插件启动状态
rabbitmq-plugins list
配置镜像模式
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

浙公网安备 33010602011771号