사용 환경
- Kubernetes: GKE
- Ingress: HTTPRoute + GCP Load Balancer
- Service Type: NEG-backed
- GCP Backend Service: Connection draining enabled
장애 설명
현재 GCP 글로벌 외부 로드 밸런서를 사용 중이며, Kubernetes pod들이 HTTPRoute와 Service를 통해 그 뒤에 연결되어 있습니다. pod가 삭제될 때 다음과 같은 종료 프로세스를 정상적으로 따릅니다:
preStop훅이 구성되어 있음terminationGracePeriodSeconds가 설정되어 있음- 애플리케이션은
SIGTERM을 정상적으로 처리하고, 종료 중에도 일정 시간 동안 요청을 계속 처리함
하지만 문제는 다음과 같습니다:
pod가 SIGTERM을 받은 후에도 살아 있고 요청을 처리할 수 있음에도 불구하고, GCP 로드 밸런서는 몇 초 뒤부터 503 오류를 반환하기 시작합니다. (kubectl port-forward로 직접 확인 시 파드는 정상적으로 동작 중임)
로드 밸런서 로그에서 확인된 오류 메시지:
failed with status 503 and body upstream connect error or disconnect/reset before headers. reset reason: remote connection failure, transport failure reason: delayed connect error: Connection refused
시도해본 해결 방법
- GCP Backend Service에서 Connection Draining을 30초로 설정했고, pod 종료 전에 readiness probe가 정상임을 확인
readinessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 5
failureThreshold: 3
- , pad 종료를 지연시키기 위해 preStop hook을 사용했습니다:
lifecycle:
preStop:
exec:
command:
- sh
- -c
- "sleep 10"
NEG(Network Endpoint Group) 동작을 확인한 결과, pod가 Terminating 상태로 진입하자마자 NEG에서 제거되고 있습니다. 또한 terminationGracePeriodSeconds를 30초로 설정했습니다.
질문
pod 가 아직 정상 상태이고 트래픽을 처리할 수 있는 상황에서도, 종료 중일 때 Load Balancer가 503 에러를 발생시키지 않도록 하려면 어떻게 해야 하나요?