고치기 전에 먼저 측정하는 클라우드 엔지니어입니다. 단일 VM에서 p95 응답이 17초까지 늘어난 서비스를 부하 테스트로 병목을 증명한 뒤 GCP 3-Tier로 전환해 2.3초로 줄였고, 장애 시 접속이 끊기는 대신 안내 페이지가 뜨도록 DNS Failover를 구성했습니다.
AI 추론과 일반 API가 한 인스턴스에서 자원을 다투며 응답이 지연되던 구조를, 부하 테스트로 병목을 먼저 증명한 뒤 단계적으로 분리했습니다.
torch.cuda.is_available()이 False를 반환하고 nvidia-smi도 실패했습니다. IaC로 인스턴스를 만드는 것과 그 안이 쓸 수 있는 상태가 되는 것은 다른 문제였습니다.nvidia/cuda:12.1.1-cudnn8-ubuntu22.04 기반으로 컨테이너화하고, torch.cuda.is_available()과 nvidia-smi 이중 체크로 GPU 인식 여부를 확인했습니다.docker-compose up -d를 등록해, 재부팅 이후에도 모델 서버가 스스로 복구되게 했습니다.Calico와 VXLAN Overlay로 GCP와 AWS 양쪽 Kubernetes를 프라이빗 IP로 연결해 모델 호출을 내부 통신으로 처리한 구성은 팀에서 진행했습니다.
전환 이후 운영 안정화와 모니터링, 복구 포지션을 맡았고 단계별 전환 로드맵을 정리했습니다. 위 01 항목들이 직접 설계하고 적용한 범위입니다.
타 팀에서 겪던 원인 불명의 오류를 함께 추적해 업스트림 파서 버그로 규명하고 패치안을 제출했습니다.
RestClient로 FastAPI를 호출할 때 원인 불명의 422 Unprocessable Entity가 발생했습니다. 같은 요청을 ngrok으로 우회하면 정상 동작해 재현 조건부터 불명확했습니다.Upgrade: h2c를 기본 전송합니다. Uvicorn은 이 업그레이드를 무시하지만 httptools 파서가 upgrade 상태에 머물러 on_body 콜백이 호출되지 않고 본문이 유실됐습니다. 서버가 업그레이드를 무시하고 진행하도록 허용한 RFC 7230 §6.7 위반입니다.llhttp_resume_after_upgrade()로 HTTP/1.1 파싱을 재개하는 Cython 패치안과 재현 테스트를 첨부해 httptools에 이슈를 등록했습니다.422 Unprocessable Entity
증상. 검증 오류를 가리켜 직렬화 문제로 오인하게 만듭니다
Upgrade: h2c 기본 전송
Java 21 HttpClient, 평문 HTTP 구간에서만
on_body 미호출
RFC 7230 §6.7 위반
근본 원인. 설정 문제가 아닌 버그로 확정
클라이언트에서 C 파서 바인딩까지 3개 계층을 내려가 상태머신 버그로 확정
Java HttpClient는 평문 HTTP에서만 Upgrade: h2c를 보냅니다. TLS를 종료한 뒤 내부망에서 평문으로 서비스 간 호출을 주고받는 구성이 정확히 그 조건입니다. 같은 요청이 프록시를 거칠 때 정상 동작한 것도 게이트웨이가 업그레이드 헤더를 걷어내기 때문이고, 경로를 직접 호출로 단순화하는 순간 드러납니다.
내부 API 호출 구조를 택할 때 클라이언트의 프로토콜 협상 기본값까지 확인해야 한다는 것을 이 건으로 배웠습니다.
3-Tier 전환에서 가장 먼저 한 일은 아키텍처 그림이 아니라 k6 부하 테스트였습니다. 추론 부하가 일반 API를 끌어내리는 것을 숫자로 보여준 다음에야 구조를 바꿀 근거가 생겼습니다. 지금도 인프라를 건드리기 전에 무엇을 측정할지부터 정합니다.
Terraform으로 GPU VM을 만들어도 CUDA 커널 모듈이 올라오지 않으면 모델은 뜨지 않습니다. 프로비저닝과 실행 가능 상태는 다른 문제이고, 원격 세션이 끊기는 순간을 전제로 startup-script 같은 복구 경로를 미리 넣어두어야 합니다.
Cross-Cloud 연결에 VPN과 NAT, DNS Relay를 검토했지만 내부 API 호출로 단순화했습니다. Waither에서 인프라 규모에 맞지 않는 MSA 분리가 어떤 비용을 만드는지 겪은 뒤로, 동작하는 구조보다 감당할 수 있는 구조를 먼저 봅니다.
인프라 구조가 사전 논의 없이 변경되며 제 IAM 권한이 삭제된 일이 있었습니다. 프로젝트를 위해 새 구조를 빠르게 파악하고 운영과 복구를 맡았지만, 이후 기술 도입과 권한 분배 기준을 문서로 고정했습니다. 권한 관리는 기술이 아니라 합의의 문제였습니다.
진한 표시는 직접 설계하고 운영한 범위입니다. Kubernetes는 팀이 구성한 환경에서 운영과 복구를 담당한 수준입니다.