云原生時代RocketMQ運(yùn)維管控的利器RocketMQOperator有什么用

這篇文章主要介紹了云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元德江做網(wǎng)站,已為上家服務(wù),為德江各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

1. RocketMQ

2012~2013 年期間,阿里巴巴中間件團(tuán)隊(duì)自主研發(fā)并對外開源了第三代分布式消息引擎 RocketMQ,其高性能、低延遲、抗堆積的特性穩(wěn)定支撐了阿里巴巴 雙11 萬億級數(shù)據(jù)洪峰業(yè)務(wù),其云產(chǎn)品 Aliware MQ 在微服務(wù)、流計(jì)算、IoT、異步解耦、數(shù)據(jù)同步等無數(shù)工況場景大放異彩。

2016 年,阿里巴巴向 Apache 軟件基金會捐贈了 RocketMQ。次年,RocketMQ 順利從基金會畢業(yè),成為 Apache 頂級開源項(xiàng)目,與 Apache Hadoop,Apache Spark 一起為全球分布式、大數(shù)據(jù)領(lǐng)域的開發(fā)者帶來福音。然而,在云原生時代的今天,RocketMQ 作為有狀態(tài)的分布式服務(wù)系統(tǒng),如何在大規(guī)模集群上做到極簡運(yùn)維,則是一個極具挑戰(zhàn)和價值的問題。

RocketMQ 支持多種部署方式,以基本的雙主雙從架構(gòu)為例,如下圖所示。

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

RocketMQ 雙主雙從架構(gòu)

這里面包括了一共 7 個 RocketMQ 服務(wù)實(shí)例:3 個 name server 實(shí)例,2 個 master broker 實(shí)例,以及 2 個 slave broker 實(shí)例。

傳統(tǒng)的部署方式需要手動或編寫腳本在每個節(jié)點(diǎn)上進(jìn)行環(huán)境和文件配置。此外,隨著用戶業(yè)務(wù)的增加,存在對集群進(jìn)行無縫擴(kuò)容等需求。傳統(tǒng)方式是運(yùn)維人員訪問不同節(jié)點(diǎn),依賴操作手冊和腳本按步驟進(jìn)行操作來完成,耗費(fèi)人力,且存在誤操作的可能。一些公司可能會使用一些平臺和工具如 Ansible 來幫助自動化運(yùn)維,此外越來越多的公司開始集成和使用基于 Kubernetes 的云原生生態(tài)。

使用 Kubernetes 提供的 Deployment 和 StatefulSet 等原生資源可以很好地解決無狀態(tài)應(yīng)用的管理問題,但對于數(shù)據(jù)庫和 RocketMQ 這類有狀態(tài)應(yīng)用,則存在很多局限性。例如對 RocketMQ 來說擴(kuò)容不僅僅是拉起新的實(shí)例 Pod 就完成了,還需要同步復(fù)制 Broker 的狀態(tài)信息包括 Topic 信息和訂閱關(guān)系這些元數(shù)據(jù),同時要正確配置新 Broker 的 config 參數(shù),包括 brokerName 和 NameServer IP List 等,才能使得新擴(kuò)容的 Broker 可用,而這些僅僅靠用戶編寫 StatefulSet,修改 size 或 replicas 然后 apply 是無法做到的。

實(shí)際上 Kubernetes 開發(fā)人員也發(fā)現(xiàn)了這些問題,因此引入了自定義資源和控制器的概念,讓開發(fā)人員可以直接用 Go 語言調(diào)用 Kubernetes API,編寫自定義資源和對應(yīng)的控制器邏輯來解決復(fù)雜有狀態(tài)應(yīng)用的管理問題,提供特定應(yīng)用相關(guān)的自定義資源的這類代碼組件稱之為 Operator。由具備 RocketMQ 領(lǐng)域知識的專家編寫 Operator,屏蔽了應(yīng)用領(lǐng)域的專業(yè)知識,讓用戶只需要關(guān)心和定義希望達(dá)到的集群終態(tài),這也是 Kubernetes 聲明式 API 的設(shè)計(jì)哲學(xué)。

2. Kubernetes Operator

Operator 是在 Kubernetes 基礎(chǔ)上通過擴(kuò)展 Kubernetes API,用來創(chuàng)建、配置和管理復(fù)雜的有狀態(tài)應(yīng)用,如分布式數(shù)據(jù)庫等。Operator 基于 Kubernetes 1.7 版本以來引入的自定義控制器的概念,在自定義資源和控制器之上構(gòu)建,同時又包含了應(yīng)用程序特定的領(lǐng)域知識。實(shí)現(xiàn)一個 Operator 的關(guān)鍵是 CRD(自定義資源)和 Controller(控制器)的設(shè)計(jì)。

Operator 站在 Kubernetes 內(nèi)部視角,為應(yīng)用的云原生化打開了新世界的大門。自定義資源可以讓開發(fā)人員擴(kuò)展添加新功能,更新現(xiàn)有的功能,并且可以自動執(zhí)行一些管理任務(wù),這些自定義的控制器就像 Kubernetes 原生的組件一樣,Operator 可以直接使用 Kubernetes API 進(jìn)行開發(fā),也就是說他們可以根據(jù)這些控制器編寫的自定義規(guī)則來創(chuàng)建和更改 Pods / Services、對正在運(yùn)行的應(yīng)用進(jìn)行擴(kuò)縮容。

快速開始

本文使用 RocketMQ Operator 0.2.1 版本,展示如何使用 RocketMQ Operator 在 Kubernetes 上快速創(chuàng)建部署一個 RocketMQ 服務(wù)集群。

  • 準(zhǔn)備好 K8s 環(huán)境,可以使用 docker desktop 自帶的 K8s,或者 minikube;

  • 克隆 rocketmq-operator 倉庫到你的 K8s 節(jié)點(diǎn)上;

$ git clone https://github.com/apache/rocketmq-operator.git
$ cd rocketmq-operator
  • 運(yùn)行腳本安裝 RocketMQ Operator;  

$ ./install-operator.sh
  • 檢查下 RocketMQ Operator 是否安裝成功

$ kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
rocketmq-operator-564b5d75d-jllzk         1/1     Running   0          108s

成功安裝時,rocketmq-operator pod 處于類似上面例子的 running 狀態(tài)。

  • 應(yīng)用 Broker 和 NameService 自定義資源,創(chuàng)建 RocketMQ 集群;

應(yīng)用 rocketmq-operator / example 中的 rocketmq_v1alpha1_rocketmq_cluster.yaml 文件,快速部署一個 RocketMQ 集群。rocketmq_v1alpha1_rocketmq_cluster.yaml 文件內(nèi)容如下:

apiVersion: rocketmq.apache.org/v1alpha1
kind: Broker
metadata:
  # name of broker cluster
  name: broker
spec:
  # size is the number of the broker cluster, each broker cluster contains a master broker and [replicaPerGroup] replica brokers.
  size: 1
  # nameServers is the [ip:port] list of name service
  nameServers: ""
  # replicationMode is the broker replica sync mode, can be ASYNC or SYNC
  replicationMode: ASYNC
  # replicaPerGroup is the number of each broker cluster
  replicaPerGroup: 1
  # brokerImage is the customized docker image repo of the RocketMQ broker
  brokerImage: apacherocketmq/rocketmq-broker:4.5.0-alpine
  # imagePullPolicy is the image pull policy
  imagePullPolicy: Always
  # resources describes the compute resource requirements and limits
  resources:
    requests:
      memory: "2048Mi"
      cpu: "250m"
    limits:
      memory: "12288Mi"
      cpu: "500m"
  # allowRestart defines whether allow pod restart
  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-[broker group number]-master-0
  scalePodName: broker-0-master-0
  # volumeClaimTemplates defines the storageClass
  volumeClaimTemplates:
    - metadata:
        name: broker-storage
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: rocketmq-storage
        resources:
          requests:
            storage: 8Gi
---
apiVersion: rocketmq.apache.org/v1alpha1
kind: NameService
metadata:
  name: name-service
spec:
  # size is the the name service instance number of the name service cluster
  size: 1
  # nameServiceImage is the customized docker image repo of the RocketMQ name service
  nameServiceImage: apacherocketmq/rocketmq-nameserver:4.5.0-alpine
  # imagePullPolicy is the image pull policy
  imagePullPolicy: Always
  # hostNetwork can be true or false
  hostNetwork: true
  #  Set DNS policy for the pod.
  #  Defaults to "ClusterFirst".
  #  Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.
  #  DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.
  #  To have DNS options set along with hostNetwork, you have to specify DNS policy
  #  explicitly to 'ClusterFirstWithHostNet'.
  dnsPolicy: ClusterFirstWithHostNet
  # resources describes the compute resource requirements and limits
  resources:
    requests:
      memory: "512Mi"
      cpu: "250m"
    limits:
      memory: "1024Mi"
      cpu: "500m"
  # 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
        storageClassName: rocketmq-storage
        resources:
          requests:
            storage: 1Gi

注意到這個例子中 storageMode: EmptyDir,表示存儲使用的是 EmptyDir,數(shù)據(jù)會隨著 Pod 的刪除而抹去,因此該方式僅供開發(fā)測試時使用。一般使用 HostPath 或 StorageClass 來對數(shù)據(jù)進(jìn)行持久化存儲。使用 HostPath 時,需要配置 hostPath,聲明宿主機(jī)上掛載的目錄。使用 storageClass 時,需要配置 volumeClaimTemplates,聲明 PVC 模版。具體可參考 RocketMQ Operator 文檔。

應(yīng)用上面的 yaml 文件,輸入命令:

$ kubectl apply -f example/rocketmq_v1alpha1_rocketmq_cluster.yaml
broker.rocketmq.apache.org/broker created
nameservice.rocketmq.apache.org/name-service created

查看集群 Pod 狀態(tài):

$ kubectl get pods -owide
NAME                                 READY   STATUS    RESTARTS   AGE     IP             NODE             NOMINATED NODE   READINESS GATES
broker-0-master-0                    1/1     Running   0          27s     10.1.2.27      docker-desktop   <none>           <none>
broker-0-replica-1-0                 1/1     Running   0          27s     10.1.2.28      docker-desktop   <none>           <none>
name-service-0                       1/1     Running   0          27s     192.168.65.3   docker-desktop   <none>           <none>
rocketmq-operator-76b4b9f4db-x52mz   1/1     Running   0          3h35m   10.1.2.17      docker-desktop   <none>           <none>

使用默認(rèn)的 rocketmq_v1alpha1_rocketmq_cluster.yaml 文件配置,我們看到集群中拉起了 1 個 name server 服務(wù)(name-service-0)和 2 個 broker 服務(wù)(1 主 1 從)。

好啦!到這里你已經(jīng)成功通過 Operator 提供的自定義資源部署了一個 RocketMQ 服務(wù)集群。

  • 訪問這個 RocketMQ 集群中的 Pod 來驗(yàn)證集群是否能正常工作;

使用 RocketMQ 的 tools.sh 腳本運(yùn)行 Producer example:

$ kubectl exec -it broker-0-master-0 bash
bash-4.4# sh ./tools.sh org.apache.rocketmq.example.quickstart.Producer
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
06:56:29.145 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
SendResult [sendStatus=SEND_OK, msgId=0A0102CF007778308DB1206383920000, offsetMsgId=0A0102CF00002A9F0000000000000000, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-0, queueId=0], queueOffset=0]
...
06:56:51.120 [NettyClientSelector_1] INFO  RocketmqRemoting - closeChannel: close the connection to remote address[10.1.2.207:10909] result: true
bash-4.4#

在另一個節(jié)點(diǎn)上運(yùn)行 Consumer example:

$ kubectl exec -it name-service-0 bash
bash-4.4# sh ./tools.sh org.apache.rocketmq.example.quickstart.Consumer
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
07:01:32.077 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
Consumer Started.
ConsumeMessageThread_1 Receive New Messages: [MessageExt [queueId=0, storeSize=273, queueOffset=19845, sysFlag=0, bornTimestamp=1596768410268, bornHost=/30.4.165.204:53450, storeTimestamp=1596768410282, storeHost=/100.81.180.84:10911, msgId=6451B45400002A9F000014F96A0D6C65, commitLogOffset=23061458676837, bodyCRC=532471758, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=19844, TRACE_ON=true, eagleTraceId=1e04a5cc15967684102641001d0db0, MAX_OFFSET=19848, MSG_REGION=DefaultRegion, CONSUME_START_TIME=1596783715858, UNIQ_KEY=1E04A5CC0DB0135FBAA421365A5F0000, WAIT=true, TAGS=TagA, eagleRpcId=9.1}, body=[72, 101, 108, 108, 111, 32, 77, 101, 116, 97, 81, 32, 48], transactionId='null'}]] 
ConsumeMessageThread_4 Receive New Messages: [MessageExt [queueId=1, storeSize=273, queueOffset=19637, sysFlag=0, bornTimestamp=1596768410296, bornHost=/30.4.165.204:53450, storeTimestamp=1596768410298, storeHost=/100.81.180.84:10911, msgId=6451B45400002A9F000014F96A0D7141, commitLogOffset=23061458678081, bodyCRC=1757146968, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=19636, TRACE_ON=true, eagleTraceId=1e04a5cc15967684102961002d0db0, MAX_OFFSET=19638, MSG_REGION=DefaultRegion, CONSUME_START_TIME=1596783715858, UNIQ_KEY=1E04A5CC0DB0135FBAA421365AB80001, WAIT=true, TAGS=TagA, eagleRpcId=9.1}, body=[72, 101, 108, 108, 111, 32, 77, 101, 116, 97, 81, 32, 49], transactionId='null'}]]
...
  • 刪除集群,清理環(huán)境;

清除 RocketMQ 服務(wù)集群實(shí)例:

$ kubectl delete -f example/rocketmq_v1alpha1_rocketmq_cluster.yaml

清除 RocketMQ Operator:

$ ./purge-operator.sh

按照 OperatorHub 官網(wǎng)指導(dǎo)安裝 RocketMQ Operator

  • 在 OperatorHub.io 網(wǎng)頁搜索 RocketMQ Operator;

選擇 Streaming & Messaging 類別,點(diǎn)擊 RocketMQ Operator:

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

  • 進(jìn)入 RocketMQ Operator 頁面,點(diǎn)擊 Install 按鈕;

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

  • 按照說明安裝 OLM 和 RocketMQ Operator;

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

本地安裝 OLM 來使用 RocketMQ Operator

  • 本地安裝和動 OLM(Operator Lifecycle Manager) console;

參考:OLM 安裝文檔。

  • 本地啟動 UI 界面控制臺;

$ make run-console-local
  • 訪問 http://localhost:9000 查看控制臺;

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

OperatorHub

  • 搜索 RocketMQ 或點(diǎn)擊 All Items 分類中的 Streaming & Messaging,找到 RocketMQ Operator 并進(jìn)行安裝;

  • 安裝完 RocketMQ Operator 后可以在 Installed Operators 中找到 RocketMQ Operator;

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

已安裝的 Operators 界面

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

RocketMQ Operator 介紹界面

云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用

通過 UI 界面創(chuàng)建 NameService 自定義資源

可以在 UI 中創(chuàng)建指定 Namespace 下的 NameService 和 Broker 實(shí)例,并對已創(chuàng)建的實(shí)例進(jìn)行瀏覽和管理。我們也可以通過命令查看當(dāng)前 K8s 集群中的 Pod 狀態(tài),例如:

$ kubectl get pods -A
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
docker        compose-78f95d4f8c-8fr5z                        1/1     Running   0          32h
docker        compose-api-6ffb89dc58-nv9rh                    1/1     Running   0          32h
kube-system   coredns-5644d7b6d9-hv6r5                        1/1     Running   0          32h
kube-system   coredns-5644d7b6d9-mkqb6                        1/1     Running   0          32h
kube-system   etcd-docker-desktop                             1/1     Running   0          32h
kube-system   kube-apiserver-docker-desktop                   1/1     Running   0          32h
kube-system   kube-controller-manager-docker-desktop          1/1     Running   1          32h
kube-system   kube-proxy-snmxh                                1/1     Running   0          32h
kube-system   kube-scheduler-docker-desktop                   1/1     Running   1          32h
kube-system   storage-provisioner                             1/1     Running   1          32h
kube-system   vpnkit-controller                               1/1     Running   0          32h
marketplace   broker-0-master-0                               1/1     Running   0          5h4m
marketplace   broker-0-replica-1-0                            1/1     Running   0          5h4m
marketplace   name-service-0                                  1/1     Running   0          5h4m
marketplace   marketplace-operator-69756457d8-42chk           1/1     Running   0          32h
marketplace   rocketmq-operator-0.2.1-c9fffb5f-cztcl          1/1     Running   0          32h
marketplace   rocketmq-operator-84c7bb4ddc-7rvqr              1/1     Running   0          32h
marketplace   upstream-community-operators-5b79db455f-7t47w   1/1     Running   1          32h
olm           catalog-operator-7b788c597d-gjz55               1/1     Running   0          32h
olm           olm-operator-946bd977f-dhszg                    1/1     Running   0          32h
olm           operatorhubio-catalog-fvxp9                     1/1     Running   0          32h
olm           packageserver-789c7b448b-7ss7m                  1/1     Running   0          32h
olm           packageserver-789c7b448b-lfxrw                  1/1     Running   0          32h

可以看到在 marketplace 這個 namespace 中也成功創(chuàng)建了對應(yīng)的 name server 和 broker 實(shí)例。

以上是基于 OperatorHub 和 OLM 安裝使用 RocketMQ Operator 的案例,我們將持續(xù)推送和維護(hù)新版本的 RocketMQ Operator 至該平臺,方便用戶獲取最新更新或選擇合適的 Operator 版本。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“云原生時代RocketMQ 運(yùn)維管控的利器RocketMQ Operator有什么用”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

新聞名稱:云原生時代RocketMQ運(yùn)維管控的利器RocketMQOperator有什么用
分享鏈接:http://bm7419.com/article44/gocjhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、域名注冊品牌網(wǎng)站建設(shè)、網(wǎng)站收錄服務(wù)器托管、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管