xDS 로드 밸런싱
xDS 로드 밸런싱 (xDS Load Balancing)
enable_xds_load_balancing이 Consul 서버 간에 xDS 스트림을 어떻게 분산하는지, 언제 활성화하고 언제 비활성화로 두어야 하는지 설명하는 문서예요.
출처: 문서
본문
이 페이지는 enable_xds_load_balancing이 Consul 서버 간에 xDS 스트림을 어떻게 분산하는지, 언제 활성화하고 언제 비활성화로 두어야 하는지 설명해요.
개요 (Overview)
서비스 메시 배포에서 각 사이드카 Envoy(또는 Consul 데이터플레인)는 Consul 컨트롤 플레인에 장수명 xDS 스트림을 유지해요. 다중 서버 클러스터에서는 한 서버가 병목이 되지 않도록 이러한 스트림이 정상 서버들에 분산되어야 해요.
enable_xds_load_balancing이 활성화되면 각 서버는 클러스터 크기와 연결된 프록시 수를 기반으로 스트림 한도를 적용해요. 서버가 한도 이상이면 새 스트림을 거부해 클라이언트가 다른 서버에 다시 연결하도록 해요.
이것이 중요한 이유 (Why this matters)
xDS 로드 밸런싱 없이 한 서버가 불균형한 수의 스트림을 받을 수 있어요. 이는 다음을 유발할 수 있어요:
- 서버 간 고르지 않은 리소스 활용.
- 영향을 받는 프록시에 대한 더 높은 업데이트 지연 시간.
- 과부하된 서버가 실패하면 더 큰 장애 영향 범위(blast radius).
xDS 로드 밸런싱이 활성화되면 안정 상태 운영과 클러스터 변경 중에도 스트림 분포가 더 균등하게 유지돼요.
enable_xds_load_balancing 구성 (Configure enable_xds_load_balancing)
기본값은 false예요. 이 동작을 활성화하려면 명시적으로 true로 설정해야 해요.
VM 및 베어메탈 서버 (VM and bare metal servers)
performance {
enable_xds_load_balancing = true
}
비활성화하려면 필드를 생략하거나 다음으로 설정해요:
performance {
enable_xds_load_balancing = false
}
Kubernetes (Helm)
server.extraConfig를 통해 값을 설정해요:
server:
extraConfig: |
{
"performance": {
"enable_xds_load_balancing": true
}
}
밸런싱 작동 방식 (How balancing works)
각 서버는 다음을 기반으로 최대 스트림 수를 계산해요:
- 카탈로그의 메시 프록시 총 수.
- 정상 Consul 서버 수.
- 정상적인 변동 중 채터(churn)를 줄이기 위한 10% 버퍼.
서버가 한도 이상일 때 새 xDS 연결이 도착하면 서버는 RESOURCE_EXHAUSTED를 반환하고 클라이언트에게 다른 서버를 시도하라고 요청해요.
한도는 다음 경우에 자동으로 업데이트돼요:
- 프록시 서비스가 추가되거나 제거될 때.
- 서버가 조인하거나, 떠나거나, 비정상이 될 때.
배포 지침 (Deployment guidance)
권장: 서버 디스커버리를 사용하는 Consul 데이터플레인 (Recommended: Consul dataplane with server discovery)
데이터플레인이 서버를 동적으로 발견하면 로드 밸런싱 거부를 받았을 때 다른 서버를 재시도할 수 있어요. 이 모델에서는 xDS 로드 밸런싱을 활성화해요.
Consul 서버 앞에 위치한 외부레이어 4 로드 밸런서 (External layer-4 load balancer in front of Consul servers)
서버 앞에 외부 로드 밸런서(NLB, HAProxy, Envoy Gateway)를 두면 enable_xds_load_balancing = false로 유지하고 로드 밸런서가 연결을 분산하도록 해요.
단일 정적 서버 주소 (권장하지 않음) (Single static server address)
모든 데이터플레인이 단일 서버 주소를 사용하고 로드 밸런서가 없다면, xDS 로드 밸런싱을 활성화하면 첫 번째 서버가 한도에 도달한 후 많은 데이터플레인이 스트림을 수립하지 못할 수 있어요. 디스커버리를 사용하거나 여러 서버 주소를 제공하세요.
설정 확인 (Verify the setting)
에이전트 self 엔드포인트를 사용해요:
$ curl -s http://localhost:8500/v1/agent/self | jq '.DebugConfig.EnableXDSLoadBalancing'
xDS 밸런싱 모니터링 (Monitor xDS balancing)
다음 메트릭을 추적해요:
consul.xds.server.streams: 이 서버의 활성 xDS 스트림.consul.xds.server.idealStreamsMax: 이 서버에 대해 계산된 스트림 한도.consul.xds.server.streamDrained: 재분배를 위해 정상적으로 드레인된 스트림.
$ curl -s http://localhost:8500/v1/agent/metrics?format=prometheus | grep xds