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

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-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(兴趣小组)等你加入,欢迎立志打造世界级分布式系统的同学加入社区,添加社区开发者微信:rock​etmq666 即可进群,参与贡献,打造下一代消息、事件、流融合处理平台。

3.jpeg

微信扫码添加小火箭进群

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

4.png

钉钉扫码加群

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

posted @ 2022-11-09 17:33  阿里云云原生  阅读(184)  评论(0编辑  收藏  举报