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.yaml는load_definitions를 제거하고,rabbitmq-topology-auth-vss의 개발 복사본을 삭제하고, 모든 토폴로지 CR을rabbitmqClusterReference.name: rabbitmq-dev에 다시 작성합니다.lumie-infra/platform/rabbitmq/overlays/dev/app-users.yaml는lumie,grading-svc및report-svc에 대한 운영자 관리형User및PermissionCR을 생성합니다.lumie-infra/applications/lumie/backend/common-values.yamllumie-infra/applications/lumie/worker/grading-svc/common-values.yamllumie-infra/applications/lumie/worker/report-svc/common-values.yaml
이제 해당 앱 값은 공유 Vault 렌더링 브로커 비밀번호 대신 토폴로지 운영자가 생성한 비밀에서 RABBITMQ_USERNAME 및 RABBITMQ_PASSWORD를 소스로 사용합니다.
이 실패 모드가 발생한 이유
이 사건에는 두 가지 연결된 문제가 있었습니다.
- 공유
connectionSecret가rabbitmq-dev대신 prod/공유 관리 URL로 확인되었기 때문에 토폴로지 CR이 잘못된 브로커에 대해 선언했습니다. - 개발 브로커에는 클러스터 운영자의 기본 사용자를 억제하는 사용자 정의
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는 사용자를 디스크에 유지하며 운영자 기본 사용자는 빈 데이터베이스를 처음 부팅할 때만 생성됩니다.
수정
- RabbitMQ 운영자를 개발을 위한 유일한 자격 증명 기관으로 만듭니다.
- 모든 토폴로지 CR을
rabbitmqClusterReference.name: rabbitmq-dev로 다시 지정합니다. 이는 이미lumie-infra/platform/rabbitmq/overlays/dev/kustomization.yaml에 표현된 패턴입니다. - 이미
lumie-infra/platform/rabbitmq/overlays/dev/app-users.yaml에 표현된 패턴인 앱 자격 증명에 토폴로지 운영자User및PermissionCR을 사용합니다. - 참조 대상이 변경되면 변경할 수 없는 토폴로지 CR을 다시 생성합니다.
rabbitmq.com/keepAfterDeletion: "true"가 있는지 확인한 후에만 수행하십시오. - 브로커가 정의 관리 사용자에서 운영자 관리 사용자로 이동하는 경우 새 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와 맞지 않았습니다 |
| 충돌한 authority | load_definitions bootstrap secret과 operator-generated User credential |
| 영향 | dev messaging instability; production user impact는 기록되지 않았습니다 |
| 지속 수정 | Topology Operator CR과 generated secret을 credential authority로 둡니다 |
원본 진단은 세 plane을 분리했습니다.
| Plane | 확인할 것 |
|---|---|
| broker bootstrap | load_definitions가 user 또는 permission을 여전히 import하는지 |
| topology CR | User, Permission, queue, exchange, binding, policy가 의도한 cluster를 가리키는지 |
| application env | app이 operator-generated *-user-credentials secret을 읽는지 |
지속 교훈은 RabbitMQ credential에는 writer가 하나여야 한다는 것입니다. 가져온 definition과 Topology Operator가 모두 user를 정의하면 Kubernetes의 선언된 상태와 broker runtime state가 서로 어긋나며, 이는 password bug처럼 보이지만 실제로는 authority bug입니다.