멀티클러스터 트래픽 관리
멀티클러스터 트래픽 관리 (Multi-cluster Traffic Management)
멀티클러스터 메시에서는 클러스터 토폴로지에 특화된 트래픽 규칙이 필요할 수 있어요. 이 문서는 멀티클러스터 메시에서 트래픽을 관리하는 몇 가지 방법을 배워요.
출처: Istio 문서
본문
멀티클러스터 메시 내에서는 클러스터 토폴로지에 특화된 트래픽 규칙이 바람직할 수 있어요. 이 문서는 멀티클러스터 메시에서 트래픽을 관리하는 몇 가지 방법을 설명해요. 이 가이드를 읽기 전에:
- Deployment Models를 읽으세요.
- 배포된 서비스들이 네임스페이스 동일성(namespace sameness) 개념을 따르는지 확인하세요.
트래픽을 클러스터 내부로 유지하기
어떤 경우에는 기본 크로스클러스터 로드 밸런싱 동작이 바람직하지 않아요. 트래픽을 "클러스터 로컬"(즉 cluster-a에서 보낸 트래픽은 cluster-a의 목적지에만 도달)로 유지하려면 MeshConfig.serviceSettings를 사용해 호스트네임이나 와일드카드를 clusterLocal로 표시하세요.
예를 들어 개별 서비스, 특정 네임스페이스의 모든 서비스, 또는 메시의 모든 서비스에 대해 전역적으로 클러스터 로컬 트래픽을 강제할 수 있어요.
serviceSettings:
- settings:
clusterLocal: true
hosts:
- "mysvc.myns.svc.cluster.local"
serviceSettings:
- settings:
clusterLocal: true
hosts:
- "*.myns.svc.cluster.local"
serviceSettings:
- settings:
clusterLocal: true
hosts:
- "*"
전역 클러스터 로컬 규칙을 설정하고 명시적 예외(특정 또는 와일드카드)를 추가해서 서비스 접근을 더 세밀하게 조정할 수도 있어요. 다음 예제에서는 myns 네임스페이스의 서비스를 제외한 클러스터의 모든 서비스가 클러스터 로컬로 유지돼요.
serviceSettings:
- settings:
clusterLocal: true
hosts:
- "*"
- settings:
clusterLocal: false
hosts:
- "*.myns.svc.cluster.local"
서비스 분할
DestinationRule.subsets는 라벨을 선택해 서비스를 분할할 수 있게 해줘요. 이 라벨들은 쿠버네티스 메타데이터의 라벨이거나 내장 라벨일 수 있어요. 내장 라벨 중 하나인 topology.istio.io/cluster를 DestinationRule의 subset selector에서 사용하면 클러스터별 subset을 만들 수 있어요.
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: mysvc-per-cluster-dr
spec:
host: mysvc.myns.svc.cluster.local
subsets:
- name: cluster-1
labels:
topology.istio.io/cluster: cluster-1
- name: cluster-2
labels:
topology.istio.io/cluster: cluster-2
이 subset들을 사용해 mirroring이나 shifting 같은 클러스터 기반의 다양한 라우팅 규칙을 만들 수 있어요.
또한 VirtualService에서 목적지 subset을 제한해 클러스터 로컬 트래픽 규칙을 만드는 또 다른 옵션을 제공해요.
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: mysvc-cluster-local-vs
spec:
hosts:
- mysvc.myns.svc.cluster.local
http:
- name: "cluster-1-local"
match:
- sourceLabels:
topology.istio.io/cluster: "cluster-1"
route:
- destination:
host: mysvc.myns.svc.cluster.local
subset: cluster-1
- name: "cluster-2-local"
match:
- sourceLabels:
topology.istio.io/cluster: "cluster-2"
route:
- destination:
host: mysvc.myns.svc.cluster.local
subset: cluster-2
이런 방식으로 subset 기반 라우팅을 사용해 클러스터 로컬 트래픽을 제어하는 것은, MeshConfig.serviceSettings와 달리, 서비스 수준 정책과 토폴로지 수준 정책을 섞는다는 단점이 있어요. 예를 들어 서비스의 v2로 트래픽의 10%를 보내는 규칙은 두 배의 subset 수(예: cluster-1-v2, cluster-2-v2)가 필요해요. 이 방식은 클러스터 기반 라우팅에 대한 더 세밀한 제어가 필요한 상황으로 제한하는 것이 가장 좋아요.