애플리케이션 파드가 재시작된 후 Istio Ingress Gateway에서 연결이 끊어집니다

저희 회사의 애플리케이션은 장시간 실행되는 TCP 및 WebSocket 연결을 지원하면서. Istio 1.15.3 버전의 Ingress Gateway와 동일한 버전의 Istio 프록시 사이드카가 포함된 애플리케이션 파드를 사용하고 있습니다. 또한 Ingress Gateway 앞단에는 AWS NLB가 구성되어 있습니다.

애플리케이션 파드 1개와 Ingress Gateway 파드 1개로 TCP 연결 15,000개를 생성하면 모든 연결이 성공적으로 이루어집니다. 그러나 연결이 모두 생성된 이후 파드를 종료하면 일부 연결이 끊깁니다.

애플리케이션에는 클라이언트에게 재연결을 요청하는 종료 훅(shutdown hook)이 구현되어 있고, 클라이언트는 해당 요청을 수신하여 재연결을 시도합니다.

다음과 같은 설정이 이미 적용되어 있습니다:

proxy.istio.io/config: | 
  parentShutdownDuration : 620s 
  drainDuration: 600s 
  terminationDrainDuration: 600s 
  proxyMetadata: 
    MINIMUM_DRAIN_DURATION: '45s' 
    EXIT_ON_ZERO_ACTIVE_CONNECTIONS: 'true'

또한 terminationGracePeriodSeconds=650로 설정되어 있습니다. 애플리케이션은 SIGTERM 수신 후 새 파드가 준비될 때까지 90초를 대기한 후에 재연결 요청을 전송합니다.

연결은 SSL이 활성화된 상태에서 생성됩니다. 그러나 Ingress Gateway 파드 수를 늘리면 모든 연결이 정상적으로 복구됩니다. 이는 Gateway에서 어떤 형태의 쓰로틀링(throttling)이 발생하고 있다는 것을 의미합니다. ephemeral 포트 범위를 늘려서 시도해보았으나 효과가 없었습니다. 파일 디스크립터도 충분히 설정되어 있으므로 그로 인한 문제는 아닙니다.

디버그 로그를 활성화해도 연결이 끊기는 원인을 명확하게 파악할 수 없습니다. 어떤 트러블슈팅 방법이나 인사이트가 있으신 분 계신가요?

문제가 Istio Ingress Gateway 파드의 리소스 사용량과 관련이 있을 수 있습니다. 문제가 발생할 때 CPU 및 메모리 사용량을 확인하고, 필요시 리소스 제한을 증가시키는 것이 좋습니다.

단일 장애 지점을 피하기 위해 Ingress Gateway 파드는 항상 최소 두 개 이상 유지하는 것이 좋습니다.

1 Like