[Kubernetes] Rabbitmq Cluster 구축 (삽질기)

Mr.Song·2023년 5월 19일
0

Docker / Kubernetes

목록 보기
11/13
post-thumbnail

Kubernetes와 RabbitMQ Operator 활용하여 RabbiMQ 클러스터링 구축


RabbitMQ 클러스터를 구축하기 위해 Kubernetes와 RabbitMQ Operator를 활용하여 RabbitMQ 클러스터를 구축을 시도해보자

RabbitMQ는 대규모 메시지 처리에 적합한 오픈 소스 메시지 브로커이며 RabbitMQ Operator는 Kubernetes 상에서 RabbitMQ 클러스터를 관리하기 위한 컨트롤러로, 효율적인 클러스터 구성과 관리를 지원해준다.

처음엔 Helm을 통해 시도했으나, Connection refused 에러가 발생하여 pod 실행되지않았다. 그래서 오퍼레이터를 사용했고, 이 글도 오퍼레이터를 이용한 구축기록이다. 나중에 찾아보니 bind_ip가 로컬호스트로만 설정되어 발생한 것인데 이를 발견하기까지 오래걸렸다.

서론은 길다 일단 들어가보자, RabbitMQ official Docs를 참고하여 구축해본다

1. Operator yaml Download

curl "https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml" > ./cluster-operator.yaml

kubectl apply -f ./cluster-operator.yaml
# 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-system이라는 네임스페이스에 CRD를 포함한 필요한 리소스들이 생성된다. 그리고 이 API를 사용하여 rabbimq를 요청하면 statefulset을 생성해준다.

2. Request RabbitMQ Node-Server

-- rabbitmq.yaml
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
    name: rabbitmq-node
spec:
  service:
    type: NodePort
  replicas: 3
  persistence:
    storageClassName: "gp2"
    storage: 2Gi
  resources:
    limits:
      cpu: "0.25"
      memory: 2Gi
    requests:
      cpu: "0.25"
      memory: 2Gi
  rabbitmq:
    envConfig: |
      RABBITMQ_DEFAULT_USER=user
      RABBITMQ_DEFAULT_PASS=user1234
      RABBITMQ_NODE_PORT=5672
steve@MacBookPro ~/eks/prd/rabbitmq # k apply -f ./rabbitmq.yaml
steve@MacBookPro ~/eks/prd/rabbitmq # k get all -l app.kubernetes.io/name=rabbitmq-node
NAME                         READY   STATUS    RESTARTS   AGE
pod/rabbitmq-node-server-0   1/1     Running   0          24h
pod/rabbitmq-node-server-1   1/1     Running   0          2d10h
pod/rabbitmq-node-server-2   1/1     Running   0          24h

NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                          AGE
service/rabbitmq-node         NodePort    172.20.218.143   <none>        5672:31012/TCP,15672:32533/TCP,15692:30533/TCP   2d10h
service/rabbitmq-node-nodes   ClusterIP   None             <none>        4369/TCP,25672/TCP                               2d10h

NAME                                    READY   AGE
statefulset.apps/rabbitmq-node-server   3/3     2d10h

내가 요청한 yaml은 노드 수는 3개, gp2 sc에 pvc를 요청하여 동적 볼륨을 할당 받고, 서비스 타입은 NodePort로 하되 alb-ingress로부터 트래픽을 받도록 설정하였다.

3. Ingress Host(관리자 콘솔) 접속

yaml 내 계정정보를 입력하여 관리자 콘솔에 접속하고 queue생성해주면 된다.

클러스터링 된 노드 중 일부 노드가 서비스 불가가 될 수 있고, 이를 방지하며 서비스 가용성과 확장성을 확보하기 위해 클러스터링을 구현했다. queue type은 쿼럼(quorum)방식을 채택했다

쿼럼(quorum)방식은 자체적인 투표기반 알고리즘을 사용하여 리더(노드)를 선정하고, 해당 큐의 메시지는 리더가 처리한다.리더의 상태를 확인할 수 없을 때, 큐에 참여중인 Online 상태의 멤버 중 한 멤버를 리더로 선출한다.

테스트 시나리오

  1. 리더노드 중지
  2. 온라인 멤버 중 중지 된 노드 제거되는지 확인
  3. 리더노드 선출 확인
  4. GetMessage 실행
  5. Response 확인
  6. 제거 된 노드 복구 후 온라인 멤버로 참여되는지 확인

간단하게 테스트를 해 본 결과 : 리더노드를 중지했을 때 Online 멤버에서 제거되었고, 새로운 리더가 선출되어 승격되었다. 중지 된 노드를 정상화하기전까지는 Member에는 속해있었으나, Online에는 추가되지않았고 정상화가 완료가 되고나서 다시 Online멤버로 참여하는 걸 볼 수 있었다.

RabbitMQ Operator를 활용하여 Kubernetes 상에서 RabbitMQ 클러스터를 구축하는 방법을 기록해보았다. RabbitMQ를 단일에서 클러스터를 변경하면서 서비스 가용성 및 확장성을 확보할 수 있었고, 지속적인 모니터링을 통해 리소스 조절과 노드 증설을 고려해 볼 필요가 있을 것으로 추측된다.

profile
정리를 못하면 기록이라도 하자!!

0개의 댓글