Kubernetes에서 RabbitMQ 운영
증상
RabbitMQ가 Kubernetes에서 일관되지 않게 작동하는 경우 이 가이드를 사용하세요.
- Cluster Operator 또는 Topology Operator가 시작되지 않습니다.
- 대기열 또는 Exchange CR이 정상이라고 보고하지만 브로커에 개체가 없습니다.
- Spring 또는 워커 컨슈머가
404 NOT_FOUND - no queue ...와 충돌합니다. - 브로커를 다시 시작하면
PRECONDITION_FAILED교환 유형 불일치가 노출됩니다. - 서비스 로그가 정상으로 보이는 경우에도 앱 시작 프로브가 실패합니다.
현재 저장소에서 기대하는 것
현재 RabbitMQ GitOps 분할은 다음과 같습니다.
lumie-infra/platform/rabbitmq/base/rabbitmq-cluster.yaml의 브로커 런타임lumie-infra/platform/rabbitmq/base/topology/*.yaml의 토폴로지 CRlumie-infra/platform/rabbitmq/overlays/dev/kustomization.yaml및lumie-infra/platform/rabbitmq/overlays/prod/kustomization.yaml의 개발 및 프로덕션 소유권 패치
베이스는 여전히 load_definitions 부트스트랩 경로와 rabbitmq-definitions ConfigMap을 전달하지만 이제 두 오버레이 모두 해당 경로를 제거하고 토폴로지 CR을 rabbitmqClusterReference.name로 다시 지정합니다. 이는 기본 파일이 여전히 이전 부트스트랩 메커니즘을 표시하더라도 저장소가 이미 이후 운영자 소유 방향을 반영하고 있음을 의미합니다.
lumie-infra/platform/rabbitmq/base/configmap.yaml는 또한 의도된 분할을 명확하게 문서화합니다. 가상 호스트, 사용자 및 권한만 definitions.json에 속합니다. 교환, 큐, 바인딩 및 정책은 base/topology/에 속합니다.
이러한 실패가 발생하는 이유
이 가이드를 만들게 된 사건은 하나의 버그가 아니었습니다. 여러 운영 함정이 겹친 결과였습니다.
- 차트 기본값은 실제로 배포된 것과 다른 이미지나 진입점을 가정합니다.
- 운영자에게 차트 버전이 부여되지 않은 RBAC가 필요했습니다.
- ConfigMap이 존재했지만 RabbitMQ는 이를 로드하거나 마운트하라는 지시를 받은 적이 없습니다.
- 동일한 교환이 유형이 다른 둘 이상의 기관에서 선언되었습니다.
- 실행 중인 Spring Boot 버전이 노출하지 않은 엔드포인트를 대상으로 하는 상태 프로브
일반적인 교훈은 Kubernetes의 RabbitMQ가 하나의 제어 평면이 아니라는 것입니다. 차트, 운영자, 브로커 구성, 토폴로지 CR 및 소비 앱은 모두 각 레이어를 소유한 사람에 동의해야 합니다.
진단 경로
연산자 레이어부터 시작
운영자 Pod가 충돌하는 경우 브로커 자체를 디버깅하기 전에 렌더링된 배포를 검사하세요.
- 이미지 및 명령
- ClusterRole 규칙
- 차트 버전과 실제로 배포된 이미지 버전
안정적인 조정 루프에 도달하지 못한 운영자는 브로커 상태에 대해 아무 것도 증명할 수 없습니다.
"원하는 개체"와 "브로커에 개체가 존재함"을 구분하세요.
큐, 교환, 바인딩 또는 정책 CR의 Ready=True는 컨트롤러가 일부 브로커 대상에 대해 조정되었음을 증명할 뿐입니다. 앱 지향 브로커에 예상한 개체가 있음을 증명하지는 않습니다. 앱에 404 NOT_FOUND - no queue ...가 표시되면 브로커를 신뢰한 다음 CR의 rabbitmqClusterReference를 검사하세요.
정의가 전체 경로로 로드되는지 확인
ConfigMap만으로는 아무 작업도 수행하지 않습니다. 기록 부트스트랩 경로에는 다음이 모두 필요합니다.
load_definitions = /etc/rabbitmq/definitions/definitions.json- 해당 경로에 ConfigMap을 배치하는 볼륨 마운트
어느 쪽이든 누락된 경우 클러스터에 ConfigMap이 있더라도 브로커는 의도한 정의 없이 시작됩니다.
당국 간 선언 드리프트 확인
이것은 고전적인 PRECONDITION_FAILED 케이스입니다. 앱 코드와 인프라 매니페스트에서 대기열이나 교환이 선언되면 브로커는 모든 유형 불일치를 하드 계약 위반으로 처리합니다. 현재 토폴로지 CR은 lumie.dlx를 lumie-infra/platform/rabbitmq/base/topology/exchanges.yaml의 topic 교환으로 정의하므로 모든 앱 측 선언이 해당 계약과 일치해야 합니다.