[INFRA-09] docker-compose.sim.yml + 제어·상태 대시보드 통합

작업 내용 (설계 의도)

변경 사항

근거 TDD: ../TDD.md “서버 토폴로지”·“Observability”, ADR-004. 모든 스크립트·reseed를 컨테이너로 묶는 단독 통합(와이어업) 티켓 — 공통 파일(sim.yml·Makefile·대시보드·README)을 한 티켓만 수정(Single Writer). 마지막 wave.

  • docker-compose.sim.yml(신규, ⑦ 소유) — k6-runner(스크립트 04~07 마운트, --out experimental-prometheus-rw로 ⑤ Prometheus remote-write, CPU/메모리 상한 명시 — NFR 측정 왜곡 방지) + reseed(INFRA-08 스크립트 실행) 컨테이너. 앱/mock 미정의.
  • Makefile(또는 qa/load/sim.mk) — sim-up/sim-pause/sim-down(k6 gracefulStop 도착률 0 수렴). FR-7.
  • qa/load/dashboards/simulator.json(신규) — ⑤ Grafana 프로비저닝용: 도달 TPS·활성 시나리오·거부율·목표 참조선·다음 스파이크 시각·reseed 이력. FR-6.
  • qa/load/README.md 갱신 — 상시 구동·제어·상태 조회 절차.

롤백: -f docker-compose.sim.yml 미적용 + make sim-down. 대상 앱 무영향.

의존

  • INFRA-01·02·04·05·06·07·08 (전 스크립트·reseed·LB). 런타임 연동: ⑤ Prometheus remote-write receiver·Grafana.

다이어그램

클래스 의존

flowchart LR
    Make["Makefile 제어"] --> SimYml["docker-compose.sim.yml"]
    SimYml --> Runner["k6-runner (04~07)"]
    SimYml --> Reseed["reseed (08)"]
    Runner --> PromRW["⑤ Prometheus remote-write"]
    PromRW --> Dash["Grafana simulator.json"]

테스트 케이스

  • docker compose -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.lb.yml -f docker-compose.sim.yml config가 exit 0으로 병합된다.
  • make sim-up으로 k6-runner·reseed 컨테이너가 기동되고 곡선이 시작된다.
  • make sim-down이 k6 gracefulStop으로 도착률을 0으로 수렴시킨 뒤 컨테이너를 내린다.
  • k6-runner 컨테이너에 CPU/메모리 상한이 적용되어 관측 대상과 리소스가 분리된다.
  • 도달 TPS·활성 시나리오가 ⑤ Grafana 대시보드에 실시간 노출된다(FR-6).
  • sim-pause는 러너만 멈추고 LB·reseed 컨테이너는 유지한다.