이 문서에서는 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설정을 사용합니다. - 로컬: 트래픽을 트래픽을 수신한 동일한 노드에서 실행되는 포드로만 라우팅합니다. 포드를 노드 간에 균등하게 분산하지 않으면 분산 불균형이 발생할 수 있습니다.
노드 어피니티로 인한 분산 불균형
노드 어피니티를 사용하여 포드를 노드의 하위 집합으로 제한하면 특히 워크로드가 노드 간에 균형을 이루지 않는 경우 해당 노드가 과부하될 수 있습니다.
포드가 특정 노드에 고정되지 않도록 합니다.