写点什么

持续优化,欣欣向云 | RocketMQ Operator 0.3.0 正式发布

  • 2022-11-09
    浙江
  • 本文字数:5756 字

    阅读完需:约 19 分钟

1.jpeg


本文作者:蔡高扬,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 负责部署和管理这些模块。


2.png


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-operatorNAME                                 READY   STATUS    RESTARTS   AGErocketmq-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/v1alpha1kind: NameServicemetadata:  name: name-servicespec:  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: v1kind: ConfigMapmetadata: name: broker-configdata: 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/v1alpha1kind: Brokermetadata: # name of broker cluster name: brokerspec: 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 -owideNAME                                 READY   STATUS    RESTARTS   AGE   IP            NODE                       NOMINATED NODE   READINESS GATESbroker-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 #ACTIVATEDbroker 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 truebroker 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 falsebroker 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 truebroker 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.zipunzip 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.ProducerSendResult [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.ConsumerConsumer 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(兴趣小组)等你加入,欢迎立志打造世界级分布式系统的同学加入社区,添加社区开发者微信:rock​etmq666 即可进群,参与贡献,打造下一代消息、事件、流融合处理平台。


3.jpeg


微信扫码添加小火箭进群


另外还可以加入钉钉群与 RocketMQ 爱好者一起广泛讨论:


4.png


钉钉扫码加群


关注「Apache RocketMQ」公众号获取更多技术干货

发布于: 刚刚阅读数: 4
用户头像

阿里巴巴云原生 2019-05-21 加入

还未添加个人简介

评论

发布
暂无评论
持续优化,欣欣向云 | RocketMQ Operator 0.3.0 正式发布_阿里云_阿里巴巴云原生_InfoQ写作社区