Kubernetes에서 RabbitMQ 구축하기

김슭삵·2025년 5월 26일
post-thumbnail

들어가며

이번 글에서는 대표적인 메시지 브로커인 RabbitMQ의 개념부터 Kubernetes 환경에서의 구축, 그리고 Spring Boot 애플리케이션과의 연동까지 단계별로 알아보겠습니다.

RabbitMQ란?

RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 구현한 오픈소스 메시지 브로커입니다. Erlang으로 개발되었으며, 높은 가용성과 확장성을 제공하는 Enterprise급 메시징 시스템입니다.

RabbitMQ의 핵심 개념

Producer (발행자)
메시지를 생성하고 RabbitMQ에 전송하는 애플리케이션입니다. 주문 처리, 이메일 발송 요청 등의 작업을 큐에 넣는 역할을 합니다.

Queue (큐)
메시지가 저장되는 버퍼입니다. Producer가 보낸 메시지는 Queue에 저장되고, Consumer가 가져갈 때까지 대기합니다.

Consumer (소비자)
Queue에서 메시지를 받아 처리하는 애플리케이션입니다. 실제 비즈니스 로직을 수행하는 주체입니다.

Exchange (교환기)
Producer가 보낸 메시지를 어떤 Queue로 라우팅할지 결정하는 라우터 역할을 합니다.

Binding (바인딩)
Exchange와 Queue 사이의 연결 규칙입니다. 라우팅 키를 통해 메시지 전달 경로를 결정합니다.

RabbitMQ의 장점

안정성 (Reliability)
메시지 지속성(Durability)과 확인 응답(Acknowledgment) 메커니즘을 통해 메시지 손실을 방지합니다.

유연한 라우팅
다양한 Exchange 타입(Direct, Topic, Fanout, Headers)을 통해 복잡한 메시지 라우팅을 지원합니다.

클러스터링
여러 노드를 클러스터로 구성하여 고가용성과 확장성을 제공합니다.

관리 도구
웹 기반 관리 UI를 통해 Queue, Exchange, 메시지 상태를 실시간으로 모니터링할 수 있습니다.

다양한 클라이언트 지원
Java, Python, .NET, Go, JavaScript 등 다양한 언어를 지원합니다.

MSA에서 RabbitMQ 활용 사례

비동기 작업 처리

  • 이메일 발송, 파일 처리, 이미지 리사이징 등
  • 사용자 응답 속도를 향상시키고 서버 부하 분산

이벤트 기반 아키텍처

  • 주문 생성 → 재고 차감 → 결제 처리 → 배송 준비
  • 각 단계를 독립적인 서비스로 분리하여 처리

서비스 간 결합도 감소

  • Direct API 호출 대신 메시지를 통한 통신
  • 서비스 장애가 다른 서비스에 직접적으로 영향을 주지 않음

로드 밸런싱

  • 여러 Consumer 인스턴스 간 작업 분산
  • 처리 능력에 따른 동적 부하 조절

RabbitMQ Kubernetes 배포

1단계: RabbitMQ 시크릿 생성

민감한 정보인 사용자명과 비밀번호를 안전하게 저장하기 위해 Secret을 생성합니다.

# rabbitmq-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: rabbitmq-secret
  namespace: msa-apps
type: Opaque
stringData:
  username: <ID>
  password: <PW>

Secret 사용의 장점

  • 민감한 정보를 Base64로 인코딩하여 저장
  • 환경변수로 안전하게 주입 가능
  • RBAC을 통한 접근 제어

2단계: RabbitMQ Deployment 및 PVC 생성

RabbitMQ 서버와 데이터 영속성을 위한 스토리지를 설정합니다.

# rabbitmq-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabbitmq
  namespace: msa-apps
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      labels:
        app: rabbitmq
    spec:
      containers:
      - name: rabbitmq
        image: rabbitmq:3.11-management
        ports:
        - containerPort: 5672  # AMQP 프로토콜
        - containerPort: 15672 # 관리 UI
        env:
        - name: RABBITMQ_DEFAULT_USER
          valueFrom:
            secretKeyRef:
              name: rabbitmq-secret
              key: username
        - name: RABBITMQ_DEFAULT_PASS
          valueFrom:
            secretKeyRef:
              name: rabbitmq-secret
              key: password
        resources:
          requests:
            memory: "256Mi"
            cpu: "200m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        volumeMounts:
        - name: rabbitmq-data
          mountPath: /var/lib/rabbitmq
      volumes:
      - name: rabbitmq-data
        persistentVolumeClaim:
          claimName: rabbitmq-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rabbitmq-pvc
  namespace: msa-apps
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

주요 설정 설명

  • rabbitmq:3.11-management: 관리 UI가 포함된 RabbitMQ 이미지
  • 포트 5672: AMQP 메시지 통신 포트
  • 포트 15672: 웹 관리 인터페이스 포트
  • PVC: 컨테이너 재시작 시에도 데이터 보존
  • 리소스 제한: 메모리와 CPU 사용량 제한

3단계: RabbitMQ 서비스 생성

클러스터 내부 통신과 외부 관리 UI 접근을 위한 서비스를 생성합니다.

# rabbitmq-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq
  namespace: msa-apps
spec:
  type: ClusterIP
  ports:
  - port: 5672
    targetPort: 5672
    name: amqp
  - port: 15672
    targetPort: 15672
    name: http
  selector:
    app: rabbitmq
---
# 관리 UI 접근을 위한 NodePort 서비스
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-management
  namespace: msa-apps
spec:
  type: NodePort
  ports:
  - port: 15672
    targetPort: 15672
    nodePort: 31672
    name: http
  selector:
    app: rabbitmq

서비스 타입 설명

  • ClusterIP: 클러스터 내부에서만 접근 가능 (마이크로서비스 통신용)
  • NodePort: 외부에서 관리 UI 접근 가능

4단계: RabbitMQ 배포 실행

# 시크릿 생성
kubectl apply -f rabbitmq-secret.yaml

# 배포 및 PVC 생성
kubectl apply -f rabbitmq-deployment.yaml

# 서비스 생성
kubectl apply -f rabbitmq-service.yaml

# 배포 상태 확인
kubectl get pods -n msa-apps -l app=rabbitmq
kubectl get services -n msa-apps | grep rabbitmq

Spring Boot 애플리케이션 연동

1단계: Config Service에 RabbitMQ 설정 추가

중앙 집중식 설정 관리를 위해 Config Service에 RabbitMQ 공통 설정을 추가합니다.

# config-service/configurations/rabbitmq.yml
spring:
  rabbitmq:
    host: rabbitmq
    port: 5672
    username: <ID>
    password: <PW>
    virtual-host: /
    listener:
      simple:
        concurrency: 3
        max-concurrency: 10
        retry:
          enabled: true
          initial-interval: 1000ms
          max-attempts: 3
          max-interval: 10000ms
          multiplier: 2.0

설정 항목 설명

  • host: Kubernetes 서비스명 (rabbitmq)
  • virtual-host: RabbitMQ 논리적 분리 단위
  • concurrency: 동시 처리 Consumer 수
  • retry: 메시지 처리 실패 시 재시도 설정

2단계: 마이크로서비스에 RabbitMQ 의존성 추가

각 마이크로서비스의 build.gradle에 RabbitMQ 의존성을 추가합니다.

dependencies {
    // 기존 의존성들...
    
    // RabbitMQ 의존성 추가
    implementation 'org.springframework.boot:spring-boot-starter-amqp'
    
    // 기존 의존성들...
}

3단계: 애플리케이션 설정 수정

각 서비스의 application.yml에 RabbitMQ 프로필을 포함시킵니다.

# 예: health-service application.yml
spring:
  application:
    name: health-service
  config:
    import: configserver:http://config-service:8888
  profiles:
    include: rabbitmq  # RabbitMQ 프로필 포함

RabbitMQ 관리 및 모니터링

관리 UI 접속

URL: http://공인IP:31672
계정: ID / PW

주요 기능

  • Queue, Exchange, Connection 상태 모니터링
  • 메시지 수 및 처리 속도 확인
  • 수동 메시지 발송 및 확인
  • 클러스터 상태 모니터링

주요 모니터링 지표

Queue 메트릭

  • 대기 중인 메시지 수 (Ready)
  • 처리 중인 메시지 수 (Unacked)
  • 초당 메시지 처리량 (Rate)

Connection 메트릭

  • 활성 연결 수
  • 연결별 채널 수
  • 네트워크 I/O 상태

Node 메트릭

  • 메모리 사용량
  • 디스크 사용량
  • CPU 사용률

마치며

RabbitMQ는 MSA 환경에서 서비스 간 안정적이고 확장 가능한 통신을 제공하는 핵심 인프라입니다. Kubernetes 환경에서의 배포와 Spring Boot 애플리케이션과의 연동을 통해 강력한 이벤트 기반 아키텍처를 구축할 수 있습니다.
이처럼 비동기 메시징을 통해 시스템의 확장성과 안정성을 크게 향상시킬 수 있으며, 서비스 간 결합도를 낮춰 유지보수성도 개선할 수 있습니다

profile
비전공자의 개발 적응기

0개의 댓글