토폴로지 인지 라우팅
토폴로지 인지 라우팅 (Topology Aware Routing)
토폴로지 인지 라우팅은 네트워크 트래픽을 원래 발생한 zone 안에 유지하도록 돕는 메커니즘이에요. 클러스터의 Pod 간 같은-zone 트래픽을 선호하면 신뢰성, 성능(네트워크 지연·처리량), 비용 면에서 도움이 될 수 있어요.
FEATURE STATE: Kubernetes v1.23 [beta]
참고: Kubernetes 1.27 이전에는 이 기능을 Topology Aware Hints라고 불렀어요.
동기 (Motivation)
Kubernetes 클러스터는 점점 더 멀티-zone 환경에 배포돼요. Service의 엔드포인트를 계산할 때 EndpointSlice controller가 각 엔드포인트의 토폴로지(region과 zone)를 고려하고 hints 필드를 채워 zone에 할당해요. kube-proxy 같은 클러스터 컴포넌트가 그 hints를 소비해 트래픽이 라우팅되는 방식에 영향을 주도록 해요.
토폴로지 인지 라우팅 활성화
Service에 service.kubernetes.io/topology-mode annotation을 Auto로 설정하면 활성화할 수 있어요. 각 zone에 충분한 엔드포인트가 있으면 EndpointSlices에 Topology Hints가 채워져 트래픽이 발생 지점과 가까운 곳으로 라우팅돼요.
언제 가장 잘 동작하나?
- 들어오는 트래픽이 고르게 분산될 때: 트래픽의 큰 비율이 단일 zone에서 발생하면 그 zone에 할당된 엔드포인트 부분집합이 과부하될 수 있어요. 트래픽이 단일 zone에서 발생할 것으로 예상되면 권장하지 않아요.
- Service가 zone당 3개 이상의 엔드포인트를 가질 때: 3-zone 클러스터에서 9개 이상을 의미해요. zone당 3개 미만이면 EndpointSlice controller가 고르게 할당하지 못할 확률이 높아(≈50%) 기본 클러스터 전체 라우팅으로 폴백해요.
동작 방식
"Auto" 휴리스틱은 각 zone에 비례적으로 엔드포인트를 할당하려고 해요. EndpointSlice controller는 그 zone에서 실행되는 노드의 할당 가능한(allocatable) CPU 코어 수에 기반해 비율을 정해요. 예를 들어 한 zone이 2 CPU 코어이고 다른 zone이 1 CPU 코어라면, 2 코어 zone에 2배 많은 엔드포인트를 할당해요.
hints가 채워진 EndpointSlice 예시:
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: example-hints
labels:
kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 80
endpoints:
- addresses:
- "10.1.2.3"
conditions:
ready: true
hostname: pod-1
zone: zone-a
hints:
forZones:
- name: "zone-a"
kube-proxy는 EndpointSlice controller가 설정한 hints를 기반으로 라우팅할 엔드포인트를 필터링해요. 대부분 같은 zone의 엔드포인트로 트래픽을 라우팅하지만, zone 간 균형을 위해 다른 zone의 엔드포인트를 할당하면 일부 트래픽이 다른 zone으로 갈 수 있어요.
안전장치 (Safeguards)
컨트롤 플레인과 각 노드의 kube-proxy는 Topology Aware Hints를 사용하기 전에 안전장치 규칙을 적용해요. 확인이 안 되면 kube-proxy는 zone과 무관하게 클러스터 어디서든 엔드포인트를 선택해요.
- 엔드포인트 수 부족: 클러스터의 zone 수보다 엔드포인트가 적으면 hints를 할당하지 않아요.
- 균형 할당 불가능: zone 간 균형 할당이 불가능하면("expected overload"가 허용 가능한 임계값 이하로 못 내려가면) hints를 할당하지 않아요. 이는 실시간 피드백에 기반하지 않으므로 개별 엔드포인트가 여전히 과부하될 수 있어요.
- 노드 정보 부족: 어떤 노드가
topology.kubernetes.io/zone라벨이 없거나 할당 가능한 CPU 값을 보고하지 않으면 hints를 설정하지 않아요. - 일부 엔드포인트에 zone hint 없음: 전환 중이라고 가정하고 모든 엔드포인트를 사용해요.
- hints에 zone이 없음: kube-proxy가 실행 중인 zone을 대상으로 하는 hint를 가진 엔드포인트를 찾지 못하면 모든 zone의 엔드포인트를 사용해요. 새 zone을 추가할 때 흔히 발생해요.
제약 사항
- Service에
internalTrafficPolicy가Local이면 Topology Aware Hints를 사용하지 않아요. 같은 클러스터의 다른 Service에서는 둘 다 사용할 수 있어요. - 트래픽의 큰 비율이 일부 zone 부분집합에서 발생하는 Service에는 잘 동작하지 않아요.
- EndpointSlice controller는 각 zone의 비율을 계산할 때 준비되지 않은(unready) 노드를 무시해요.
- 컨트롤 플레인 노드(
node-role.kubernetes.io/control-plane라벨)를 무시해요. 워크로드도 그 노드에서 실행 중이면 문제가 될 수 있어요. - toleration을 고려하지 않아요.
- Horizontal Pod Autoscaler와 잘 맞지 않을 수 있어요.
커스텀 휴리스틱
내장 휴리스틱이 사용 사례에 맞지 않으면 커스텀 휴리스틱을 개발할 수 있어요. 1.27 릴리스에 첫 단계가 포함됐어요.