트래픽 분산 불균형 문제 해결

이 문서에서는 Kubernetes 서비스에 대한 트래픽 분배가 고르지 않은 문제를 해결하는 방법을 설명합니다.

트래픽 분포 불균형의 증상 식별

불균형한 트래픽 분포(핫스팟이라고도 함)는 일부 포드 또는 노드가 전체 워크로드의 불균형한 양을 처리하는 반면 다른 포드 또는 노드는 활용도가 낮은 상태로 유지될 때 발생합니다.

일반적인 증상은 다음과 같습니다.

  • 성능 병목 현상: 사용자는 과도하게 사용되는 네트워크 연결에서 간헐적인 시간 초과, HTTP 5xx 오류 또는 패킷 손실을 경험할 수 있습니다.
  • 리소스 소진: 특정 포드 또는 노드의 CPU 또는 메모리 사용량이 나머지 Fleet보다 훨씬 높습니다.
  • 트래픽 불균형 패턴:
    • 포드별 불균형: 모든 포드가 정상이고 준비된 것으로 보고되더라도 트래픽이 사용 가능한 포드의 작은 하위 집합에만 도달합니다.
    • 노드별 불균형: 하나 이상의 노드가 다른 노드보다 훨씬 더 많은 패킷 또는 요청을 수신합니다. 이는 포드 배치가 고르지 않은 externalTrafficPolicy: Local를 사용할 때 자주 발생합니다.
    • 고정 클라이언트 세션: 단일 대량 클라이언트의 모든 요청이 동일한 백엔드 포드로 일관되게 라우팅됩니다.

Cloud Monitoring을 사용한 진단

이러한 증상을 확인하려면 다음 측정항목을 사용하여 트래픽 패턴을 시각화하세요.

  • 레이어 7 (인그레스/게이트웨이): loadbalancing.googleapis.com/backend/request_count를 표시하고 backend_target로 그룹화하여 여러 백엔드의 요청 볼륨을 비교합니다.

트래픽이 고르지 않게 분산되는 일반적인 원인 파악

이 섹션에서는 Kubernetes 서비스로의 트래픽 분배가 불균형한 일반적인 원인을 설명합니다. 이러한 불균형으로 인해 성능 병목 현상, 특정 포드의 리소스 소진, 애플리케이션 가용성 감소가 발생할 수 있습니다. 일부 포드는 다른 포드보다 훨씬 많은 트래픽을 수신하는 반면 일부 포드는 트래픽을 거의 또는 전혀 수신하지 않습니다.

세션 어피니티로 인해 불균등한 분산이 발생함

세션 어피니티가 사용 설정된 부하 분산기가 동일한 클라이언트의 요청을 동일한 백엔드 포드로 일관되게 라우팅하면 다음 문제가 발생합니다. 특정 클라이언트가 대량의 트래픽을 생성하면 해당 포드가 과부하되어 다른 포드보다 훨씬 더 많은 부하를 받는 핫스팟이 발생하고 다른 포드는 활용도가 낮은 상태로 유지됩니다.

sessionAffinity 필드를 사용하여 Kubernetes 서비스 객체에서 세션 어피니티를 구성할 수 있습니다.

sessionAffinity이 ClientIP로 설정되면 서비스는 동일한 클라이언트 IP 주소에서 시작된 모든 연결이 동일한 백엔드 포드로 일관되게 라우팅되도록 합니다. 이를 통해 실제 클라이언트 IP 기반 세션 어피니티가 제공됩니다.

sessionAffinity이 None (기본 동작)으로 설정된 경우 레이어 4 부하 분산기는 일반적으로 4튜플 (클라이언트 IP 주소, 대상 IP 주소, 대상 포트, 프로토콜) 또는 5튜플 (소스 포트 포함)과 같은 다양한 네트워크 매개변수의 해시를 사용하여 연결을 분산합니다. 이 해싱은 동일한 튜플 값을 가진 연결을 동일한 백엔드로 일관되게 라우팅하여 어느 정도의 연결 '고정'을 제공할 수 있지만, 다른 튜플 요소가 변경되는 경우 특정 클라이언트 IP 주소의 모든 연결이 항상 동일한 포드로 이동하는 것은 보장하지 않습니다.

자세한 내용은 세션 어피니티를 참고하세요.

GKE 게이트웨이의 경우 GCPTrafficDistributionPolicy CRD가 세션 어피니티를 구성합니다. 자세한 내용은 정책을 사용하여 게이트웨이 리소스 구성을 참고하세요.

리전 외부 패스 스루 네트워크 부하 분산기의 경우 세션 어피니티를 사용하여 특정 백엔드에 대한 연결 고정성을 유지할 수 있습니다. 하지만 일부 클라이언트가 다른 클라이언트보다 더 많은 트래픽을 생성하는 경우 세션 어피니티 자체가 불균등한 분산을 일으킬 수 있습니다.

자세한 내용은 세션 어피니티 및 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기 개요를 참조하세요.

다음 예시에서는 sessionAffinity: ClientIP가 있는 서비스 매니페스트를 보여줍니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  sessionAffinity: ClientIP  # This can cause uneven distribution
  ports:
  -   port: 80
    targetPort: 8080
  selector:
    app: my-app

연결 풀링으로 인해 불균형한 분산이 발생함

연결 풀링은 다른 포드에 사용 가능한 용량이 있더라도 부하 분산기가 특정 포드에 대한 기존 연결을 재사용할 때 발생합니다. 일부 연결이 더 오래 지속되거나 다른 연결보다 훨씬 많은 요청을 처리하는 경우 이 동작으로 인해 불균형이 발생할 수 있습니다. 이렇게 하면 세션 어피니티와 마찬가지로 특정 포드에 트래픽이 집중되어 해당 포드가 과부하되는 핫스팟이 생성되고 다른 포드는 사용률이 낮은 상태로 유지됩니다.

부하 분산기는 연결 풀링을 구현하여 새 연결을 설정하는 오버헤드를 줄여 성능을 개선합니다. 하지만 제대로 관리하지 않으면 연결 풀링으로 인해 특히 장기 지속 연결을 유지하는 애플리케이션에서 트래픽이 고르지 않게 분산될 수 있습니다.

연결 풀링으로 인해 발생하는 불균형한 분산을 완화하려면 애플리케이션 또는 클라이언트 수준에서 다음 전략을 구현하세요.

  • 여러 연결을 사용하도록 클라이언트 구성: 단일 장기 연결에 의존하는 대신 부하 분산기에 대한 여러 연결 풀을 열고 관리하도록 클라이언트를 구성합니다. 이를 통해 부하 분산기는 사용 가능한 백엔드 포드에 새 연결 시도를 분산하여 전반적인 트래픽 분산을 개선할 수 있습니다.

  • 주기적으로 연결 닫기 및 다시 열기: 장기적으로 지속되는 연결을 자연스럽게 유지하는 애플리케이션의 경우 주기적으로 연결을 닫고 다시 열도록 애플리케이션 또는 클라이언트를 구성합니다. 이렇게 하면 연결 재설정의 약간의 오버헤드가 발생하지만 부하 분산기가 후속 연결 시도를 사용률이 낮은 다른 백엔드 포드에 분산할 수 있는 새로운 기회가 제공됩니다. 이 접근 방식은 연결 종료 및 재설정이 크게 중단되지 않는 서비스에 특히 효과적입니다.

  • 공격적인 연결 드레이닝 구현: 포드가 단계적 종료 및 연결 드레이닝을 위해 구성되어 있는지 확인합니다. 포드가 정상적으로 종료되면 (예: 배포 또는 축소 중) 부하 분산기는 포드로 새 연결을 전송하는 것을 중지하고 기존 연결이 완료되거나 드레이닝되도록 허용해야 합니다. 이렇게 하면 트래픽이 다른 포드로 더 원활하게 이동할 수 있으며 트래픽이 종료되는 포드에 집중되는 것을 방지할 수 있습니다.

연결 동작을 적극적으로 관리하면 장기 지속 연결에서도 부하 분산기가 트래픽을 더 고르게 분산할 수 있습니다.

5튜플 해싱으로 인해 분산이 고르지 않음

세션 어피니티를 명시적으로 구성하지 않으면 많은 레이어 4 부하 분산기의 기본 동작입니다. 많은 연결이 동일한 클라이언트에서 시작되거나 동일한 포트 조합을 사용하는 경우 고르지 않게 분산됩니다.

해싱으로 인해 발생하는 불균형을 해결하려면 다음을 고려하세요.

  • 레이어 7 부하 분산 사용: GKE 인그레스와 게이트웨이는 요청 수준에서 작동하므로 단일 클라이언트의 요청을 여러 백엔드 포드에 분산할 수 있습니다.

  • 클라이언트 동작 조정: 여러 연결 또는 더 큰 소스 포트 풀을 사용하도록 클라이언트를 구성합니다.

노드 간 포드 분포가 고르지 않아 분포가 고르지 않음

이 문제는 포드가 노드에 고르게 분산되지 않고 부하 분산기가 컨테이너 기반 부하 분산을 사용하지 않는 경우 발생합니다. 포드가 많은 노드는 트래픽을 더 많이 수신하므로 일부 노드에 과부하가 발생하고 다른 노드는 활용되지 않을 수 있습니다.

이 문제는 externalTrafficPolicy: Local를 사용하는 경우에 특히 관련이 있습니다.

외부 트래픽 정책 설정으로 인해 불균형한 분산이 발생함

서비스의 externalTrafficPolicy 설정은 트래픽 라우팅 방식에 영향을 미칩니다.

  • 클러스터: 부하 분산기가 클러스터의 모든 노드에 트래픽을 분산할 수 있습니다. 사용 가능한 모든 노드와 포드에 가장 균등하게 분산하려면 Cluster 설정을 사용하세요.
  • 로컬: 트래픽을 수신한 동일한 노드에서 실행되는 포드로만 트래픽을 라우팅합니다. 노드 간에 포드를 균등하게 분산하지 않으면 불균등한 분산이 발생할 수 있습니다.

노드 어피니티로 인해 불균등한 분산이 발생함

노드 어피니티를 사용하여 포드를 노드의 하위 집합으로 제한하면 특히 워크로드가 노드 간에 균형을 이루지 않는 경우 해당 노드가 과부하될 수 있습니다.

포드가 특정 노드에 고정되어 있지 않은지 확인합니다.