持续优化,欣欣向云 | RocketMQ Operator 0.3.0 正式发布
本文作者:蔡高扬,Apache RocketMQ Committer, 阿里云智能技术专家。
近期,RocketMQ Operator[1] 正式发布 0.3.0 版本,该版本包含了哪些特性与优化?让我们一探究竟。
镜像地址:
apache/rocketmq-operator:0.3.0
OperatorHub地址:
https://operatorhub.io/operator/rocketmq-operator
重点特性
ISSUE #39 支持 RocketMQ Dashboard 部署
@liuruiyiyang
将 RocketMQ Dashboard[2] 纳入RocketMQ Operator 管控,支持一键部署并管理 RocketMQ Dashboard,方便用户对 RocketMQ 进行白屏化管理。
ISSUE #84 JVM参数生成适配容器化部署
@overstep123
RocketMQ 镜像的启动脚本中能根据实际的CPU、内存资源生成 JVM 启动参数,但计算资源时取的是宿主机的数据,通过 Kubernetes resources 设置的资源配额无法感知。在该 ISSUE 中,优化为先获取 cgroup 中的CPU、内存配额,如能获取到数据且不超出宿主机的资源大小,则以 cgroup 中的数据为准生成 JVM 启动参数。
ISSUE #96 operator-sdk 版本升级
@gobbq
operator-sdk 是 RocketMQ Operator 的基础代码与构建框架,先前使用的 0.11.x 版本已不再兼容,社区也有反馈使用现行 operator-sdk 无法构建,影响开发活动,因此将其升级为 1.16 版本。此外更新 apiextensions.k8s.io/v1beta1 等已废弃的 API 版本,使得 RocketMQ Operator 支持 Kubernetes v1.22及以上版本。
ISSUE #105 支持从 Kubernetes 集群外部访问
@shangjin92
Kubernetes 集群中的 RocketMQ 默认只能从集群中的 Pod 访问。为了使 Kubernetes 集群外的应用可使用 RocketMQ,扩展 Name Service CRD、Broker CRD 支持 hostNetwork,同时 Broker 向 Name Server 注册时使用 Node IP。外部应用访问 Name Server 的地址配置为 Name Server 所在的 Node IP,即可获取 Broker 的Node IP 从而访问到 Broker。
更多的特性或bugfix可查阅release notes[3]。
在这里对大家的贡献表示感谢,希望大家继续参与到新版本的贡献中。
使用 RocketMQ Operator 快速部署 RocketMQ 集群
接下来,我们使用 RocketMQ Operator 0.3.0 版本,展示如何在 Kubernetes 集群中快速创建部署一个 RocketMQ 服务集群,并支持应用从 Kubernetes 集群外访问。
待部署的 RocketMQ 集群如下图所示:集群中包含2个 Name Server 和1个 Broker集群,Broker集群中包含2主2备,提供高可用服务。RocketMQ Operator 负责部署和管理这些模块。
1、准备好一套 K8s 集群,并在你的 K8s 节点上配置好 kubectl 连接信息。
2、克隆 rocketmq-operator 仓库到上一步的节点上
$ git clone --branch 0.3.0 https://github.com/apache/rocketmq-operator.git
$ cd rocketmq-operator
3、执行如下脚本安装 RocketMQ Operator
$ sh install-operator.sh
4、检查 RocketMQ Operator 是否安装成功
成功安装时,rocketmq-operator pod 处于 Running 状态:
$ kubectl get po | grep rocketmq-operator
NAME READY STATUS RESTARTS AGE
rocketmq-operator-84466597d4-jxhgd 1/1 Running 0 28s
5、构建用于 K8s 集群部署的 RocketMQ 5.0 镜像
$ (cd images/namesrv/alpine/ && sh build-namesrv-image.sh 5.0.0 )
$ (cd images/broker/alpine/ && sh build-broker-image.sh 5.0.0 )
6、apply CR 部署 RocketMQ 集群
执行 kubectl apply -f demo_cluster.yaml,快速部署一个RocketMQ集群。
demo_cluster.yaml 内容如下:
apiVersion: rocketmq.apache.org/v1alpha1
kind: NameService
metadata:
name: name-service
spec:
size: 2
nameServiceImage: apacherocketmq/rocketmq-nameserver:5.0.0-alpine-operator-0.3.0
imagePullPolicy: IfNotPresent
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
resources:
requests:
memory: "2Gi"
cpu: "1000m"
limits:
memory: "2Gi"
cpu: "2000m"
# storageMode can be EmptyDir, HostPath, StorageClass
storageMode: EmptyDir
# hostPath is the local path to store data
hostPath: /data/rocketmq/nameserver
# volumeClaimTemplates defines the storageClass
volumeClaimTemplates:
- metadata:
name: namesrv-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: ConfigMap
metadata:
name: broker-config
data:
broker-common.conf: |
BROKER_MEM: " -Xms2g -Xmx2g -Xmn1g "
flushDiskType=ASYNC_FLUSH
# set brokerRole to ASYNC_MASTER or SYNC_MASTER. DO NOT set to SLAVE because the replica instance will automatically be set!!!
brokerRole=ASYNC_MASTER
---
apiVersion: rocketmq.apache.org/v1alpha1
kind: Broker
metadata:
# name of broker cluster
name: broker
spec:
hostNetwork: true
# size is the number of the broker cluster, each broker cluster contains a master broker and [replicaPerGroup] replica brokers.
size: 2
# replicaPerGroup is the number of each broker cluster
replicaPerGroup: 1
brokerImage: apacherocketmq/rocketmq-broker:5.0.0-alpine-operator-0.3.0
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "4Gi"
cpu: "2000m"
limits:
memory: "4Gi"
cpu: "4000m"
allowRestart: true
# storageMode can be EmptyDir, HostPath, StorageClass
storageMode: EmptyDir
# hostPath is the local path to store data
hostPath: /data/rocketmq/broker
# scalePodName is [Broker name]-[broker group number]-master-0
scalePodName: broker-0-master-0
env:
- name: BROKER_MEM
valueFrom:
configMapKeyRef:
name: broker-config
key: BROKER_MEM
# volumes defines the broker.conf
volumes:
- name: broker-config
configMap:
name: broker-config
items:
- key: broker-common.conf
path: broker-common.conf
# volumeClaimTemplates defines the storageClass
volumeClaimTemplates:
- metadata:
name: broker-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 2Gi
上述例子仅供开发测试使用,因其 storageMode 的值配置为 EmptyDir,存储数据会随着 Pod 的删除而删除。在生产环境使用时,应使用 HostPath 或 StorageClass 挂载存储来持久化数据。两种配置的详细使用说明可参考 RocketMQ Operator 使用文档[4]。
7、查看 Pod 状态,可查看成功部署2个 Name Server,4个 Broker。由于这些 Pod 采用 Host Network,其 IP 与所在节点的 IP 相同。
# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
broker-0-master-0 1/1 Running 0 79s 172.16.0.23 172.16.0.23 <none> <none>
broker-0-replica-1-0 1/1 Running 0 79s 172.16.0.24 172.16.0.24 <none> <none>
broker-1-master-0 1/1 Running 0 79s 172.16.0.25 172.16.0.25 <none> <none>
broker-1-replica-1-0 1/1 Running 0 79s 172.16.0.251 172.16.0.251 <none> <none>
name-service-0 1/1 Running 0 79s 172.16.0.25 172.16.0.25 <none> <none>
name-service-1 1/1 Running 0 77s 172.16.0.23 172.16.0.23 <none> <none>
rocketmq-operator-84466597d4-jxhgd 1/1 Running 0 37m 172.16.0.22 172.16.0.251 <none> <none>
至此,RocketMQ Operator 已成功拉起一套 RocketMQ 集群。接下来我们对该集群进行检查。
- 查看集群状态
进入任意一个 Broker Pod,执行 sh mqadmin clusterlist 查看集群信息:
$ kubectl exec -it broker-0-master-0 -- sh
~/rocketmq/broker/bin # sh mqadmin clusterlist
#Cluster Name #Broker Name #BID #Addr #Version #InTPS(LOAD) #OutTPS(LOAD) #Timer(Progress) #PCWait(ms) #Hour #SPACE #ACTIVATED
broker broker-0 0 172.16.0.25:10911 V5_0_0 0.00(0,0ms) 0.00(0,0ms) 0-0(0.0w, 0.0, 0.0) 0 462803.97 0.1100 true
broker broker-0 1 172.16.0.24:10911 V5_0_0 0.00(0,0ms) 0.00(0,0ms) 2-0(0.0w, 0.0, 0.0) 0 462803.97 0.1200 false
broker broker-1 0 172.16.0.23:10911 V5_0_0 0.00(0,0ms) 0.00(0,0ms) 0-0(0.0w, 0.0, 0.0) 0 462803.97 0.1100 true
broker broker-1 1 172.16.0.251:10911 V5_0_0 0.00(0,0ms) 0.00(0,0ms) 2-0(0.0w, 0.0, 0.0) 0 462803.97 0.2200 false
在上图的例子中,可以见到有两组 Broker 集群,分别是 broker-0、broker-1,每组集群中,BID=0的是主节点,其余为备节点。
- 消息收发测试
在上述 K8s 集群之外的一台机器(需与 K8s 节点网络可达)中,安装 JDK 等依赖包,下载 RocketMQ 并解压:
$ yum -y install java-1.8.0-openjdk-devel unzip telnet
$ wget https://archive.apache.org/dist/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip
unzip rocketmq-all-5.0.0-bin-release.zip
设置 NAMESRV_ADDR 环境变量,其值为 Name Server 所在节点 IP:9876(本例子中取 172.16.0.25:9876)。
进入解压后的目录,运行 tools.sh 脚本启动示例 Producer 发送消息:
$ export NAMESRV_ADDR=172.16.0.25:9876
$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId=7F0000010C9B76ED55285BE804980000, offsetMsgId=AC10001900002A9F0000000000000000, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-0, queueId=0], queueOffset=0]
SendResult [sendStatus=SEND_OK, msgId=7F0000010C9B76ED55285BE804B70001, offsetMsgId=AC10001900002A9F00000000000000E7, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-0, queueId=1], queueOffset=0]
SendResult [sendStatus=SEND_OK, msgId=7F0000010C9B76ED55285BE804B90002, offsetMsgId=AC10001900002A9F00000000000001CE, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-0, queueId=2], queueOffset=0]
...
继续运行 tools.sh 脚本启动示例 Consumer,将打印刚才发送的消息:
$ sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
Consumer Started.
ConsumeMessageThread_please_rename_unique_group_name_4_1 Receive New Messages: [MessageExt [brokerName=broker-1, queueId=0, storeSize=231, queueOffset=0, sysFlag=0, bornTimestamp=1666095532223, bornHost=/172.16.0.38:43968, storeTimestamp=1666095532234, storeHost=/172.16.0.23:10911, msgId=AC10001700002A9F0000000000000000, commitLogOffset=0, bodyCRC=601994070, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, TRACE_ON=true, MAX_OFFSET=125, MSG_REGION=DefaultRegion, CONSUME_START_TIME=1666095549194, UNIQ_KEY=7F0000010C9B76ED55285BE804BF0004, CLUSTER=broker, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 52], transactionId='null'}]]
...
未来展望
下一步 RocketMQ Operator 将全面拥抱 RocketMQ 5.0,重点实现主备自主切换集群支持、Proxy部署、Container对等部署、Docker镜像与 rocketmq-docker 项目统一等特性,持续完善 RocketMQ Operator 。
欢迎大家使用RocketMQ Operator,提出宝贵建议,也可以通过调查问卷[5]方式向社区提供你的使用场景、期望特性等信息。
相关链接
[1] RocketMQ Operator项目:
https://github.com/apache/rocketmq-operator
[2] https://github.com/apache/rocketmq-dashboard
[3] Release Notes:
https://github.com/apache/rocketmq-operator/releases/tag/0.3.0
[4] https://github.com/apache/rocketmq-operator/blob/master/README.md
[5] https://github.com/apache/rocketmq-operator/issues/20
加入 Apache RocketMQ 社区
十年铸剑,Apache RocketMQ 的成长离不开全球接近 500 位开发者的积极参与贡献,相信在下个版本你就是 Apache RocketMQ 的贡献者,在社区不仅可以结识社区大牛,提升技术水平,也可以提升个人影响力,促进自身成长。
社区 5.0 版本正在进行着如火如荼的开发,另外还有接近 30 个 SIG(兴趣小组)等你加入,欢迎立志打造世界级分布式系统的同学加入社区,添加社区开发者微信:rocketmq666 即可进群,参与贡献,打造下一代消息、事件、流融合处理平台。
微信扫码添加小火箭进群
另外还可以加入钉钉群与 RocketMQ 爱好者一起广泛讨论:
钉钉扫码加群
关注「Apache RocketMQ」公众号获取更多技术干货