토폴로지 인지 라우팅
토폴로지 인지 라우팅 (Topology Aware Routing)
참고:
토폴로지 인지 라우팅(Topology Aware Routing) 은 트래픽이 발생한 존(zone)에 트래픽을 유지하는 것을 선호하도록 라우팅 동작을 조정해요. 어떤 경우에는 비용을 줄이거나 네트워크 성능을 개선하는 데 도움이 될 수 있어요.
출처: 문서
본문
동기 (Motivation)
쿠버네티스 클러스터는 점점 더 다중 존 환경에 배포돼요. 토폴로지 인지 라우팅은 트래픽이 발생한 존 안에 트래픽을 유지하는 데 도움이 되는 메커니즘을 제공해요. Service의 엔드포인트를 계산할 때 EndpointSlice 컨트롤러는 각 엔드포인트의 토폴로지(리전과 존)를 고려하고 이를 존에 할당하도록 hints 필드를 채워요. kube-proxy 같은 클러스터 컴포넌트는 그 hints를 사용해 트래픽을 라우팅하는 방식에 영향을 줄 수 있어요(토폴로지상 더 가까운 엔드포인트를 선호).
토폴로지 인지 라우팅 활성화하기
참고:
Service에 service.kubernetes.io/topology-mode 애노테이션을 Auto 로 설정하면 토폴로지 인지 라우팅을 활성화할 수 있어요. 각 존에 충분한 엔드포인트가 있으면 개별 엔드포인트를 특정 존에 할당하도록 Topology Hints가 EndpointSlice에 채워져, 트래픽이 발생한 곳과 더 가까운 곳으로 라우팅되게 해요.
가장 잘 동작하는 경우 (When it works best)
이 기능은 다음 경우에 가장 잘 동작해요:
1. 수신 트래픽이 고르게 분산되는 경우
트래픽의 큰 비율이 단일 존에서 발생하면, 그 트래픽이 그 존에 할당된 엔드포인트 부분집합을 과부하시킬 수 있어요. 수신 트래픽이 단일 존에서 발생할 것으로 예상되면 이 기능은 권장되지 않아요.
2. Service가 존당 3개 이상의 엔드포인트를 가진 경우
3존 클러스터에서 이는 9개 이상의 엔드포인트를 의미해요. 존당 3개 미만의 엔드포인트가 있으면 EndpointSlice 컨트롤러가 엔드포인트를 고르게 할당하지 못하고 대신 기본 클러스터 전체 라우팅 방식으로 폴백할 확률이 높아요(≈50%).
동작 방식 (How It Works)
"Auto" 휴리스틱은 각 존에 비례적으로 엔드포인트 수를 할당하려 해요. 이 휴리스틱은 엔드포인트가 상당히 많은 Service에 가장 잘 동작한다는 점을 기억해요.
EndpointSlice 컨트롤러
EndpointSlice 컨트롤러는 이 휴리스틱이 활성화될 때 EndpointSlice에 hints를 설정하는 책임을 져요. 컨트롤러는 각 존에 비례적인 엔드포인트 양을 할당해요. 이 비율은 그 존에서 실행되는 노드의 allocatable CPU 코어에 기반해요. 예를 들어 한 존에 CPU 코어 2개가 있고 다른 존에는 CPU 코어 1개만 있다면, 컨트롤러는 CPU 코어 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
kube-proxy 컴포넌트는 EndpointSlice 컨트롤러가 설정한 hints에 기반해 라우팅하는 엔드포인트를 필터링해요. 대부분의 경우 이는 kube-proxy가 같은 존의 엔드포인트로 트래픽을 라우팅할 수 있다는 뜻이에요. 때로는 컨트롤러가 존 사이에서 엔드포인트를 더 고르게 분산하기 위해 다른 존의 엔드포인트를 할당하기도 해요. 이로 인해 일부 트래픽이 다른 존으로 라우팅될 수 있어요.
안전장치 (Safeguards)
쿠버네티스 제어 플레인과 각 노드의 kube-proxy는 Topology Aware Hints를 사용하기 전에 몇 가지 안전장치 규칙을 적용해요. 이 규칙이 통과하지 못하면 kube-proxy는 존과 무관하게 클러스터 어디에서든 엔드포인트를 선택해요.
제약 사항 (Constraints)
커스텀 휴리스틱 (Custom heuristics)
쿠버네티스는 다양한 방식으로 배포되므로, 모든 사용 사례에 동작하는 엔드포인트를 존에 할당하는 단일 휴리스틱은 없어요. 이 기능의 핵심 목표는 내장 휴리스틱이 사용 사례에 맞지 않을 때 커스텀 휴리스틱을 개발할 수 있게 하는 것이에요. 커스텀 휴리스틱을 활성화하는 첫 단계는 1.27 릴리스에 포함됐어요. 이는 아직 일부 관련되고 그럴듯한 상황을 다루지 못할 수 있는 제한된 구현이에요.
더 알아보기 (Learn more)
- Service로 애플리케이션 연결하기 튜토리얼 따라 하기
service.kubernetes.io/topology-mode애노테이션과 밀접하게 관련되어 있고 쿠버네티스 안에서 트래픽 라우팅에 대한 유연한 옵션을 제공하는 trafficDistribution 필드 알아보기