본문 바로가기
WIKI 기술 지식 베이스

토폴로지 인지 라우팅 활성화

원문 보기 위키 갱신

토폴로지 인지 라우팅 활성화 (Enabling Topology Aware Routing)

토폴로지 인지 라우팅을 사용하면 서비스에 요청할 때 엔드포인트 선택 범위를 지정할 수 있어요. 크로스 존 엔드포인트 선택을 줄여 비용과 지연 시간을 낮출 수 있어요.

출처: Linkerd Enabling Topology Aware Routing

본문

토폴로지 인지 라우팅(topology aware routing)을 사용하면 서비스에 요청을 보낼 때 엔드포인트 선택 경계를 지정할 수 있어요. 이를 통해 크로스 존(cross-zone) 엔드포인트 선택을 제한하고, 관련 비용과 지연 시간을 낮출 수 있어요.

참고

안정판(stable) Linkerd를 사용 중이라면 토폴로지 인지 라우팅과 관련된 추가 기능이 있을 수 있어요 (예: Buoyant Enterprise for Linkerd와 그 HAZL 기능). 다양한 Linkerd 릴리스 종류에 대한 자세한 내용은 Releases and Versions 문서에서 확인할 수 있어요.

Linkerd에서 토폴로지 인지 라우팅을 성공적으로 활성화하려면 네 가지 요구사항이 있어요.

  • Kubernetes 클러스터에서 TopologyAwareHints 기능 게이트(FEATURE GATE)를 반드시 활성화해야 해요. (이 기능 게이트는 Kubernetes 1.24부터 기본 활성화돼요.)
  • Linkerd의 endpointSlice 기능을 반드시 켜야 해요. (Linkerd stable-2.12부터 기본값이에요.)
  • 각 Kubernetes 노드는 "topology.kubernetes.io/zone" 라벨을 사용해 특정 존에 배정되어야 해요.
  • 관련 Kubernetes 서비스에 service.kubernetes.io/topology-aware-hints=auto 어노테이션을 추가해 수정해야 해요.

Linkerd가 엔드포인트 슬라이스 세트를 받아 주소 세트로 변환할 때, 각 엔드포인트 슬라이스에 Hints.forZones 필드가 있다면 그 복사본을 만들어요. 이 필드는 엔드포인트 슬라이스 컨트롤러가 설정할 때만 존재하며, Kubernetes가 설정 전에 몇 가지 안전장치를 검사해요. 엔드포인트 슬라이스 컨트롤러가 forZones 필드를 설정하게 하려면 서비스에 service.kubernetes.io/topology-aware-hints=auto 어노테이션을 추가해야 해요.

엔드포인트가 주소 세트로 변환되고 엔드포인트 트랜슬레이터의 사용 가능한 엔드포인트가 갱신된 후에는, 요청 시 관련 주소 세트만 반환되도록 필터링이 적용돼요.

사용 가능한 엔드포인트 세트의 각 잠재 주소에 대해 Linkerd는 소비 존(consumption zone, forZones 필드의 존)이 노드의 존과 일치하는 주소 세트를 반환해요. 이렇게 함으로써 Linkerd는 클라이언트가 있는 노드와 동일한 노드로 엔드포인트 슬라이스 컨트롤러가 라벨링한 엔드포인트로만 통신을 제한하고, 크로스 노드 및 크로스 존 통신을 제한해요.

제약사항 (Constraints)

Linkerd에서 토폴로지 인지 라우팅을 활성화하기 전에, Kubernetes가 토폴로지 인지 라우팅에 두는 몇 가지 제약사항을 검토해야 해요.

주요 주의사항은 다음과 같아요.

  • 토폴로지 인지 라우팅은 특정 존으로 가는 트래픽이 그 존의 노드 용량에 대략 비례할 것이라고 가정해요. Horizontal Pod Autoscaler(HPA)를 사용할 때 HPA가 "잘못된" 존에 노드를 띄울 수 있으므로 주의가 필요해요.
  • internalTrafficPolicy가 Local로 설정된 서비스는 설계상 토폴로지 인지 라우팅을 무시해요.
  • control-plane이나 master 역할로 라벨링된 노드에서 실행되는 워크로드가 있다면, 토폴로지 인지 라우팅은 이 노드들의 엔드포인트로는 라우팅하지 않아요.

토폴로지 인지 라우팅 구성

관련 서비스의 Linkerd 프록시 로그를 보면 토폴로지 인지 라우팅이 성공적으로 동작하는지 확인할 수 있어요. 로그에는 아래와 비슷한 메시지 흐름이 보여야 해요.

time="2021-08-27T14:04:35Z" level=info msg="Establishing watch on endpoint [default/nginx-deploy-svc:80]" addr=":8086" component=endpoints-watcher
time="2021-08-27T14:04:35Z" level=debug msg="Filtering through addresses that should be consumed by zone zone-b" addr=":8086" component=endpoint-translator remote="127.0.0.1:49846" service="nginx-deploy-svc.default.svc.cluster.local:80"

더 알아보기 (Learn more)