快速安裝RabbitMQ和測試
建議使用Kustomize 設定
主要是因為設定的每一個參數官方readme都寫得很詳細
建立namespace和設定rbac
在Kubernetes的RabbitMQ,在第一次啟動的時候,RabbitMQ會試著找服務的pods然後join,當全部的node 準備好後就會發出 Kubernetes event。
所以就需要下面兩個權限
get
access to theendpoints
resourcecreate
access to theevents
resource
kubectl apply -f namespace.yaml
kubectl apply -f rbac.yaml
切換namespace
kubectl config set-context --current --namespace=rabbitmq
準備headless-service
RabbitMQ 使用 port 4369 做內部節點溝通和用port 25672做內部的rpc,做內部溝通而已所以使用Headless Service
kubectl apply -f headless-service.yaml
StatefulSet mount 設定
避免pod 重啟rabbitmq 資料流失,我們必須準備mount pv(volumeClaimTemplates
),rabbitMQ資料存在/var/lib/rabbitmq/mnesia,這位置是由環境變數RABBITMQ_MNESIA_BASE
所定義,你也可以更改RABBITMQ_MNESIA_BASE
來決定資料存放的位置,也請記得也要更改StatefulSet mountPath
為了RabbitMQ node和CLI認證要準備Erlang Cookie,在rabbit docker image中Erlang Cookie會放在/var/lib/rabbitmq/.erlang.cookie,在k8s中我們需要用secret給RABBITMQ_ERLANG_COOKIE
使用。
echo -n "this secret value is JUST AN EXAMPLE. Replace it!" > cookie
kubectl create secret generic erlang-cookie --from-file=./cookie
還要設定Administrator權限的帳號密碼,用secret(rabbitmq-admin
)保存起來,再利用環境變數使用。
user: {administrator} -> 帳號
pass: {g3N3rAtED-Pa$$w0rd} -> 密碼
echo -n "administrator" > user
echo -n "g3N3rAtED-Pa$$w0rd" > passkubectl create secret generic rabbitmq-admin --from-file=./user --from-file=./pass
Rabbit設定檔的設定利用configmap外掛上去就好了,plugin一定要rabbitmq_peer_discovery_k8s
才能在k8s中使用,rabbitmq_management
提供管理UI和http api,rabbitmq_protheus
提供監控metric。
kubectl apply -f configmap.yaml
StatefulSet yaml 設定
statefulset裡有設定init container去把剛剛設定好的configmap裡面conf
和plugins
複製到rabbitMQ
在rabbitMQ docker image裡是用rabbitmq
這個使用者(uid 999),我們要設定runAsUser
,runAsGroup
,fsGroup
都給該使用者執行。
Readiness Probe 使用 RabbitMQ health check 指令
readinessProbe:
exec:
command: ["rabbitmq-diagnostics", "ping"]
Liveness Probe 使用 pre-defined health checks 指令
livenessProbe:
exec:
command: ["rabbitmq-diagnostics", "status"]
這裡還要設定給外部連接的port
5672
: used by AMQP 0-9-1 and AMQP 1.0 clients15672
: management UI and HTTP API)15692
: Prometheus scraping endpoint)
kubectl apply -f statefulset.yaml
建立kubernetes 服務給外部connections
可以用NodePort
或是 LoadBalancer
,因為我不想讓服務直接對外,而是有其他的proxy application在DMZ然後forward到我實際的rabbitMQ cluster。
kubectl apply -f client-service.yaml
kubectl run perf-test --image=pivotalrabbitmq/perf-test -- --uri amqp://administrator:g3N3rAtED-Pa542w0rd@rabbitmq-client
測試連線功能
先port-forward amqp port 5672
kubectl port-forward --namespace rabbitmq svc/rabbitmq-client 5672:5672
這裡我用.Net做測試,照官方的文件
Receive
Send
設定k8s TCP LoadBalaner,再設定Nignx proxy confing來mapping到剛剛設定好的k8s TCP LoadBalaner ip (10.20.30.20)
5672->32750->1672
: used by AMQP 0-9-1 and AMQP 1.0 clients15672->30292->1671
: management UI and HTTP API)15692->31648->1648
: Prometheus scraping endpoint)
改自己的host file,然後登入www.rabbitmq.jeff.com
nginx-ip www.rabbitmq.jeff.com
輸入帳號密碼 administrator g3N3rAtED-Pa542w0rd
RabbitMQ監控
我們已經裝了rabbitmq_prometheus
plugin,所以已經有prometheus metrics可以使用,可以試著在k8s裡query prometheus metrics。
rabbitmq-client:15692/metrics
假如有裝prometheus-operator就可以準備ServiceMonitor
可以去找官方提供的grafana dashboard,再import dashborad。
官方提供的RabbitMQ-Overview dashbroad id 10991
,還有其他監控設定在官方文件,這篇文章應該寫得差不多了,老實說RabbitMQ官方文件和教學都寫得相當不錯,關於rabbitMQ原理和優化會在下一篇再討論。