Locality-aware Load Balancing은 요청을 처리할 때 지리상 가까운 인스턴스에 로드 밸런싱해서 응답 시간이 줄어드는 것을 기대할 수 있는 방법이다. Istio에서는 이 기능을 활용하여 다양한 지역의 트래픽을 효과적으로 관리할 수 있다. 물론 나는 Minikube이므로 정확한 환경을 셋티할 수 없지만 라벨링을 통해서 임시적으로 구성해보려고 한다.

 

 

Locality-aware load balancing 구현

구현 자체는 어렵지 않다. 먼저 Deployment에 라벨링을 수정해주자. 

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
istio-locality: us-east-1/us-east-1a # <-- AWS 기준
spec:
serviceAccountName: test
containers:
- images: {}
imagePullPolicy: IfNotPresent
name: test
ports:
- containerPort: 8080
name: http
protocol: TCP

 

이러면 us-east-1a의 라벨링이 붙게 되는데, 이렇게만 했을 때는 정상 동작하지 않는다. 그 이유는 Locality-aware가 동작하려면 헬스 체킹이 필수이기 때문이다. 즉 DestinationRule를 생성해줘야 한다.

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: test-destination-rule
spec:
host: test.default.svc.cluster.local
trafficPolicy:
outlierDetection:
consecutive5xxErrors: 1
interval: 10s
baseEjectionTime: 30s

 

이렇게 하면 10초에 한 번씩 헬스 체킹을 하게 되는데, 1번이라도 5xx 에러가 발생하면 30초동안 트래픽을 끊게 된다. 한 번 직접 테스트 해보면 좋을 거 같다.

 

Locality-aware load balancing 가중치

가중치 또한 줄 수 있는데, DesinationRule을 조금만 수정해주면 된다.

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: test-destination-rule
spec:
host: test.default.svc.cluster.local
trafficPolicy:
loadBalancer:
localityLbSetting:
distribute:
- from: us-east-1/us-east-1a/*
to:
"us-east-1/us-east-1a/*": 70
"us-east-1/us-east-1b/*": 30
connectionPool:
http:
http2MaxRequests: 10
maxRequestsPerConnection: 10
outlierDetection:
consecutive5xxErrors: 1
interval: 5s
baseEjectionTime: 30s
maxEjectionPercent: 100

 

이렇게하면 us-east-1a에서 오는 요청에 대해서 70%의 비율은 us-east-1a로 가게되고, 나머지 30은 us-east-1b로 가게 된다.