K8S部署RabbitMQ叢集 (映象模式) - 部署筆記
阿新 • • 發佈:2021-11-29
RabbitMQ 簡介
以熟悉的電商場景為例,如果商品服務和訂單服務是兩個不同的微服務,在下單的過程中訂單服務需要呼叫商品服務進行扣庫存操作。按照傳統的方式,下單過程要等到呼叫完畢之後才能返回下單成功,如果網路產生波動等原因使得商品服務扣庫存延遲或者失敗,會帶來較差的使用者體驗,如果在高併發的場景下,這樣的處理顯然是不合適的,那怎麼進行優化呢?這就需要訊息佇列登場了。 訊息佇列提供一個非同步通訊機制,訊息的傳送者不必一直等待到訊息被成功處理才返回,而是立即返回。訊息中介軟體負責處理網路通訊,如果網路連線不可用,訊息被暫存於隊列當中,當網路暢通的時候在將訊息轉發給相應的應用程式或者服務,當然前提是這些服務訂閱了該佇列。如果在商品服務和訂單服務之間使用訊息中介軟體,既可以提高併發量,又降低服務之間的耦合度。 RabbitMQ就是這樣一款我們苦苦追尋的訊息佇列。RabbitMQ是一個開源的訊息代理的佇列伺服器,用來通過普通協議在完全不同的應用之間共享資料。 RabbitMQ 的特點- 非同步處理:把訊息放入訊息中介軟體中,等到需要的時候再去處理。
- 流量削峰:例如秒殺活動,在短時間內訪問量急劇增加,使用訊息佇列,當訊息佇列滿了就拒絕響應,跳轉到錯誤頁面,這樣就可以使得系統不會因為超負載而崩潰。
- 日誌處理;(不過一般日誌處理都使用Kafka這種訊息佇列)
- 應用解耦:假設某個服務A需要給許多個服務(B、C、D)傳送訊息,當某個服務(例如B)不需要傳送訊息了,服務A需要改程式碼再次部署;當新加入一個服務(服務E)需要服務A的訊息的時候,也需要改程式碼重新部署;另外服務A也要考慮其他服務掛掉,沒有收到訊息怎麼辦?要不要重新發送呢?是不是很麻煩,使用MQ釋出訂閱模式,服務A只生產訊息傳送到MQ,B、C、D從MQ中讀取訊息,需要A的訊息就訂閱,不需要了就取消訂閱,服務A不再操心其他的事情,使用這種方式可以降低服務或者系統之間的耦合。
- 通過Erlang Cookie,相當於共享祕鑰的概念,長度任意,只要所有節點都一致即可。
- rabbitmq server在啟動的時候,erlang VM會自動建立一個隨機的cookie檔案。cookie檔案的位置是/var/lib/rabbitmq/.erlang.cookie 或者 /root/.erlang.cookie,為保證cookie的完全一致,採用從一個節點copy的方式。
RabbitMQ叢集模式
- 單機模式
- 普通叢集模式(無高可用性)
- 映象叢集模式(高可用性),最常用的叢集模式。
- rabbitmq broker叢集允許個體節點down機,
- 對應叢集的的網路分割槽問題( network partitions)
- RAM node:只儲存狀態到記憶體。記憶體節點將所有的佇列、交換機、繫結、使用者、許可權和vhost的元資料定義儲存在記憶體中,好處是可以使得像交換機和佇列宣告等操作更加的快速。
- Disk node:將元資料儲存在磁碟中。單節點系統只允許磁碟型別的節點,防止重啟RabbitMQ的時候,丟失系統的配置資訊。
- RabbitMQ要求在叢集中至少有一個磁碟節點,所有其他節點可以是記憶體節點,當節點加入或者離開叢集時,必須要將該變更通知到至少一個磁碟節點。
- 如果叢集中唯一的一個磁碟節點崩潰的話,叢集仍然可以保持執行,但是無法進行其他操作(增刪改查),直到節點恢復。
- 為保證資料永續性,當前所有node節點跑在disk模式。
- 如果今後壓力大,需要提高效能,考慮採用ram模式。
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-provisioner created
clusterrole.rbac.authorization.k8s.io /nfs-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io /run-nfs-provisioner created
[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-runner 6h2m
|
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-storage created
[root@k8s-master01 rabbitmq] # kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rabbitmq-nfs-storage rabbitmq /nfs Retain Immediate false 3s
|
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-provisioner created
[root@k8s-master01 rabbitmq] # kubectl get pods -n wiseco|grep rabbitmq
rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1 /1 Running 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 ;
until rabbitmqctl node_health_check; do sleep 1; 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-management created
service /rabbitmq created
statefulset.apps /rabbitmq created
[root@k8s-master01 deployment] # kubectl get pods -n wiseco -o wide|grep rabbitmq
rabbitmq-0 1 /1 Running 0 11m 172.30.85.206 k8s-node01 <none> <none>
rabbitmq-1 1 /1 Running 0 9m9s 172.30.217.69 k8s-node04 <none> <none>
rabbitmq-2 1 /1 Running 0 7m59s 172.30.135.145 k8s-node03 <none> <none>
rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1 /1 Running 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 /TCP 8m27s
rabbitmq-management NodePort 10.254.128.136 <none> 15672:32513 /TCP 8m27s
|
檢視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-1 rabbitmq-nfs-storage 7m3s
pvc-19579da4-fe40-4cc5-abb5-670486cc3f12 10Gi RWX Delete Bound wiseco /rabbitmq-data-rabbitmq-0 rabbitmq-nfs-storage 9m38s
pvc-7a13561a-1d9c-430c-90df-45ccad455fce 10Gi RWX Delete Bound wiseco /rabbitmq-data-rabbitmq-2 rabbitmq-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' ,[]}]}]
|
1 2 3 |
[root@k8s-master01 deployment] # kubectl get svc -n wiseco|grep rabbitmq
rabbitmq ClusterIP None <none> 5672 /TCP ,4369 /TCP ,25672 /TCP 23m
rabbitmq-management NodePort 10.254.128.136 <none> 15672:32513 /TCP 23m
|
通過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
Listing users ...
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 password for user "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
Listing users ...
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 tags for user "kevin" to [administrator] ...
檢視當前使用者列表
[root@k8s-master01 deployment] # kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl list_users
Listing users ...
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 tags for user "kevin" to [monitoring, policymaker] ...
檢視當前使用者列表
[root@k8s-master01 deployment] # kubectl exec -ti rabbitmq-0 -n wiseco -- rabbitmqctl list_users
Listing users ...
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
Listing users ...
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 /1 Running 0 71m 172.30.85.206 k8s-node01 <none> <none>
rabbitmq-1 1 /1 Running 0 68m 172.30.217.69 k8s-node04 <none> <none>
rabbitmq-2 1 /1 Running 0 67m 172.30.135.145 k8s-node03 <none> <none>
rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1 /1 Running 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 /1 ContainerCreating 0 44s <none> k8s-node01 <none> <none>
rabbitmq-1 1 /1 Running 0 70m 172.30.217.69 k8s-node04 <none> <none>
rabbitmq-2 1 /1 Running 0 69m 172.30.135.145 k8s-node03 <none> <none>
rabbitmq-nfs-client-provisioner-c4f95d479-xvm8r 1 /1 Running 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介面的叢集狀態,先後經歷了下面三個狀態:
- 紅色表示 節點故障。
- 黃色表示 節點恢復中,暫不可用。
- 綠色表示 點執行正常。
- 客戶端可以連線RabbitMQ叢集中的任意一個節點。如果一個節點故障,客戶端自行重新連線到其他的可用節點;
- 也就是說,RabbitMQ叢集有"重連"機制,但是這種叢集連線方式對客戶端不透明,不太建議這種連線方式。