1. 程式人生 > 其它 >K8S部署RabbitMQ叢集 (映象模式) - 部署筆記

K8S部署RabbitMQ叢集 (映象模式) - 部署筆記

RabbitMQ 簡介

以熟悉的電商場景為例,如果商品服務和訂單服務是兩個不同的微服務,在下單的過程中訂單服務需要呼叫商品服務進行扣庫存操作。按照傳統的方式,下單過程要等到呼叫完畢之後才能返回下單成功,如果網路產生波動等原因使得商品服務扣庫存延遲或者失敗,會帶來較差的使用者體驗,如果在高併發的場景下,這樣的處理顯然是不合適的,那怎麼進行優化呢?這就需要訊息佇列登場了。 訊息佇列提供一個非同步通訊機制,訊息的傳送者不必一直等待到訊息被成功處理才返回,而是立即返回。訊息中介軟體負責處理網路通訊,如果網路連線不可用,訊息被暫存於隊列當中,當網路暢通的時候在將訊息轉發給相應的應用程式或者服務,當然前提是這些服務訂閱了該佇列。如果在商品服務和訂單服務之間使用訊息中介軟體,既可以提高併發量,又降低服務之間的耦合度。 RabbitMQ就是這樣一款我們苦苦追尋的訊息佇列。RabbitMQ是一個開源的訊息代理的佇列伺服器,用來通過普通協議在完全不同的應用之間共享資料。 RabbitMQ 的特點
開源、效能優秀,速度快,穩定性保障提供可靠性訊息投遞模式、返回模式與Spring AMQP完美整合,API豐富叢集模式豐富,表示式配置,HA模式,映象佇列模型保證資料不丟失的前提做到高可靠性、可用性 RabbitMQ 典型應用場景
  • 非同步處理:把訊息放入訊息中介軟體中,等到需要的時候再去處理。
  • 流量削峰:例如秒殺活動,在短時間內訪問量急劇增加,使用訊息佇列,當訊息佇列滿了就拒絕響應,跳轉到錯誤頁面,這樣就可以使得系統不會因為超負載而崩潰。
  • 日誌處理;(不過一般日誌處理都使用Kafka這種訊息佇列)
  • 應用解耦:假設某個服務A需要給許多個服務(B、C、D)傳送訊息,當某個服務(例如B)不需要傳送訊息了,服務A需要改程式碼再次部署;當新加入一個服務(服務E)需要服務A的訊息的時候,也需要改程式碼重新部署;另外服務A也要考慮其他服務掛掉,沒有收到訊息怎麼辦?要不要重新發送呢?是不是很麻煩,使用MQ釋出訂閱模式,服務A只生產訊息傳送到MQ,B、C、D從MQ中讀取訊息,需要A的訊息就訂閱,不需要了就取消訂閱,服務A不再操心其他的事情,使用這種方式可以降低服務或者系統之間的耦合。
RabbitMQ叢集節點之間是如何相互認證的:
  • 通過Erlang Cookie,相當於共享祕鑰的概念,長度任意,只要所有節點都一致即可。
  • rabbitmq server在啟動的時候,erlang VM會自動建立一個隨機的cookie檔案。cookie檔案的位置是/var/lib/rabbitmq/.erlang.cookie 或者 /root/.erlang.cookie,為保證cookie的完全一致,採用從一個節點copy的方式。
Erlang Cookie是保證不同節點可以相互通訊的金鑰,要保證叢集中的不同節點相互通訊必須共享相同的Erlang Cookie。具體的目錄存放在/var/lib/rabbitmq/.erlang.cookie。 說明:這就要從rabbitmqctl命令的工作原理說起,RabbitMQ底層是通過Erlang架構來實現的,所以rabbitmqctl會啟動Erlang節點,並基於Erlang節點來使用Erlang系統連線RabbitMQ節點,在連線過程中需要正確的Erlang Cookie和節點名稱,Erlang節點通過交換Erlang Cookie以獲得認證。

RabbitMQ叢集模式

  • 單機模式
  • 普通叢集模式(無高可用性)
  • 映象叢集模式(高可用性),最常用的叢集模式。
RabbitMQ叢集故障處理機制:
  • rabbitmq broker叢集允許個體節點down機,
  • 對應叢集的的網路分割槽問題( network partitions)
RabbitMQ叢集推薦用於LAN環境,不適用WAN環境; 要通過WAN連線broker,Shovel or Federation外掛是最佳的解決方案;Shovel or Federation不同於叢集。 RabbitMQ節點型別
  • RAM node:只儲存狀態到記憶體。記憶體節點將所有的佇列、交換機、繫結、使用者、許可權和vhost的元資料定義儲存在記憶體中,好處是可以使得像交換機和佇列宣告等操作更加的快速。
  • Disk node:將元資料儲存在磁碟中。單節點系統只允許磁碟型別的節點,防止重啟RabbitMQ的時候,丟失系統的配置資訊。
記憶體節點雖然不寫入磁碟,但是它執行比磁碟節點要好。RabbitMQ叢集中,只需要一個磁碟節點來儲存狀態就足夠了;如果叢集中只有記憶體節點,那麼不能停止它們,否則所有的狀態,訊息等都會丟失。 問題說明:
  • RabbitMQ要求在叢集中至少有一個磁碟節點,所有其他節點可以是記憶體節點,當節點加入或者離開叢集時,必須要將該變更通知到至少一個磁碟節點。
  • 如果叢集中唯一的一個磁碟節點崩潰的話,叢集仍然可以保持執行,但是無法進行其他操作(增刪改查),直到節點恢復。
解決方案:設定兩個磁碟節點,至少有一個是可用的,可以儲存元資料的更改。 RabbitMQ叢集的節點執行模式:
  • 為保證資料永續性,當前所有node節點跑在disk模式。
  • 如果今後壓力大,需要提高效能,考慮採用ram模式。
RabbitMQ叢集記錄 本案例採用 "映象模式",即佇列為映象佇列,佇列訊息存在叢集的每個節點上。 1、版本說明 因為考慮到較早版本rabbitmq在k8s上的叢集部署是使用autocluster外掛去呼叫kubernetes apiserver來獲取rabbitmq服務的endpoints,進而獲取node節點資訊,並自動加入叢集,但是現在autocluster已不再更新了,並且只支援3.6.x版本,故而放棄這種方式。 對於3.7.x或更新的版本,現在市場主流是使用 peer discovery subsystem來構建rabbitmq-cluster,參考這裡2、部署方式 在Kubernetes上搭建RabbitMQ有4種部署方法(IP模式、Pod與Server的DNS模式、Statefulset 與Headless Service模式、hostname模式),這裡選擇StatefulSet與Headless Service模式部署有狀態的RabbitMQ叢集。 3、使用NFS配置StatefulSet的動態持久化儲存 1)在NFS伺服器端(172.16.60.238)通過nfs建立RabbitMQ叢集的共享目錄
1 [root@k8s-harbor01 ~]# mkdir -p /data/storage/k8s/rabbitmq

  

2)建立nfs的rbac
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [root@k8s-master01 ~]# mkdir -p /opt/k8s/k8s_project/rabbitmq [root@k8s-master01 ~]# cd /opt/k8s/k8s_project/rabbitmq [root@k8s-master01 rabbitmq]# 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

檢視並建立

1 2 3 4 5 6 7 8 9 10 11 12 13 [root@k8s-master01 rabbitmq]# kubectl apply -f nfs-rbac.yaml serviceaccount/nfs-provisionercreated clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runnercreated clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisionercreated [root@k8s-master01 rabbitmq]# kubectl get sa -n wiseco|grep nfs nfs-provisioner 1 6h2m [root@k8s-master01 rabbitmq]# kubectl get clusterrole -n wiseco|grep nfs nfs-provisioner-runner 2021-02-07T03:30:56Z [root@k8s-master01 rabbitmq]# kubectl get clusterrolebinding -n wiseco|grep nfs run-nfs-provisioner ClusterRole/nfs-provisioner-runner6h2m

  

3)建立RabbitMQ叢集的storageclass
1 2 3 4 5 6 7 8 9 10 11 12 [root@k8s-master01 rabbitmq]# ll total 4 -rw-r--r-- 1 root root 1216 Feb 7 17:33 nfs-rbac.yaml [root@k8s-master01 rabbitmq]# vim rabbitmq-nfs-class.yaml apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: rabbitmq-nfs-storage namespace: wiseco provisioner: rabbitmq/nfs reclaimPolicy: Retain

檢視並建立

1 2 3 4 5 6 [root@k8s-master01 rabbitmq]# kubectl apply -f rabbitmq-nfs-class.yaml storageclass.storage.k8s.io/rabbitmq-nfs-storagecreated [root@k8s-master01 rabbitmq]# kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE rabbitmq-nfs-storage rabbitmq/nfsRetain Immediatefalse3s

  

4)建立MongoDB叢集的nfs-client-provisioner
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [root@k8s-master01 rabbitmq]# ll total 8 -rw-r--r-- 1 root root 1216 Feb 7 17:33 nfs-rbac.yaml -rw-r--r-- 1 root root 161 Feb 7 17:37 rabbitmq-nfs-class.yaml [root@k8s-master01 rabbitmq]# vim rabbitmq-nfs.yml apiVersion: apps/v1 kind: Deployment metadata: name: rabbitmq-nfs-client-provisioner namespace: wiseco spec: replicas: 1 selector: matchLabels: app: rabbitmq-nfs-client-provisioner strategy: type: Recreate template: metadata: labels: app: rabbitmq-nfs-client-provisioner spec: serviceAccount: nfs-provisioner containers: - name: rabbitmq-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: rabbitmq/nfs - name: NFS_SERVER value: 172.16.60.238 - name: NFS_PATH value:/data/storage/k8s/rabbitmq volumes: - name: nfs-client-root nfs: server: 172.16.60.238 path:/data/storage/k8s/rabbitmq

檢視並建立

1 2 3 4 5 [root@k8s-master01 rabbitmq]# kubectl apply -f rabbitmq-nfs.yml deployment.apps/rabbitmq-nfs-client-provisionercreated [root@k8s-master01 rabbitmq]# kubectl get pods -n wiseco|grep rabbitmq rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1/1Running 0 17s

  

4、部署RabbitMQ基於映象模式的叢集
1 2 3 4 5 6 7 8 [root@k8s-master01 rabbitmq]# ll total 12 -rw-r--r-- 1 root root 1216 Feb 7 17:33 nfs-rbac.yaml -rw-r--r-- 1 root root 161 Feb 7 17:37 rabbitmq-nfs-class.yaml -rw-r--r-- 1 root root 1027 Feb 7 17:46 rabbitmq-nfs.yml [root@k8s-master01 rabbitmq]# mkdir deployment [root@k8s-master01 rabbitmq]# cd deployment [root@k8s-master01 deployment]#

  

採用StatefulSet與Headless Service模式部署有狀態的RabbitMQ叢集。 rabbitmq.yml檔案內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 [root@k8s-master01 deployment]# vim rabbitmq.yml --- apiVersion: v1 kind: Service metadata: name: rabbitmq-management namespace: wiseco labels: app: rabbitmq spec: ports: - port: 15672 name: http selector: app: rabbitmq type: NodePort --- apiVersion: v1 kind: Service metadata: name: rabbitmq namespace: wiseco labels: app: rabbitmq spec: ports: - port: 5672 name: amqp - port: 4369 name: epmd - port: 25672 name: rabbitmq-dist clusterIP: None selector: app: rabbitmq --- apiVersion: apps/v1 kind: StatefulSet metadata: namespace: wiseco name: rabbitmq spec: serviceName:"rabbitmq" replicas: 3 selector: matchLabels: app: rabbitmq template: metadata: labels: app: rabbitmq spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key:"app" operator: In values: - rabbitmq topologyKey:"kubernetes.io/hostname" containers: - name: rabbitmq image: rabbitmq:3.7-rc-management lifecycle: postStart: exec: command: -/bin/sh - -c - > if[ -z"$(grep rabbitmq /etc/resolv.conf)"];then sed"s/^search \([^ ]\+\)/search rabbitmq.\1 \1/"/etc/resolv.conf >/etc/resolv.conf.new; cat/etc/resolv.conf.new >/etc/resolv.conf; rm/etc/resolv.conf.new; fi; untilrabbitmqctl node_health_check;dosleep1;done; if[ -z"$(rabbitmqctl cluster_status | grep rabbitmq-0)"];then touch/gotit rabbitmqctl stop_app; rabbitmqctl reset; rabbitmqctl join_cluster rabbit@rabbitmq-0; rabbitmqctl start_app; else touch/notget fi; env: - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: RABBITMQ_ERLANG_COOKIE value:"YZSDHWMFSMKEMBDHSGGZ" - name: RABBITMQ_NODENAME value:"rabbit@$(MY_POD_NAME)" ports: - name: http protocol: TCP containerPort: 15672 - name: amqp protocol: TCP containerPort: 5672 livenessProbe: tcpSocket: port: amqp initialDelaySeconds: 5 timeoutSeconds: 5 periodSeconds: 10 readinessProbe: tcpSocket: port: amqp initialDelaySeconds: 15 timeoutSeconds: 5 periodSeconds: 20 volumeMounts: - name: rabbitmq-data mountPath:/var/lib/rabbitmq volumeClaimTemplates: - metadata: name: rabbitmq-data annotations: volume.beta.kubernetes.io/storage-class:"rabbitmq-nfs-storage" spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi

  

檢視並建立

1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@k8s-master01 deployment]# kubectl apply -f rabbitmq.yml service/rabbitmq-managementcreated service/rabbitmqcreated statefulset.apps/rabbitmqcreated [root@k8s-master01 deployment]# kubectl get pods -n wiseco -o wide|grep rabbitmq rabbitmq-0 1/1Running 0 11m 172.30.85.206 k8s-node01 <none> <none> rabbitmq-1 1/1Running 0 9m9s 172.30.217.69 k8s-node04 <none> <none> rabbitmq-2 1/1Running 0 7m59s 172.30.135.145 k8s-node03 <none> <none> rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1/1Running 0 20h 172.30.217.122 k8s-node04 <none> <none> [root@k8s-master01 deployment]# kubectl get svc -n wiseco|grep rabbitmq rabbitmq ClusterIP None <none> 5672/TCP,4369/TCP,25672/TCP8m27s rabbitmq-management NodePort 10.254.128.136 <none> 15672:32513/TCP8m27s

  

檢視PV、PVC

1 2 3 4 5 6 7 8 9 10 11 [root@k8s-master01 deployment]# kubectl get pvc -n wiseco NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE rabbitmq-data-rabbitmq-0 Bound pvc-19579da4-fe40-4cc5-abb5-670486cc3f12 10Gi RWX rabbitmq-nfs-storage 9m38s rabbitmq-data-rabbitmq-1 Bound pvc-13218c20-2a79-40f2-92fa-a18300729c12 10Gi RWX rabbitmq-nfs-storage 7m5s rabbitmq-data-rabbitmq-2 Bound pvc-7a13561a-1d9c-430c-90df-45ccad455fce 10Gi RWX rabbitmq-nfs-storage 5m55s [root@k8s-master01 deployment]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-13218c20-2a79-40f2-92fa-a18300729c12 10Gi RWX Delete Bound wiseco/rabbitmq-data-rabbitmq-1rabbitmq-nfs-storage 7m3s pvc-19579da4-fe40-4cc5-abb5-670486cc3f12 10Gi RWX Delete Bound wiseco/rabbitmq-data-rabbitmq-0rabbitmq-nfs-storage 9m38s pvc-7a13561a-1d9c-430c-90df-45ccad455fce 10Gi RWX Delete Bound wiseco/rabbitmq-data-rabbitmq-2rabbitmq-nfs-storage 5m55s

  

檢視NFS共享儲存 NFS伺服器(172.16.60.238),檢視共享目錄/data/storage/k8s/rabbitmq
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@k8s-harbor01 ~]# cd /data/storage/k8s/rabbitmq/ [root@k8s-harbor01 rabbitmq]# ll total 0 drwxrwxrwx 5 polkitd root 70 Feb 8 14:17 wiseco-rabbitmq-data-rabbitmq-0-pvc-19579da4-fe40-4cc5-abb5-670486cc3f12 drwxrwxrwx 5 polkitd root 70 Feb 8 14:19 wiseco-rabbitmq-data-rabbitmq-1-pvc-13218c20-2a79-40f2-92fa-a18300729c12 drwxrwxrwx 5 polkitd root 70 Feb 8 14:21 wiseco-rabbitmq-data-rabbitmq-2-pvc-7a13561a-1d9c-430c-90df-45ccad455fce [root@k8s-harbor01 rabbitmq]# ls ./* ./wiseco-rabbitmq-data-rabbitmq-0-pvc-19579da4-fe40-4cc5-abb5-670486cc3f12: config mnesia schema ./wiseco-rabbitmq-data-rabbitmq-1-pvc-13218c20-2a79-40f2-92fa-a18300729c12: config mnesia schema ./wiseco-rabbitmq-data-rabbitmq-2-pvc-7a13561a-1d9c-430c-90df-45ccad455fce: config mnesia schema 檢視RabbitMQ的三個容器節點的.erlang.cookie,內容是一致的! [root@k8s-harbor01 rabbitmq]# ll ./*/.erlang.cookie -rw------- 1 polkitd input 21 Feb 8 14:16 ./wiseco-rabbitmq-data-rabbitmq-0-pvc-19579da4-fe40-4cc5-abb5-670486cc3f12/.erlang.cookie -rw------- 1 polkitd input 21 Feb 8 14:19 ./wiseco-rabbitmq-data-rabbitmq-1-pvc-13218c20-2a79-40f2-92fa-a18300729c12/.erlang.cookie -rw------- 1 polkitd input 21 Feb 8 14:20 ./wiseco-rabbitmq-data-rabbitmq-2-pvc-7a13561a-1d9c-430c-90df-45ccad455fce/.erlang.cookie [root@k8s-harbor01 rabbitmq]# cat ./*/.erlang.cookie YZSDHWMFSMKEMBDHSGGZ YZSDHWMFSMKEMBDHSGGZ YZSDHWMFSMKEMBDHSGGZ

  

5、驗證RabbitMQ叢集 進入RabbitMQ叢集節點Pod容器,檢視RabbitMQ叢集狀態(三個Pod檢視的叢集狀態是一樣的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 登入rabbitmq-0容器檢視叢集狀態 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq-0 ... [{nodes,[{disc,['rabbit@rabbitmq-0','rabbit@rabbitmq-1', 'rabbit@rabbitmq-2']}]}, {running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-1','rabbit@rabbitmq-0']}, {cluster_name,<<"[email protected]">>}, {partitions,[]}, {alarms,[{'rabbit@rabbitmq-2',[]}, {'rabbit@rabbitmq-1',[]}, {'rabbit@rabbitmq-0',[]}]}] 登入rabbitmq-1容器檢視叢集狀態 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-1 -n wiseco -- rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq-1 ... [{nodes,[{disc,['rabbit@rabbitmq-0','rabbit@rabbitmq-1', 'rabbit@rabbitmq-2']}]}, {running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-0','rabbit@rabbitmq-1']}, {cluster_name,<<"[email protected]">>}, {partitions,[]}, {alarms,[{'rabbit@rabbitmq-2',[]}, {'rabbit@rabbitmq-0',[]}, {'rabbit@rabbitmq-1',[]}]}] 登入rabbitmq-2容器檢視叢集狀態 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-2 -n wiseco -- rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq-2 ... [{nodes,[{disc,['rabbit@rabbitmq-0','rabbit@rabbitmq-1', 'rabbit@rabbitmq-2']}]}, {running_nodes,['rabbit@rabbitmq-0','rabbit@rabbitmq-1','rabbit@rabbitmq-2']}, {cluster_name,<<"[email protected]">>}, {partitions,[]}, {alarms,[{'rabbit@rabbitmq-0',[]}, {'rabbit@rabbitmq-1',[]}, {'rabbit@rabbitmq-2',[]}]}] 
6、訪問RabbitMQ的Web介面,檢視叢集狀態
1 2 3 [root@k8s-master01 deployment]# kubectl get svc -n wiseco|grep rabbitmq rabbitmq ClusterIP None <none> 5672/TCP,4369/TCP,25672/TCP23m rabbitmq-management NodePort 10.254.128.136 <none> 15672:32513/TCP23m

  

通過K8S的node節點的32513訪問web頁面,使用者名稱和密碼都是guest 7、RabbitMQ的日常操作命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 1)使用者管理 ===================================================================================================== 新增一個使用者 # rabbitmqctl add_user Username Password 刪除一個使用者 # rabbitmqctl delete_user Username 修改使用者的密碼 # rabbitmqctl change_password Username Newpassword 檢視當前使用者列表 # rabbitmqctl list_users 比如:修改guest使用者密碼、新增或刪除一個使用者 檢視當前使用者列表 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl list_users Listingusers... user tags guest [administrator] 修改guest使用者密碼為 guest@123 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl change_password guest guest@123 Changing passwordforuser"guest".. 新增一個使用者,使用者名稱為kevin,密碼為 kevin@123 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl add_user kevin kevin@123 Adding user"kevin"... 檢視當前使用者列表 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl list_users Listingusers... user tags guest [administrator] kevin [] 設定kevin使用者角色為administrator [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl set_user_tags kevin administrator Setting tagsforuser"kevin"to [administrator] ... 檢視當前使用者列表 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl list_users Listingusers... user tags guest [administrator] kevin [administrator] 修改kevin使用者角色為monitoring、policymaker [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl set_user_tags kevin monitoring policymaker Setting tagsforuser"kevin"to [monitoring, policymaker] ... 檢視當前使用者列表 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl list_users Listingusers... user tags guest [administrator] kevin [monitoring, policymaker] 刪除kevin使用者 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl delete_user kevin Deleting user"kevin"... 檢視當前使用者列表 [root@k8s-master01 deployment]# kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl list_users Listingusers... user tags guest [administrator] 2)使用者角色 ===================================================================================================== 使用者角色分類 使用者角色可分為五類:超級管理員、監控者、策略制定者、普通管理者以及其他。 超級管理員 (administrator) 可登陸管理控制檯(啟用management plugin的情況下),可檢視所有的資訊,並且可以對使用者,策略(policy)進行操作。 監控者 (monitoring) 可登陸管理控制檯(啟用management plugin的情況下),同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁碟使用情況等) 策略制定者 (policymaker) 可登陸管理控制檯(啟用management plugin的情況下), 同時可以對policy進行管理。但無法檢視節點的相關資訊 普通管理者 (management) 僅可登陸管理控制檯(啟用management plugin的情況下),無法看到節點資訊,也無法對策略進行管理。 其他 無法登陸管理控制檯,通常就是普通的生產者和消費者。 相關操作命令: 設定使用者角色的命令為: # rabbitmqctl set_user_tags User Tag 其中: User為使用者名稱 Tag為角色名 (對應於上面的administrator,monitoring,policymaker,management,或其他自定義名稱)。 也可以給同一使用者設定多個角色,例如: # rabbitmqctl set_user_tags kevin monitoring policymaker 3)使用者許可權 ===================================================================================================== 使用者許可權指的是使用者對exchange,queue的操作許可權,包括配置許可權,讀寫許可權。 配置許可權會影響到exchange,queue的宣告和刪除。 讀寫許可權影響到從queue裡取訊息,向exchange傳送訊息以及queue和exchange的繫結(bind)操作。 例如: 將queue繫結到某exchange上,需要具有queue的可寫許可權,以及exchange的可讀許可權; 向exchange傳送訊息需要具有exchange的可寫許可權; 從queue裡取資料需要具有queue的可讀許可權。 相關操作命令: 設定使用者許可權 # rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP 檢視(指定hostpath)所有使用者的許可權資訊 # rabbitmqctl list_permissions [-p VHostPath] 檢視指定使用者的許可權資訊 # rabbitmqctl list_user_permissions User 清除使用者的許可權資訊 # rabbitmqctl clear_permissions [-p VHostPath] User 設定節點型別 RabbitMQ節點型別分為記憶體節點和硬碟節點。 如果你想更換節點型別可以通過命令修改: # rabbitmqctl stop_app # rabbitmqctl change_cluster_node_type dist # rabbitmqctl change_cluster_node_type ram # rabbitmqctl start_app

  

8、模擬RabbitMQ節點故障 模擬故障,重啟其中的一個node節點,比如rabbitmq-0,然後觀察叢集狀態:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [root@k8s-master01 deployment]# kubectl get pods -n wiseco -o wide|grep rabbitmq rabbitmq-0 1/1Running 0 71m 172.30.85.206 k8s-node01 <none> <none> rabbitmq-1 1/1Running 0 68m 172.30.217.69 k8s-node04 <none> <none> rabbitmq-2 1/1Running 0 67m 172.30.135.145 k8s-node03 <none> <none> rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1/1Running 0 21h 172.30.217.122 k8s-node04 <none> <none> 刪除rabbitmq-0節點 [root@k8s-master01 deployment]# kubectl delete pods rabbitmq-0 -n wiseco pod"rabbitmq-0"deleted 檢視pod,發現rabbitmq-0節點刪除後,重啟需要耗費一段時間 [root@k8s-master01 deployment]# kubectl get pods -n wiseco -o wide|grep rabbitmq rabbitmq-0 0/1ContainerCreating 0 44s <none> k8s-node01 <none> <none> rabbitmq-1 1/1Running 0 70m 172.30.217.69 k8s-node04 <none> <none> rabbitmq-2 1/1Running 0 69m 172.30.135.145 k8s-node03 <none> <none> rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1/1Running 0 21h 172.30.217.122 k8s-node04 <none> <none> 此時,檢視RabbitMQ叢集狀態 發現此時,rabbit@rabbitmq-0節點還沒有恢復,running的node節點只有rabbit@rabbitmq-2、rabbit@rabbitmq-1 [root@k8s-master01 ~]# kubectl exec -ti rabbitmq-1 -n wiseco -- rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq-1 ... [{nodes,[{disc,['rabbit@rabbitmq-0','rabbit@rabbitmq-1', 'rabbit@rabbitmq-2']}]}, {running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-1']}, {cluster_name,<<"[email protected]">>}, {partitions,[]}, {alarms,[{'rabbit@rabbitmq-2',[]},{'rabbit@rabbitmq-1',[]}]}]

  

此時,檢視web介面的叢集狀態,先後經歷了下面三個狀態:
  • 紅色表示 節點故障。
  • 黃色表示 節點恢復中,暫不可用。
  • 綠色表示 點執行正常。
9、客戶端訪問RabbitMQ叢集地址 客戶端連線RabbitMQ叢集地址:rabbitmq-0.rabbitmq.wiseco.svc.cluster.local:5672、rabbitmq-0.rabbitmq.wiseco.svc.cluster.local:5672、rabbitmq-0.rabbitmq.wiseco.svc.cluster.local:5672 連線方式:
  • 客戶端可以連線RabbitMQ叢集中的任意一個節點。如果一個節點故障,客戶端自行重新連線到其他的可用節點;
  • 也就是說,RabbitMQ叢集有"重連"機制,但是這種叢集連線方式對客戶端不透明,不太建議這種連線方式。
推薦方式:給客戶端提供一個統一的透明的叢集連線地址 做法:在前面部署LVS或Haproxy,通過四層負載均衡代理後RabbitMQ的三個node節點的5672埠。