Istio Hands-on Study [1기]

[3주차] 복원력(애플리케이션 네트워킹 문제 해결) : Locality-aware 로드 밸런싱

구구달스 2025. 4. 20. 21:11

🌍 Istio로 지역 기반
Locality-Aware Load Balancing 구현하기

서비스가 여러 지역에 배포되어 있을 때, 요청을 가장 가까운 곳으로 보내는 것은 성능과 비용 면에서 매우 중요합니다.

Locality-Aware Load Balancing은 Istio가 서비스의 위치 정보를 활용해 요청을 최적의 엔드포인트로 보내는 기능입니다.


🗺️ Locality-Aware Load Balancing이란?

  • Istio의 Control Plane은 서비스들의 위치와 네트워크 토폴로지를 파악해, 이를 기반으로 요청을 효율적으로 분배합니다. Locality-Aware Load Balancing은 서비스가 배포된 Region이나 Availability Zone을 고려해, 가까운 위치의 서비스에 우선적으로 요청을 보내는 방식입니다.
  • 예를 들어, simple-backend 서비스가 us-west, us-east, europe-west 지역에 배포되어 있고, simple-web이 us-west에 있다면, Istio는 us-west에 있는 simple-backend로 요청을 우선 보냅니다. 이렇게 하면 지연 시간(Latency) 과 지역 간 트래픽 비용을 줄일 수 있습니다.
Locality-Aware Load Balancing은 서비스의 지역 정보를 활용해 가까운 엔드포인트로 요청을 보내,
지연 시간과 비용을 최적화합니다.

그림 : simple-web이 us-west 지역에 있을 때, 같은 지역의 simple-backend로 요청이 우선적으로 전달되는 과정


🌍 Istio로 Locality-Aware Load Balancing 실습하기

서비스가 여러 지역에 흩어져 있을 때, 요청을 가장 가까운 엔드포인트로 보내는 것은 성능과 비용을 최적화하는 데 필수적입니다. Istio의 Locality-Aware Load Balancing은 서비스의 위치 정보를 활용해 이를 가능하게 합니다. 


🗺️ Locality-Aware Load Balancing 설정 준비

  • Istio는 서비스가 배포된 Region과 Zone 정보를 활용해 요청을 가까운 엔드포인트로 우선 보냅니다.
    Kubernetes에서는 노드에 특정 라벨을 추가해 이 정보를 제공합니다.

Kubernetes 노드 라벨

  • 노드에 추가되는 위치 정보 라벨은 다음과 같습니다:
    • 구형 라벨: failure-domain.beta.kubernetes.io/region, failure-domain.beta.kubernetes.io/zone
    • 신형 라벨: topology.kubernetes.io/region, topology.kubernetes.io/zone
  • 클라우드 제공자(예: Google Cloud, AWS)는 보통 이러한 라벨을 자동으로 추가합니다.
    Istio는 이 라벨을 읽어 Envoy의 Load Balancing에 위치 정보를 반영합니다
Kubernetes 노드 라벨 또는 istio-locality 라벨을 사용해 서비스의 지역 정보를 지정하면,
Istio가 이를 기반으로 Locality-Aware Load Balancing을 수행합니다.

🚀 서비스 배포와 Locality 설정

  • simple-web와 simple-backend 서비스를 배포해 Locality-Aware Load Balancing을 테스트합니다.
  • 배포는 다음과 같이 설정합니다:
    • simple-web: us-west1-a
    • simple-backend-1: us-west1-a (같은 Zone)
    • simple-backend-2: us-west1-b (다른 Zone)
  • 다음은 simple-web의 Deployment 예시입니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ cat ch6/simple-service-locality.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: simple-web
  name: simple-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: simple-web
  template:
    metadata:
      labels:
        app: simple-web
        istio-locality: us-west1.us-west1-a
    spec:
      serviceAccountName: simple-web
      containers:
      - env:
        - name: "LISTEN_ADDR"
          value: "0.0.0.0:8080"
        - name: "UPSTREAM_URIS"
          value: "http://simple-backend:80/"
        - name: "SERVER_TYPE"
          value: "http"
        - name: "NAME"
          value: "simple-web"
        - name: "MESSAGE"
          value: "Hello from simple-web!!!"
        - name: KUBERNETES_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: nicholasjackson/fake-service:v0.14.1
        imagePullPolicy: IfNotPresent
        name: simple-web
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        securityContext:
          privileged: false
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: simple-backend
  name: simple-backend-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: simple-backend
  template:
    metadata:
      labels:
        app: simple-backend
        istio-locality: us-west1.us-west1-a
        version: v1 #추가
    spec:
      serviceAccountName: simple-backend
      containers:
      - env:
        - name: "LISTEN_ADDR"
          value: "0.0.0.0:8080"
        - name: "SERVER_TYPE"
          value: "http"
        - name: "NAME"
          value: "simple-backend"
        - name: "MESSAGE"
          value: "Hello from simple-backend-1"
        - name: "TIMING_VARIANCE"
          value: "40ms"
        - name: "TIMING_50_PERCENTILE"
          value: "150ms"
        - name: KUBERNETES_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: nicholasjackson/fake-service:v0.14.1
        imagePullPolicy: IfNotPresent
        name: simple-backend
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        securityContext:
          privileged: false
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: simple-backend
  name: simple-backend-2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: simple-backend
  template:
    metadata:
      labels:
        app: simple-backend
        istio-locality: us-west1.us-west1-b
        version: v2 #추가
    spec:
      serviceAccountName: simple-backend
      containers:
      - env:
        - name: "LISTEN_ADDR"
          value: "0.0.0.0:8080"
        - name: "SERVER_TYPE"
          value: "http"
        - name: "NAME"
          value: "simple-backend"
        - name: "MESSAGE"
          value: "Hello from simple-backend-2"
        - name: "TIMING_VARIANCE"
          value: "10ms"
        - name: "TIMING_50_PERCENTILE"
          value: "150ms"
        - name: KUBERNETES_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: nicholasjackson/fake-service:v0.14.1
        imagePullPolicy: IfNotPresent
        name: simple-backend
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        securityContext:
          privileged: false
  • 서비스를 배포합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f ch6/simple-service-locality.yaml -n istioinaction
deployment.apps/simple-web configured
deployment.apps/simple-backend-1 configured
deployment.apps/simple-backend-2 configured

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl get deployment.apps/simple-backend-1 -n istioinaction \
-o jsonpath='{.spec.template.metadata.labels.istio-locality}{"\n"}'
us-west1.us-west1-a

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl get deployment.apps/simple-backend-2 -n istioinaction \
-o jsonpath='{.spec.template.metadata.labels.istio-locality}{"\n"}'
us-west1.us-west1-b
  • Istio의 Locality-Aware Load Balancing은 기본적으로 활성화되어 있습니다.
    비활성화하려면 meshConfig.localityLbSetting.enabled를 false로 설정하면 됩니다.
istio-locality 라벨을 사용해 서비스의 위치를 지정하고,
Locality-Aware Load Balancing을 활성화해 같은 지역의 엔드포인트로 요청을 우선 보냅니다.

⚠️ Locality-Aware Load Balancing의 주의점

  • Locality-Aware Load Balancing은 기본적으로 유용하지만, 특정 상황에서는 조정이 필요할 수 있습니다.
    예를 들어, 특정 지역에 타겟 서비스(simple-backend)의 인스턴스가 호출 서비스(simple-web)보다 적을 경우, 해당 지역의 서비스가 과부하될 수 있습니다.
  • 서비스 토폴로지와 부하 특성에 따라 Load Balancing 설정을 최적화해야 합니다.
Locality-Aware Load Balancing은 기본적으로 활성화되어 있지만,
서비스 배포 상황에 따라 과부하를 피하기 위해 조정이 필요할 수 있습니다.

🔍 Locality-Aware Load Balancing 테스트

  • 이제 simple-web에서 simple-backend로 요청을 보내 테스트합니다.
    simple-web과 simple-backend-1은 us-west1-a에, simple-backend-2는 us-west1-b에 있으므로, 요청은 주로 simple-backend-1로 가야 합니다.
  • 다음 명령어로 10번 호출해 결과를 확인합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ for in in {1..10}; do curl -s http://simple-web.istioinaction.io:30000 | jq ".upstream_calls[0].body"; done
"Hello from simple-backend-1"
"Hello from simple-backend-2"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-1"
"Hello from simple-backend-2"
"Hello from simple-backend-1"

결과 분석

  • 예상과 달리, 요청이 simple-backend-1(us-west1-a)과 simple-backend-2(us-west1-b)에 고르게 분배되었습니다.
    이는 Health Checking이 설정되지 않아 Istio가 지역 정보를 무시하고 모든 엔드포인트에 요청을 분배했기 때문입니다.
Health Checking이 없으면 Locality-Aware Load Balancing이 작동하지 않아
요청이 모든 엔드포인트에 분배됩니다.

🩺 Outlier Detection으로 Health Checking 추가

  • Outlier Detection은 엔드포인트의 건강 상태를 수동적으로 모니터링비정상 엔드포인트를 제외합니다.
    이를 통해 Locality-Aware Load Balancing이 제대로 작동하도록 만듭니다.
    simple-backend에 Outlier Detection을 추가하는 DestinationRule을 설정합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ cat ch6/simple-backend-dr-outlier.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: simple-backend-dr
spec:
  host: simple-backend.istioinaction.svc.cluster.local
  trafficPolicy: 
    outlierDetection: ##불안정한 인스턴스를 감지하고 트래픽 풀에서 제외하는 설정
      consecutive5xxErrors: 1 #인스턴스를 이상치로 간주하기 위한 연속 5xx 에러 응답 횟수로, 단 한 번의 5xx 에러로도 해당 인스턴스를 이상치로 판단
      interval: 5s #이상치 분석 간격으로, 5초마다 검사
      baseEjectionTime: 30s #이상치로 판단된 인스턴스가 트래픽 풀에서 제외되는 기본 시간으로, 30초 동안 트래픽을 받지 않습니다.
      maxEjectionPercent: 100 #한 번에 제외될 수 있는 인스턴스의 최대 비율로, 100%는 모든 인스턴스가 동시에 제외될 수 있음을 의미합니다.
  • 설정을 적용합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f ch6/simple-backend-dr-outlier.yaml -n istioinactionoutlier.yaml -n istioinaction
destinationrule.networking.istio.io/simple-backend-dr configured
  • 다시 테스트를 실행합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ for in in {1..10}; do curl -s http://simple-web.istioinaction.io:30000 | jq ".upstream_calls[0].body"; done
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
  • 이제 모든 요청이 simple-backend-1(us-west1-a)로 전달됩니다.
    Outlier Detection이 건강한 엔드포인트를 선택해 Locality-Aware Load Balancing이 제대로 작동한 것입니다.

Outlier Detection을 추가하면 Istio가 건강한 엔드포인트를 우선 선택해
Locality-Aware Load Balancing이 동일 지역으로 요청을 정확히 보냅니다.

🛑 비정상 엔드포인트 테스트

  • 이제 simple-backend-1이 비정상적으로 동작하도록 설정해, 트래픽이 다른 지역(us-west1-b)의 simple-backend-2로 넘어가는지 확인합니다.
    simple-backend-1이 모든 요청에 대해 HTTP 500 에러를 반환하도록 설정합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ cat ch6/simple-service-locality-failure.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: simple-backend
  name: simple-backend-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: simple-backend
  template:
    metadata:
      labels:
        app: simple-backend
        istio-locality: us-west1.us-west1-a
    spec:
      serviceAccountName: simple-backend
      containers:
      - env:
        - name: "LISTEN_ADDR"
          value: "0.0.0.0:8080"
        - name: "SERVER_TYPE"
          value: "http"
        - name: "NAME"
          value: "simple-backend"
        - name: "MESSAGE"
          value: "Hello from simple-backend-1"
        - name: "ERROR_TYPE"
          value: "http_error"
        - name: "ERROR_RATE"
          value: "1"
        - name: "ERROR_CODE"
          value: "500"
        - name: KUBERNETES_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: nicholasjackson/fake-service:v0.14.1
        imagePullPolicy: IfNotPresent
        name: simple-backend
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        securityContext:
          privileged: false
          
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f ch6/simple-service-locality-failure.yaml -n istioinaction
deployment.apps/simple-backend-1 configured
  • 다시 테스트를 실행합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ for in in {1..10}; do curl -s http://simple-web.istioinaction.io:30000 | jq ".upstream_calls[0].body"; done
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
"Hello from simple-backend-2"
  • 이제 모든 요청이 simple-backend-2(us-west1-b)로 전달됩니다.
    simple-backend-1이 HTTP 500 에러를 반환하며 비정상으로 표시되었기 때문에, Istio는 다음으로 가까운 지역(us-west1-b)의 엔드포인트로 트래픽을 보낸 것입니다.
비정상 엔드포인트가 감지되면 Istio는 Locality-Aware Load Balancing을 통해
다음으로 가까운 지역의 건강한 엔드포인트로 트래픽을 전환합니다.

📌핵심 요약

  • Istio의 Locality-Aware Load Balancing서비스의 지역 정보를 활용가까운 엔드포인트로 요청을 보내 지연 시간과 비용을 줄입니다.
  • Kubernetes 노드 라벨(topology.kubernetes.io/region, topology.kubernetes.io/zone) 또는 istio-locality 라벨을 사용해 위치를 지정할 수 있습니다.
  • 실습에서는 simple-web와 simple-backend-1을 us-west1-a에, simple-backend-2를 us-west1-b에 배포했습니다.
  • 초기 테스트에서는 Health Checking이 없어 요청이 모든 엔드포인트에 분배되었지만, Outlier Detection을 추가한 후 요청이 us-west1-a의 simple-backend-1로 정확히 전달되었습니다.
  • simple-backend-1을 비정상 상태로 만들자 트래픽이 us-west1-b의 simple-backend-2로 전환되었습니다.
  • 이를 통해 Locality-Aware Load Balancing건강 상태와 지역 정보를 기반으로 트래픽을 효과적으로 관리함을 확인했습니다.

⚖️ Istio로 가중치를 활용한
Locality-Aware Load Balancing 제어하기

Istio의 Locality-Aware Load Balancing은 기본적으로 요청을 같은 지역의 엔드포인트로 보내지만, 상황에 따라 트래픽을 여러 지역에 분배해야 할 때도 있습니다.

Weighted Distribution을 사용해 지역 간 트래픽 비율을 조정하는 방법을 설명합니다.


🌍 Weighted Locality-Aware Load Balancing이란?

  • 기본적으로 Istio는 모든 트래픽을 같은 지역(예: us-west1-a)의 서비스로 보내고, 엔드포인트가 비정상일 때만 다른 지역(예: us-west1-b)으로 트래픽을 전환합니다.
    하지만 특정 지역의 서비스가 과부하될 가능성이 있을 때, Weighted Distribution을 사용해 트래픽을 여러 지역에 미리 분배할 수 있습니다. 이를 통해 피크 트래픽이나 계절적 부하를 더 효과적으로 관리할 수 있습니다.
  • 예를 들어, simple-backend 서비스의 트래픽을 us-west1-a로 70%, us-west1-b로 30% 분배하도록 설정할 수 있습니다.
    이는 simple-backend-1(us-west1-a)로 70%, simple-backend-2(us-west1-b)로 30%가 가는 것을 의미합니다.
Weighted Locality-Aware Load Balancing은 트래픽을 지역별로 가중치를 설정해 분배하며,
과부하를 방지하고 안정성을 높입니다.

 

그림 : 트래픽을 us-west1-a와 us-west1-b에 각각 70%와 30%로 분배하는 Weighted Locality-Aware Load Balancing 설정


🛠️ 정상 서비스로 복구하기

  • 이전 실습에서 simple-backend-1을 비정상 상태(HTTP 500 에러)로 설정했으므로,
    먼저 모든 서비스가 정상적으로 HTTP 200 응답을 반환하도록 복구합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f ch6/simple-service-locality.yaml -n istioinaction
deployment.apps/simple-web unchanged
deployment.apps/simple-backend-1 configured
deployment.apps/simple-backend-2 unchanged
  • 이제 simple-web, simple-backend-1, simple-backend-2 모두 정상적으로 동작합니다.
    이를 기반으로 Weighted Distribution을 설정합니다.
테스트를 시작하기 위해 모든 서비스를 정상 상태로 복구하여
Weighted Locality-Aware Load Balancing을 정확히 테스트할 준비를 합니다.

⚙️ Weighted Distribution 설정하기

  • 특정 지역(예: us-west1-a)의 서비스가 부하를 감당하지 못할 경우, 트래픽의 일부를 다른 지역(예: us-west1-b)으로 분배하도록 설정합니다.
    목표는 simple-backend 서비스의 트래픽을 us-west1-a로 70%, us-west1-b로 30% 분배하는 것입니다.
  • 이를 위해 DestinationRule에 localityLbSetting을 추가해 가중치를 설정합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ cat ch6/simple-backend-dr-outlier-locality.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: simple-backend-dr
spec:
  host: simple-backend.istioinaction.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      localityLbSetting:
        distribute:
        - from: us-west1/us-west1-a/* #트래픽의 출발 지역
          to: #트래픽 분배 비율을 정의
            "us-west1/us-west1-a/*": 70 #같은 지역의 a 영역으로 70%의 트래픽 전송
            "us-west1/us-west1-b/*": 30 # 30% - b 영역으로 30%의 트래픽 전송
    connectionPool:
      http:
        http2MaxRequests: 10 # HTTP/2 연결당 최대 10개의 요청을 허용
        maxRequestsPerConnection: 10 #각 연결에서 처리할 수 있는 최대 요청 수로, 10개 요청 후 연결이 닫힙니다.
    outlierDetection:
      consecutive5xxErrors: 1
      interval: 5s
      baseEjectionTime: 30s
      maxEjectionPercent: 100
  • 설정을 적용합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f ch6/simple-backend-dr-outlier-locality.yaml -n istioinaction
destinationrule.networking.istio.io/simple-backend-dr configured
DestinationRule의 localityLbSetting을 사용해 트래픽을
us-west1-a로 70%, us-west1-b로 30% 분배하도록 설정합니다.

🔍 Weighted Distribution 테스트

  • 이제 설정이 적용되었는지 확인하기 위해 simple-web 서비스를 호출합니다.
    트래픽이 simple-backend-1(us-west1-a)로 약 70%, simple-backend-2(us-west1-b)로 약 30% 분배되어야 합니다.
  • 다음 명령어로 10번 호출해 결과를 확인합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ for in in {1..10}; do curl -s http://simple-web.istioinaction.io:30000 | jq ".upstream_calls[0].body"; done
"Hello from simple-backend-1"
"Hello from simple-backend-2"
"Hello from simple-backend-1"
"Hello from simple-backend-2"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-1"
"Hello from simple-backend-2"
"Hello from simple-backend-1"
"Hello from simple-backend-2"
  • 결과를 보면, 대부분의 요청이 simple-backend-1(us-west1-a)로 갔지만, 일부 요청이 simple-backend-2(us-west1-b)로 분배되었습니다. 이는 설정한 70:30 비율과 대략 일치합니다.

Weighted Distribution 설정을 통해 트래픽이
us-west1-a로 약 70%, us-west1-b로 약 30% 분배되어 과부하를 방지합니다.

🆚 Weighted Distribution과 Traffic Routing의 차이

  • Weighted Locality-Aware Load Balancing은 Traffic Routing(예: Chapter 5에서 다룬 버전별 트래픽 제어)과 다릅니다:
    • Weighted Distribution: 서비스의 토폴로지(지역 정보) 를 기반으로 트래픽을 분배합니다.
                                             특정 지역의 부하를 조정하는 데 유용합니다.
    • Traffic Routing: 서비스의 서브셋(버전, 클래스) 을 기준으로 트래픽을 제어합니다.
                                 특정 버전의 서비스로 트래픽을 보내는 데 사용됩니다.
  • 이 두 개념은 상호 배타적이지 않으며, 함께 사용해 더 정교한 트래픽 관리를 할 수 있습니다.
    Locality-Aware Load Balancing으로 지역별 트래픽을 분배한 후, Traffic Routing으로 특정 버전의 서비스를 선택할 수 있습니다.
Weighted Distribution 은 지역 기반 트래픽 분배를,
Traffic Routing 은 서비스 버전별 트래픽 제어를 담당하며,
둘을 조합해 더 세밀한 트래픽 관리가 가능합니다.

📌핵심 요약

  • Istio의 Weighted Locality-Aware Load Balancing트래픽을 지역별로 가중치를 설정해 분배하는 기능으로, 피크 트래픽이나 계절적 부하를 관리하는 데 유용합니다.
  • 실습에서는 simple-backend 서비스의 트래픽을 us-west1-a(simple-backend-1)로 70%, us-west1-b(simple-backend-2)로 30% 분배하도록 DestinationRule에 localityLbSetting을 설정했습니다. 테스트 결과, 트래픽이 설정한 비율에 따라 분배되어 과부하를 방지할 수 있음을 확인했습니다.
  • 이는 Traffic Routing과 달리 서비스 토폴로지를 기반으로 작동하며, 두 기능을 조합해 더 정교한 트래픽 관리가 가능합니다. Locality-Aware Load Balancing은 서비스 안정성과 성능을 최적화하는 강력한 도구입니다.