RCA 2026.08.04 4 min read

Durable Analysis Pipeline과 검증된 이미지로 운영 경계를 닫기

Evidence 수신과 RCA 분석을 DB Task로 나눴다. Lease와 Outbox로 재시도 범위를 정하고, 검증한 Commit을 이미지로 발행하는 CI까지 연결했다.

Evidence 저장과 분석을 같은 요청에서 처리하던 문제

처음에는 Agent가 Evidence를 보내면 같은 API 요청에서 RCA 분석까지 처리했다. 여기에 선택적 LLM 호출, Incident correlation과 알림이 붙으면서 요청 하나가 맡는 일이 많아졌다.

  • 분석이 길어지면 Agent 응답도 늦어진다.
  • Platform이 중간에 재시작되면 저장과 분석 상태를 구분하기 어렵다.
  • 여러 Instance가 같은 Evidence를 중복 처리할 수 있다.
  • Report는 저장됐지만 Notification이 빠지는 부분 성공이 생길 수 있다.
  • 실패 작업을 운영자가 확인하고 재시도하기 어렵다.

그래서 Evidence 수신과 RCA 분석을 DB 기반 Durable Task로 분리했다.

Durable Analysis Task 흐름

Evidence 수신
  → Evidence와 Analysis Task를 같은 Transaction으로 저장
  → Worker가 조건부 UPDATE로 Lease 획득
  → Rule-based와 선택적 LLM 분석
  → Incident·Report·Job·Notification Outbox 저장
  → Task Completed를 같은 Transaction으로 Commit

Evidence ID에는 Unique 제약을 둬 Evidence 하나당 Task가 하나만 생기도록 했다. Worker는 lease_owner, 만료 시각과 attempt_count를 함께 사용한다.

처리가 긴 경우 Lease의 1/3 주기로 Heartbeat를 갱신한다. Instance가 종료되면 갱신도 멈추고, Lease가 만료된 작업을 다른 Instance가 회수한다.

Stale Worker의 Commit 막기

Lease 처리에서는 다음 상황을 따로 확인했다.

Worker A가 Lease 획득
  → 처리 지연
  → Lease 만료
  → Worker B가 같은 Task 회수
  → Worker A가 늦게 Commit 시도

완료 UPDATE에서 Lease Owner와 Attempt Count를 다시 비교하도록 했다. 값이 달라졌다면 Incident를 포함한 Transaction 전체를 Rollback한다. 늦게 끝난 Worker가 새 Worker의 결과를 덮어쓰지 못하게 한 것이다.

분석 실패는 retry_wait로 전환하고 지수 Backoff 후 다시 시도한다. 최대 횟수를 넘으면 dead_letter로 이동한다. Web Console의 Pipeline 화면에서 상태와 오류를 확인하고 수동으로 Queue에 다시 넣을 수 있다.

Notification Outbox를 같은 Transaction에 넣기

Report를 저장한 뒤 Slack이나 Webhook을 바로 호출하면 DB에는 완료로 남고 알림은 실패할 수 있다. 이 상태를 재시도할 수 있도록 알림 요청도 Outbox Record로 먼저 저장했다.

Incident, Report, Job, Notification Outbox와 Task 완료는 하나의 Transaction 경계에 있다. 별도 Worker가 Outbox를 전달하고 재시도한다.

Commit 이후 Audit나 Metric 기록에 실패하더라도 완료된 분석은 다시 실행하지 않도록 했다. 전용 Metric과 경고 Log로 실패를 남겨 후처리만 복구한다. 분석까지 다시 실행하면서 Incident가 중복되는 상황을 피하기 위해서다.

코드가 아니라 검증된 이미지까지 전달하기

Pipeline을 수정한 뒤에는 검증한 코드가 실제 배포 Image에 들어가는지도 확인해야 했다. CI에 다음 Supply Chain Gate를 구성했다.

  • Secret Scan
  • Dependency Review
  • Trivy Filesystem·Image Scan
  • Repository와 Image SBOM
  • Grype SBOM Scan
  • Java·Python CodeQL
  • Platform·Agent Image Build

수정 가능한 High와 Critical 취약점, 실제 Secret 탐지는 CI를 차단한다. Medium과 Low는 숨기지 않고 Artifact와 Code Scanning에 남겨 Triage한다.

main의 CI가 성공한 Commit만 edge와 sha-<commit> Image로 발행한다. 운영 배포에는 이동하는 edge보다 SHA Tag나 Digest를 사용한다. Release에서는 Multi-architecture Image, SBOM과 Keyless Cosign Signing을 추가한다.

마지막 검증 상태

이 글을 작성할 때 Frontend, Agent, Spring Boot, PostgreSQL·MariaDB, Playwright, Helm, 3노드 Kind, Prometheus Operator 전달과 Image Build Gate가 통과한 상태였다. Security와 Edge Image 발행도 같은 Commit에서 확인했다.

아래 환경과 표본은 아직 검증이 남아 있었다.

  • 24시간 Production Fleet
  • EKS·AKS·GKE·OpenShift 실제 Canary
  • 더 많은 실제 장애 Corpus
  • 충분한 LLM Burn-in 표본

이번 단계에서 배운 점

이번에는 분석 도중 재시작되거나 일부 작업만 실패했을 때 어디서 다시 시작할지 정하는 데 시간을 썼다.

중복 분석을 막는 Lease와 Fence
부분 성공을 막는 Transaction과 Outbox
복구 가능한 Retry와 Dead Letter
검증을 통과한 Commit만 Image로 전달하는 CI
Artifact와 한계를 함께 남기는 문서

분석의 중복과 재시도를 정리한 뒤, 그 동작을 검증한 Commit이 Image로 전달되는 단계까지 연결했다. 운영 Fleet과 Managed Cluster의 검증은 위에 적은 다음 범위로 남겼다.

프로젝트 저장소: Kubernetes Cluster Infra RCA Platform

SEARCH JOURNAL

기록 검색

글 제목, 요약, 태그에서 찾습니다.

검색을 준비하고 있어요.

검색어를 입력해 주세요.

    Ctrl/⌘ K 검색 Esc 닫기 ↑ ↓ 결과 이동