GCP LB가 Kubernetes Pad 종료 중 503 Error? (NEG?)

사용 환경

  • 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 에러를 발생시키지 않도록 하려면 어떻게 해야 하나요?

1 Like

파드가 stateless 하다면 pod 수를 늘리고 pdb를 설정하시는게 도움이 되실 수 있습니다.

3 Likes

PDD 설정으로 확인하면서 Stateless에 상황을 확인해볼께요. 감사합니다. 그래도 해결이 안되면 … 한번 더 log, 설정값 등 공유 드리겠습니다.. @kalee 너무 감사합니다 :hugs:

1 Like

SIGTERM인 상태이면 endpoint slices에서는 바로 제거되는 걸로 알고 있습니다. GCP Loadbalancer의 health probe가 어떻게 동작하는지는 모르지만, 503 시점에 실제로 파드에 다녀온건지 확인해보시면 좋을거 같습니다. 혹시나 externalTrafficPolicy:local 인 경우에는 어떤지도 보시면 좋을거 같아요.

2 Likes

Istio 는 사용하고 있지 않은 상태겠죠? 보통 이런 문제는 in-flight 요청때문에 발생하는데, 파드(앱 컨테이너)가 요청을 처리할 수 없는 상태인데 뒤늦게 request 가 들어가는 경우에 발생할 것 같습니다.

실제 애플리케이션이 graceful exit 이 구현되어있는지 먼저 확인 및 테스트해보시면 좋을 것 같습니다.

예를들어 애플리케이션 쪽의 graceful exit 하는 timeout 값이 너무 낮게 잡혀있다면 조금 늘려보시면 완화 될 수 도 있을것 같습니다.

2 Likes

503 에러 발생 시점의 트래픽 경로와 externalTrafficPolicy:local 의 경우도 같이 확인해볼께요. @chuirang 이원기님! 감사합니다.

istio 사용은 안하고 있습니다. 말씀주신 graceful exit로 한번 테스트 해볼께요. @Hayden 님 감사합니다.