install RabbitMQ in kubernetes

快速安裝RabbitMQ和測試

建議使用Kustomize 設定
主要是因為設定的每一個參數官方readme都寫得很詳細

在Kubernetes的RabbitMQ,在第一次啟動的時候,RabbitMQ會試著找服務的pods然後join,當全部的node 準備好後就會發出 Kubernetes event

所以就需要下面兩個權限

  • get access to the endpoints resource
  • create access to the events resource
kubectl apply -f namespace.yaml
kubectl apply -f rbac.yaml
kubectl config set-context --current --namespace=rabbitmq

RabbitMQ 使用 port 4369 做內部節點溝通和用port 25672做內部的rpc,做內部溝通而已所以使用Headless Service

kubectl apply -f headless-service.yaml

避免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" > pass
kubectl 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裡有設定init container去把剛剛設定好的configmap裡面confplugins 複製到rabbitMQ

在rabbitMQ docker image裡是用rabbitmq 這個使用者(uid 999),我們要設定runAsUserrunAsGroupfsGroup 都給該使用者執行。

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 clients
  • 15672: management UI and HTTP API)
  • 15692: Prometheus scraping endpoint)
kubectl apply -f statefulset.yaml

可以用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 clients
  • 15672->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_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原理和優化會在下一篇再討論。

DevOps engineer