본문으로 건너뛰기

RabbitMQ Dev 이중 자격 증명 기관

증상

토폴로지 운영자가 큐 개체가 정상이라고 말해도 개발 메시징 경로가 중단된 경우 이 가이드를 사용하세요.

  • lumie-backend 또는 워커가 404 NOT_FOUND - no queue ...와 충돌합니다.
  • 대기열 CR에 Ready=True가 표시되지만 rabbitmq-dev에 대기열이 없습니다.
  • 토폴로지는 앱이 사용하는 것과 다른 브로커에 도달한 후에만 조정됩니다.
  • CR을 rabbitmq-dev로 다시 지정하면 오류가 누락된 대기열에서 401 Unauthorized로 전환됩니다.

현재 저장소에서 기대하는 것

현재 개발 오버레이는 이미 해결된 설계를 캡처합니다.

  • lumie-infra/platform/rabbitmq/overlays/dev/kustomization.yamlload_definitions를 제거하고, rabbitmq-topology-auth-vss의 개발 복사본을 삭제하고, 모든 토폴로지 CR을 rabbitmqClusterReference.name: rabbitmq-dev에 다시 작성합니다.
  • lumie-infra/platform/rabbitmq/overlays/dev/app-users.yamllumie, grading-svcreport-svc에 대한 운영자 관리형 UserPermission CR을 생성합니다.
  • lumie-infra/applications/lumie/backend/common-values.yaml
  • lumie-infra/applications/lumie/worker/grading-svc/common-values.yaml
  • lumie-infra/applications/lumie/worker/report-svc/common-values.yaml

이제 해당 앱 값은 공유 Vault 렌더링 브로커 비밀번호 대신 토폴로지 운영자가 생성한 비밀에서 RABBITMQ_USERNAMERABBITMQ_PASSWORD를 소스로 사용합니다.

이 실패 모드가 발생한 이유

이 사건에는 두 가지 연결된 문제가 있었습니다.

  1. 공유 connectionSecretrabbitmq-dev 대신 prod/공유 관리 URL로 확인되었기 때문에 토폴로지 CR이 잘못된 브로커에 대해 선언했습니다.
  2. 개발 브로커에는 클러스터 운영자의 기본 사용자를 억제하는 사용자 정의 load_definitions 사용자 권한도 있었습니다. CR이 다시 지정된 후 토폴로지 운영자는 브로커가 401 Unauthorized를 생성하고 수신한 적이 없는 사용자로 인증했습니다.

통합 버그는 이중 자격 증명 권한 주체였습니다. 운영자가 관리하는 브로커는 토폴로지 자격 증명에 대한 두 번째 정적 권한 주체를 병렬로 안전하게 유지할 수 없습니다.

진단 경로

CR 상태와 브로커 현실 분리

대기열 CR이 녹색이지만 rabbitmq-dev에 대기열이 누락된 경우 질문은 "조정이 왜 실패했는가?"가 아니라 "어느 브로커에서 조정이 성공했는가?"입니다.

토폴로지 참조 대상 검사

이전 오류 모드에서는 rabbitmqClusterReference.connectionSecret를 사용했습니다. 현재 고정 오버레이는 해당 참조를 name: rabbitmq-dev로 대체합니다. 개발 오버레이가 공유 connectionSecret로 다시 이동하는 경우 CR 상태를 신뢰하기 전에 렌더링된 비밀 URI를 검사하세요.

브로커에 둘 이상의 자격 증명 권한이 있는지 확인하세요.

클러스터 운영자가 기본 사용자가 존재할 것으로 예상했지만 load_definitions가 정적 사용자를 시드했기 때문에 이 실패는 재지정 후 401로 반환됩니다. load_definitions가 활성화된 경우 RabbitMQ는 정의 파일을 사용자 권한으로 취급하고 처음 부팅 시 운영자 기본 사용자를 생성하지 않습니다.

PVC 규칙을 기억하세요

이미 사용된 볼륨에서는 load_definitions를 제거하는 것만으로는 충분하지 않습니다. RabbitMQ는 사용자를 디스크에 유지하며 운영자 기본 사용자는 빈 데이터베이스를 처음 부팅할 때만 생성됩니다.

수정

  1. RabbitMQ 운영자를 개발을 위한 유일한 자격 증명 기관으로 만듭니다.
  2. 모든 토폴로지 CR을 rabbitmqClusterReference.name: rabbitmq-dev로 다시 지정합니다. 이는 이미 lumie-infra/platform/rabbitmq/overlays/dev/kustomization.yaml에 표현된 패턴입니다.
  3. 이미 lumie-infra/platform/rabbitmq/overlays/dev/app-users.yaml에 표현된 패턴인 앱 자격 증명에 토폴로지 운영자 UserPermission CR을 사용합니다.
  4. 참조 대상이 변경되면 변경할 수 없는 토폴로지 CR을 다시 생성합니다. rabbitmq.com/keepAfterDeletion: "true"가 있는지 확인한 후에만 수행하십시오.
  5. 브로커가 정의 관리 사용자에서 운영자 관리 사용자로 이동하는 경우 새 PVC 또는 이에 상응하는 빈 데이터베이스 부팅을 계획합니다. 일반 재시작으로는 누락된 기본 사용자가 생성되지 않습니다.

예방

  • 개발에서 load_definitions 사용자 시드와 운영자 관리 브로커 자격 증명을 혼합하지 마십시오.
  • 개발 및 프로덕션 브로커 간에 공유 Vault 렌더링 토폴로지 비밀을 사용하지 마십시오.
  • 단일 공유 관리자 비밀번호가 아닌 서비스별 운영자 생성 비밀에서 가져온 앱 자격 증명을 유지합니다.
  • 녹색 외부 대상 CR을 '내 앱이 사용하는 브로커에 선언됨'이 아니라 '어딘가의 브로커에 선언됨'으로 처리합니다.

확인

cd Lumie
rg -n "load_definitions|rabbitmq-topology-auth-vss|rabbitmqClusterReference|name: rabbitmq-dev" \
lumie-infra/platform/rabbitmq/overlays/dev/kustomization.yaml
rg -n "kind: User|kind: Permission|name: lumie|name: grading-svc|name: report-svc" \
lumie-infra/platform/rabbitmq/overlays/dev/app-users.yaml
rg -n "RABBITMQ_USERNAME|RABBITMQ_PASSWORD|user-credentials" \
lumie-infra/applications/lumie/backend/common-values.yaml \
lumie-infra/applications/lumie/worker/grading-svc/common-values.yaml \
lumie-infra/applications/lumie/worker/report-svc/common-values.yaml

성공은 개발 토폴로지가 클러스터 이름으로 rabbitmq-dev를 대상으로 하고, 오버레이가 더 이상 공유 토폴로지 비밀에 의존하지 않으며, 각 소비 앱이 운영자가 생성한 비밀에서 RabbitMQ 자격 증명을 읽는다는 것을 의미합니다.

원본 사고 세부사항

2026년 5월 18일 원본 사고는 dev environment의 credential authority 실패였습니다. 두 시스템이 동시에 RabbitMQ credential을 소유하려 했습니다. Static imported definition과 RabbitMQ Topology Operator resource입니다.

세부사항
환경dev RabbitMQ cluster
주요 증상application credential이 live broker state와 맞지 않았습니다
충돌한 authorityload_definitions bootstrap secret과 operator-generated User credential
영향dev messaging instability; production user impact는 기록되지 않았습니다
지속 수정Topology Operator CR과 generated secret을 credential authority로 둡니다

원본 진단은 세 plane을 분리했습니다.

Plane확인할 것
broker bootstrapload_definitions가 user 또는 permission을 여전히 import하는지
topology CRUser, Permission, queue, exchange, binding, policy가 의도한 cluster를 가리키는지
application envapp이 operator-generated *-user-credentials secret을 읽는지

지속 교훈은 RabbitMQ credential에는 writer가 하나여야 한다는 것입니다. 가져온 definition과 Topology Operator가 모두 user를 정의하면 Kubernetes의 선언된 상태와 broker runtime state가 서로 어긋나며, 이는 password bug처럼 보이지만 실제로는 authority bug입니다.