pile·
인프라 / DevOps·LG U+LG U+·

종료했는데 왜 502·504가 날까? K8s 무중단 배포를 위한 팁

Amazon EKS 환경에서 무중단 배포(Rolling Update/Blue-Green)를 적용했음에도 간헐적으로 502 Bad Gateway·504 Gateway Timeout이 발생하는 근본 원인과 해결책을 다룬다. ALB·K8s·Istio·Argo Rollouts의 종료 시퀀스가 어긋나는 타이밍 문제가 핵심이며, terminationGracePeriodSeconds·preStop hook·ALB deregistration_delay 세 축을 정렬해 해결한다.

핵심 포인트
  • 502는 ALB가 종료 중인 Pod로 트래픽을 계속 보내다 TCP RST를 받을 때, 504는 ALB idle timeout 내에 응답을 못 받을 때 발생한다.
  • readinessGate 미주입이 핵심 함정 — ALB Target 상태 변화와 K8s Endpoint 제거가 어긋나 Terminating Pod로 신규 요청이 유입된다.
  • preStop hook에 sleep 30을 넣어 ALB deregistration_delay(30초)와 타이밍을 정렬하는 것이 가장 효과적인 기본 처방이다.
  • terminationGracePeriodSeconds는 preStop 시간 + graceful shutdown 시간 + 여유를 포함해야 한다. 기본값(30초)은 실제 종료 흐름에 부족한 경우가 많다.
  • Spring Boot의 keep-alive-timeout을 ALB idle timeout보다 짧게 설정해야 연결 먼저 끊는 쪽(앱)과 나중에 끊는 쪽(ALB) 불일치로 인한 502를 예방한다.
  • Istio 사이드카는 terminationDrainDuration 미설정 시 앱보다 먼저 종료돼 트래픽이 누락된다.
상세 정리
  • 502 원인 5가지: Target TCP RST 응답, 예상치 못한 네트워크 에러, 연결 중 Target 종료, deregistration delay 초과, 잘못된 응답 형식(헤더 32KB 초과 포함)
  • 504 원인 5가지: 연결 타임아웃(10초 내 수립 실패), 응답 타임아웃(idle timeout 초과), Security Group/NACL 임시 포트 차단, Content-Length 불일치, SSL 핸드셰이크 타임아웃
  • 종료 시퀀스 6단계: API Server deletionTimestamp 설정 → EndpointSlice 업데이트 & ALB deregistration 시작 → kubelet preStop hook 실행 → SIGTERM 전달(앱 graceful shutdown) → Istio Envoy drain → Pod 최종 종료
  • ALB와 Pod 종료 플로우는 거의 동시에 시작된다. 기본 ALB drain은 300초, Pod terminationGracePeriodSeconds는 30초라 크게 어긋난다 — deregistration_delay=30, terminationGracePeriodSeconds=60으로 정렬이 핵심
  • K8s 설정 권장값: terminationGracePeriodSeconds=60, preStop exec sleep 30, readinessProbe failureThreshold=1(빠른 실패 감지로 신규 요청 차단 앞당김)
  • ALB Ingress 설정: deregistration_delay.timeout_seconds=30, healthcheck-interval-seconds=15, unhealthy-threshold-count=2
  • Spring Boot 설정: server.shutdown=graceful, tomcat.keep-alive-timeout=15s(ALB idle timeout보다 짧게), lifecycle.timeout-per-shutdown-phase=30s, management.endpoint.health.probes.enabled=true
  • Istio 환경 필수: namespace label로 readinessGate 주입 — 미주입 시 ALB Target 상태와 K8s readiness가 따로 놀아 Terminating Pod에 신규 요청 유입
  • 트러블슈팅 3건: Istio readinessGate 미주입(ALB-K8s 상태 불일치), Argo Rollouts Blue-Green(이전 버전 Pod drain 시간 부족), Connection Keep-Alive 불일치(앱이 ALB보다 먼저 연결 종료)
왜 읽나Amazon EKS + ALB 환경에서 무중단 배포 중 502/504를 경험한 DevOps·백엔드 엔지니어에게 종료 시퀀스 전체를 정리하고 실제 설정값을 바로 적용할 수 있는 체크리스트를 제공한다.
LG U+
LG U+ 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 인프라 / DevOps·vercel-blogVercel Blog·

    Vercel CLI 드라이런 배포로 실제 배포 전 구성 미리 확인하기

    Vercel CLI v54.17.2부터 vercel deploy --dry 명령으로 실제 파일 업로드 없이 배포 구성을 미리 검사할 수 있다. 프레임워크 감지 결과, 포함/제외 파일 목록, 디렉터리 크기 분포, 콘텐츠 해시까지 사전에 확인하고 나서 배포를 결정할 수 있어 의도치 않은 배포 실패를 예방한다.

    #deployment#ci-cd#vercel-cli+1