kubebetes 搭建rocketmq集群
一、基本知识简要说明
RocketMQ主要有四大组成部分:NameServer、Broker、Producer、Consumer。
Nameserver作用:
NameServer 可以说是 Broker 的注册中心,Broker 在启动的时候,会根据配置信息向所有的 NameServer 进行注册,NameServer 会和每次前来注册的 Broker 保持长连接,并每 30s 检查 Broker 是否还存活,对于宕机的 Broker,NameServer 会将其从列表中剔除。当生产者需要向 Broker 发送消息的时候,就会先从 NameServer 里面获取 Broker 的地址列表,然后负载均衡,选择一台消息服务器进行发送。
RocketMQ的部署方式有多种:
- 2m-noslave: 多Master模式,无Slave。[双主模式]
- 2m-2s-sync: 多Master多Slave模式,同步双写 [双主双从+同步模式]
- 2m-2s-async:多Master多Slave模式,异步复制 [双主双从+异步模式]
RocketMQ 提供了三种方式发送消息:同步、异步和单向:
- 同步发送: 指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。
- 异步发送: 指发送方发出数据后,不等接收方发回响应,接着发送下个数据包, 异步方式也需要Broker返回确认信息。
- 单向发送: 指只负责发送消息而不等待服务器回应且没有回调函数触发。
RocketMQ 三种消息发送模式的使用场景:
具体使用哪种模式,这主要是看应用场景。
- 同步发送:主要运用在比较重要一点消息传递/通知等业务:
- 异步发送:通常用于对发送消息响应时间要求更高/更快的场景:
- 单向发送:适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集。只发送消息,不等待服务器响应,只发送请求不等待应答。此方式发送消息的过程耗时非常短,一般在微秒级别。
RocketMQ端口:
- rocketmq 默认端口:9876(即nameserver端口)
- 非vip通道端口:10911
- vip通道端口:10909
- 10909是VIP通道对应的端口,在JAVA中的消费者对象或者是生产者对象中关闭VIP通道即可无需开放10909端口
本案例部署的是RocketMQ的"双主双从+同步模式",涉及6个pod:
- broker-a 主1
- broker-b 主2
- broker-a-s 从1
- broker-a-s 从2
- NameServer(注册中心)
- rocketmq-externals(可视化web界面)
二、部署过程记录
1、使用NFS配置StatefulSet的动态持久化存储 StatefulSet使用volumeClaimTemplates
1.1)在NFS服务器端(172.16.60.238)通过nfs创建rocketmq的共享目录
[root@k8s-harbor01 ~]# mkdir -p /data/storage/k8s/rocketmq
使用NFS作为StatefulSet持久化存储的操作记录,分别需要创建nfs-provisioner的rbac、storageclass、nfs-client-provisioner和statefulset的pod。
1.2)创建nfs的rbac
[root@k8s-master01 ~]# mkdir -p /opt/k8s/k8s_project/rocketmq
[root@k8s-master01 ~]# cd /opt/k8s/k8s_project/rocketmq
[root@k8s-master01 rocketmq]#
[root@k8s-master01 rocketmq]# vim nfs-rbac.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: wiseco
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-runner
namespace: wiseco
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get","create","list", "watch","update"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: wiseco
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
创建并查看:
[root@k8s-master01 rocketmq]# kubectl apply -f nfs-rbac.yaml
serviceaccount/nfs-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner created
[root@k8s-master01 rocketmq]# kubectl get sa -n wiseco|grep nfs
nfs-provisioner 1 5s
[root@k8s-master01 rocketmq]# kubectl get clusterrole -n wiseco|grep nfs
nfs-provisioner-runner 2021-01-28T08:15:49Z
[root@k8s-master01 rocketmq]# kubectl get clusterrolebinding -n wiseco|grep nfs
run-nfs-provisioner ClusterRole/nfs-provisioner-runner
1.3)创建rocketmq集群的storageclass
[root@k8s-master01 rocketmq]# vim rocketmq-nfs-class.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: rocketmq-nfs-storage
namespace: wiseco
provisioner: rocketmq/nfs
reclaimPolicy: Retain
查看并创建
[root@k8s-master01 rocketmq]# kubectl apply -f rocketmq-nfs-class.yaml
storageclass.storage.k8s.io/rocketmq-nfs-storage created
[root@k8s-master01 rocketmq]# kubectl get sc -n wiseco
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rocketmq-nfs-storage rocketmq/nfs Retain Immediate false 2s
1.4)创建rocketmq集群的nfs-client-provisioner PROVISIONER_NAME的值一定要和StorageClass中的provisioner相等。
[root@k8s-master01 rocketmq]# ll
total 8
-rw-r--r-- 1 root root 1216 Jan 28 16:15 nfs-rbac.yaml
-rw-r--r-- 1 root root 161 Jan 28 16:19 rocketmq-nfs-class.yaml
[root@k8s-master01 rocketmq]# vim rocketmq-nfs.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rocketmq-nfs-client-provisioner
namespace: wiseco
spec:
replicas: 1
selector:
matchLabels:
app: rocketmq-nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: rocketmq-nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: rocketmq-nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: rocketmq/nfs
- name: NFS_SERVER
value: 172.16.60.238
- name: NFS_PATH
value: /data/storage/k8s/rocketmq
volumes:
- name: nfs-client-root
nfs:
server: 172.16.60.238
path: /data/storage/k8s/rocketmq
查看并创建
[root@k8s-master01 rocketmq]# kubectl apply -f rocketmq-nfs.yml
deployment.apps/rocketmq-nfs-client-provisioner created
[root@k8s-master01 rocketmq]# kubectl get pods -n wiseco|grep nfs
rocketmq-nfs-client-provisioner-59d8bbd947-kz59r 1/1 Running 0 4s
2、创建RocketMQ集群(双主双从同步模式)
本案例采用jdk1.8.0_192的基础镜像
[root@k8s-master01 rocketmq]# ll
total 12
-rw-r--r-- 1 root root 1216 Feb 1 11:11 nfs-rbac.yaml
-rw-r--r-- 1 root root 161 Feb 1 11:12 rocketmq-nfs-class.yaml
-rw-r--r-- 1 root root 1027 Feb 1 11:12 rocketmq-nfs.yml
[root@k8s-master01 rocketmq]# mkdir image
[root@k8s-master01 rocketmq]# cd image
[root@k8s-master01 image]# mkdir rocketmq_image
[root@k8s-master01 image]# cd rocketmq_image
[root@k8s-master01 rocketmq_image]#
2.1)制作rocketmq的image镜像 rocketmq下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/
需要注意一点:pod可能会启动报错:/usr/local/rocketmq-4.8.0/bin/runbroker.sh: line 90: 18 Killed JAVA{JAVA_OPT}
将
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
改为
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
rocketmq镜像制作过程:
[root@k8s-master01 rocketmq_image]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip
[root@k8s-master01 rocketmq_image]# ll
total 13564
-rw-r--r-- 1 root root 339 Feb 2 11:52 Dockerfile
-rw-r--r-- 1 root root 13881969 Dec 19 19:54 rocketmq-all-4.8.0-bin-release.zip
由于ADD指令只能解压tar包,所以这里将zip包调整为tar包
[root@k8s-master01 rocketmq_image]# unzip rocketmq-all-4.8.0-bin-release.zip
[root@k8s-master01 rocketmq_image]# ll
total 13564
-rw-r--r-- 1 root root 339 Feb 2 11:52 Dockerfile
drwxr-xr-x 6 root root 103 Dec 9 19:46 rocketmq-all-4.8.0-bin-release
-rw-r--r-- 1 root root 13881969 Dec 19 19:54 rocketmq-all-4.8.0-bin-release.zip
将runbroker.sh脚本文件里的内存设置调整小点
[root@k8s-master01 rocketmq_image]# vim rocketmq-all-4.8.0-bin-release/bin/runbroker.sh
.........
.........
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
.........
.........
[root@k8s-master01 rocketmq_image]# tar -zvcf rocketmq-all-4.8.0-bin-release.tar.gz rocketmq-all-4.8.0-bin-release
[root@k8s-master01 rocketmq_image]# rm -rf rocketmq-all-4.8.0-bin-release rocketmq-all-4.8.0-bin-release.zip
[root@k8s-master01 rocketmq_image]# ll
total 13508
-rw-r--r-- 1 root root 278 Feb 2 10:38 Dockerfile
-rw-r--r-- 1 root root 13827784 Feb 2 11:27 rocketmq-all-4.8.0-bin-release.tar.gz
Dockerfile镜像文件内容:
[root@k8s-master01 rocketmq_image]# cat Dockerfile
FROM 172.16.60.238/wiseco/jdk1.8.0_192
RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
ENV LANG en_US.UTF-8
ADD rocketmq-all-4.8.0-bin-release.tar