k8s部署rabbitmq集群(内网环境)
·
固定nfs动态存储用到的端口
sudo vi /etc/sysconfig/nfs
# 固定 statd 端口(UDP/TCP 统一为32769)
STATD_PORT=32769
# 固定 nlockmgr 端口(UDP/TCP 统一为32803)
LOCKD_TCP_PORT=32803
LOCKD_UDP_PORT=32803
# 固定pvc配额
RQUOTAD_PORT=875
重启使配置生效
# 停止相关服务
sudo systemctl stop nfs-server rpc-statd rpcbind
# 启动服务(顺序:先rpcbind,再statd,最后nfs-server)
sudo systemctl start rpcbind rpc-statd nfs-server
# 重启后验证服务状态(确保都是running)
sudo systemctl status rpcbind rpc-statd nfs-server
验证端口是否固定成功
# 1. 重新查询rpc注册的端口(核心验证)
sudo rpcinfo -p localhost
# 2. 单独验证statd端口(32769)
sudo ss -tulnp | grep 32769
# 3. 单独验证nlockmgr端口(32803)
sudo ss -tulnp | grep 32803
创建命名空间
kubectl create namespace rq
确认 ServiceAccount(确保 RabbitMQ 能访问 K8s API)
# 检查ServiceAccount是否存在
kubectl get sa rabbitmq-cluster -n rq
# 若不存在,创建并绑定权限
kubectl create sa rabbitmq-cluster -n rq
kubectl create clusterrolebinding rabbitmq-cluster --clusterrole=view --serviceaccount=rq:rabbitmq-cluster
确认 StorageClass(确保 NFS 动态存储可用)
kubectl get sc nfs-client # 需存在NFS类型的StorageClass
编写rabbitmq镜像Dockerfile(事先准备低延迟组件rabbitmq_delayed_message_exchange-3.13.0.ez)
FROM rabbitmq:3.13.3-management
LABEL maintainer="Lion Li"
ADD ./rabbitmq_delayed_message_exchange-3.13.0.ez /plugins
RUN rabbitmq-plugins enable rabbitmq_delayed_message_exchange
ENTRYPOINT ["rabbitmq-server"]
部署configmap
$ kubectl apply -f re-cg.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: bpae-rabbitmq-config
namespace: rq
labels:
appname: rabbitmq
app: bpae-rabbitmq-config
data:
enabled_plugins: |
[rabbitmq_management,rabbitmq_peer_discovery_k8s].
rabbitmq.conf: |
cluster_name = bpae-rabbitmq
listeners.tcp.default = 5672
default_vhost = /
default_user = xx #用户名
default_pass = xx #密码
default_user_tags.administrator = true
default_user_tags.management = true
default_user_tags.custom_tag = true
channel_max = 1024
tcp_listen_options.backlog = 2048
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.node_cleanup.interval = 30
cluster_formation.node_cleanup.only_log_warning = true
cluster_partition_handling = autoheal
queue_master_locator=min-masters
loopback_users.guest = false
cluster_formation.k8s.hostname_suffix = .autozx-rabbitmq.rq.svc.cluster.local
部署 Headless Service(提供集群 DNS)
$ kubectl apply -f bpae-rabbitmq-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: autozx-rabbitmq # 与 StatefulSet 的 K8S_SERVICE_NAME 一致
namespace: rq
labels:
appname: rabbitmq
app: bpae-rabbitmq
spec:
selector:
app: bpae-rabbitmq # 匹配 StatefulSet 的 Pod 标签
clusterIP: None # 无头服务核心标识
ports:
- name: amqp
port: 5672
targetPort: amqp
- name: http
port: 15672
targetPort: http
- name: epmd
port: 4369
targetPort: epmd # 集群发现端口
- name: cluster-comm
port: 25672
targetPort: cluster-comm # 集群内部通信端口
部署 StatefulSet + NodePort Service(启动 RabbitMQ 集群)
$ kubectl apply -f sta-svc.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: bpae-rabbitmq
namespace: rq
labels:
appname: rabbitmq
app: bpae-rabbitmq
spec:
serviceName: "autozx-rabbitmq"
replicas: 3
selector:
matchLabels:
app: bpae-rabbitmq
template:
metadata:
labels:
app: bpae-rabbitmq
spec:
securityContext:
runAsUser: 0
runAsGroup: 0
fsGroup: 0
containers:
- name: rabbitmq-server
image: images.bz-link.net/images/bpae-rabbitmq:v1.0 # 你的镜像
imagePullPolicy: IfNotPresent
env:
- name: K8S_SERVICE_NAME
value: autozx-rabbitmq
- 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).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local
- name: ERLANG_COOKIE_VALUE
value: "YZSDHWMFSMKEMBDHSGGZ"
ports:
- name: http
containerPort: 15672
- name: amqp
containerPort: 5672
- name: epmd
containerPort: 4369
- name: cluster-comm
containerPort: 25672
command: ["/bin/sh", "-c"]
args:
- |
# 1. 生成并验证 Cookie 文件(权限已正常)
rm -rf /var/lib/rabbitmq/.erlang.cookie
echo "$ERLANG_COOKIE_VALUE" > /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie
chown 999:999 /var/lib/rabbitmq/.erlang.cookie
# 2. 自动查找 rabbitmq-server 实际路径(关键步骤)
echo "=== 正在查找 rabbitmq-server 实际路径 ==="
RABBITMQ_SERVER_PATH=$(find / -name rabbitmq-server 2>/dev/null | head -n 1)
echo "找到的路径:$RABBITMQ_SERVER_PATH"
# 3. 验证路径是否存在
if [ -z "$RABBITMQ_SERVER_PATH" ] || [ ! -x "$RABBITMQ_SERVER_PATH" ]; then
echo "ERROR:未找到可执行的 rabbitmq-server 命令!"
exit 1
fi
echo "=== 路径验证通过,开始启动服务 ==="
# 4. 用找到的实际路径启动服务
$RABBITMQ_SERVER_PATH --user rabbitmq
volumeMounts:
- name: rbmq-data
mountPath: /var/lib/rabbitmq
- name: rabbitmq-config-volume
mountPath: /etc/rabbitmq/
resources:
requests:
cpu: "1.5"
memory: "3Gi"
limits:
cpu: "2"
memory: "4Gi"
securityContext:
allowPrivilegeEscalation: true
privileged: false
restartPolicy: Always
serviceAccountName: rabbitmq-cluster
terminationGracePeriodSeconds: 60
volumes:
- name: rabbitmq-config-volume
configMap:
name: bpae-rabbitmq-config
volumeClaimTemplates:
- metadata:
name: rbmq-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-client
resources:
requests:
storage: 20Gi
---
# NodePort Service 不变
apiVersion: v1
kind: Service
metadata:
name: bpae-rabbitmq-nodeport
namespace: rq
labels:
appname: rabbitmq
app: bpae-rabbitmq
spec:
ports:
- name: amqp
port: 5672
targetPort: amqp
nodePort: 30567
- name: http
port: 15672
targetPort: http
nodePort: 31672
- name: epmd
port: 4369
targetPort: epmd
- name: cluster-comm
port: 25672
targetPort: cluster-comm
selector:
app: bpae-rabbitmq
type: NodePort
检查 Pod 状态(等待 3 个 Pod 均为Running/1/1)
kubectl get pods -n rq -l app=bpae-rabbitmq -w
验证集群状态(确认 3 个节点组成集群)
kubectl exec -it bpae-rabbitmq-0 -n rq -- /opt/rabbitmq/sbin/rabbitmqctl cluster_status
配置高可用队列(避免单点故障)
# 在主节点执行(配置所有队列自动镜像到所有节点)
kubectl exec -it bpae-rabbitmq-0 -n rq -- /opt/rabbitmq/sbin/rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all", "ha-sync-mode":"automatic"}'
验证管理界面
http://IP:15672 账号/密码:xx/xx
更多推荐
所有评论(0)