신규 프로젝트에서 Celery를 활용하기 위해 브로커에 쓰일 RabbitMQ를 구축해야 했다. 이미 우린 GKE를 활용해서 백엔드 애플리케이션 및 Celery Worker를 올리려고 하였기 때문에 RabbitMQ도 GKE에 구축해야 했다. (물론 클라우드 기반해서 제공하는 서비스도 있으나 그래봐야 Celery 메시지 전달 정도라서, 사용량이 많지 않을 것 같아 간단하게 내가 구축하는게 나을 것 같았다.)
https://www.rabbitmq.com/kubernetes/operator/operator-overview.html
RabbitMQ 공식 문서에는 Kubernetes 환경에서 RabbitMQ를 쉽게 구축할 수 있도록 RabbitMQ Cluster Kubernetes Operator를 제공한다.
공식 문서에 따르면 다음과 같은 과정을 통해 설치가 가능하다.
kubectl apply -f "https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml"
# namespace/rabbitmq-system created
# customresourcedefinition.apiextensions.k8s.io/rabbitmqclusters.rabbitmq.com created
# serviceaccount/rabbitmq-cluster-operator created
# role.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-role created
# clusterrole.rbac.authorization.k8s.io/rabbitmq-cluster-operator-role created
# rolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-rolebinding created
# clusterrolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-operator-rolebinding created
# deployment.apps/rabbitmq-cluster-operator created
위 명령어를 실행시키면 rabbitmq cluster operator와 관련된 모든 것들을 자동으로 설치해준다.
Operator가 설치된 후에는 이제 RabbitMQ 클러스터 설치해야 한다. 문서에는 가장 간단한 클러스터 구축 예제만 제공한다.
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: hello-world
혹은
kubectl apply -f https://raw.githubusercontent.com/rabbitmq/cluster-operator/main/docs/examples/hello-world/rabbitmq.yaml
이렇게 하면 아무 설정이 안된 RabbitMQCluster가 생성된다.
GKE에 상태를 체크해보니 Pod이 생성되긴 했는데 계속 pending state로 멈춰있었다. 로그를 분석하고, 자료를 찾아보니 Persistent Volume 문제였다. 내 GKE에서 프로비저닝 될 수 없는 storage class가 default 옵션으로 지정되어 사용할 수 없어서 발생하는 문제였다. GKE에서는 기본적으로 제공하는 standard-rwo 혹은 premium-rwo 를 storage class로 지정해서 사용할 수 있어서, 하드디스크 기반의 standard rwo를 옵션으로 지정하고 pod을 재 설치했더니 rabbitmq가 기동되었다.
굉장히 간단하게 설치할 수 있다. 근데 나는 PV에 대한 개념이 없었어서, storage class 설정에서 한참 헤메었고, rabbitMQ 클러스터 default 값이 저렇게 간단한 예제로 해도 되는가? 하는 찜찜함이 생겼다.
예전 GCP associate 자격증 준비할 때 써드파티 애플리케이션 설치는 GCP 마켓 플레이스를 이용하면 더 쉽게 할 수 있다고 하였다. 그 생각이 나서 바로 마켓플레이스에 RabbitMQ를 검색해보았다.
쉽게 구축 가능한 아이템들이 많이 나온다.
하나하나 설명을 읽어보다 RabbitMQ Cluster가 내가 원하는 것임을 알게되었다.
이걸 이용하면 별도의 사용 수수료 및 추가 비용 없이 (왜냐면 GKE 클러스터 내 노드의 리소스를 사용하기 때문) GKE에 RabbitMQ를 GUI로 구축할 수 있다.
구성 버튼을 눌러보자.
번거롭게 CLI에 명령어를 치고, 오브젝트 yaml 구성 파일을 만들어 배포할 필요 없이, GUI를 통한 간단한 옵션 선택으로 순식간에 내 클러스터에 RabbitMQ를 배포할 수 있다.
선택 옵션은 클러스터, 네임스페이스, 클러스터 레플리카 개수, default username, storage class이다.
배포를 후, kubectl get all -n rabbitmq
명령어를 통해 RabbitMQ가 설치되었음을 볼 수 있다. 알아서 statefulset으로 배포해준다.
RabbitMQ Admin에 접속하려면 port-forward를 쓰면 된다.
RabbitMQ의 서비스를 내 로컬 포트를 통해 접속할 수 있다. 참고로, 로컬에 RabbitMQ가 실행되고 있으면 종료하도록 하자. (로컬 RabbitMQ 접속이 우선순위가 더 높아서 port-forward가 안먹힌다.)
타 네임스페이스의 Deployment에서 RabbitMQ 서비스에 접근하려면 dns명을 다음과 같이 구성하면 된다.
amqp://guest:guest!@rabbitmq-rabbitmq-svc.rabbitmq.svc.cluster.local:5672/
MarketPlace에서 RabbitMQ를 설치하면 프로메테우스도 같이 설치해준다.
metrics를 조회할 수 있다.
https://github.com/GoogleCloudPlatform/click-to-deploy/blob/master/k8s/rabbitmq/README.md 가이드 문서도 잘되어 있어서 활용하기 굉장히 편리하다.
쿠버네티스에 RabbitMQ를 설치할 때 RabbitMQ Cluster Operator 가이드를 참고하여 설치할 수 있다. 이 방법도 물론 어렵지 않지만, GKE 환경에서 이것 저것 건드리기 귀찮고, GUI 를 통해 이거저거 신경쓰지 않고 설치하고 싶다면 Marketplace에 올라와있는 rabbitMQ 아이템을 활용해보자.