Service Mesh

Istio - (5) Destination Rule 응용

Operation CWAL 2021. 4. 6. 22:03

Destination Rule

지금까지 실습 과정 중 Destination Rule은 Pod의 Label을 통해 서비스의 Subset을 분류하는데만 사용하였다. 하지만 Destination Rule을 설정하여 다음과 같이 더욱 정교한 트래픽 관리가 가능하다.

  • Load balancing(round robin, random, least connection)
  • Rate limiting(connection pool 크기 조절)
  • Circuit breaker(outlier detection)

 

Load balancing

DestinationRule이 정의되지 않은 서비스는 K8s Service의 L4 Load Balance가 적용된다.

Round Robin

DestinationRule에 trafficPolicy 항목을 따로 명시하지 않은 경우, 기본값으로 Round Robin을 사용한다. 아래는 Round Robin 방식이 적용된 DestinationRule 예시이다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews # name of a service from the service registry
#   trafficPolicy: # service-level routing policy
#       loadBalancer:
#         simple: ROUND_ROBIN

Random

건강한 상태의 host 중에서 하나를 무작위로 선택한다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
      loadBalancer:
        simple: RANDOM

Least Connection

두 개의 건강한 host를 무작위로 고른 뒤, 그중에서 현재 처리중인 request가 적은 host를 선택한다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy: # service-level routing policy
      loadBalancer:
        simple: LEAST_CONN

Subset 단위의 Load balancing 정책

전체 서비스에 기본 Load balancing 방식을 정하고, 다시 subset마다 별도의 방식을 부여하는 것도 가능하다. 예를 들어 다음과 같은 DestinationRule을 정의할 수 있다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
  subsets:
  - name: v1
    labels:
      version: v1
    trafficPolicy:
      loadBalancer:
        simple: LEAST_CONN
  - name: v2
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: RANDOM
  • 서비스 레벨에 ROUND_ROBIN 방식 적용
  • subset v1에 LEAST_CONN 방식 적용
  • subset v2에 RANDOM 방식 적용

 

Sticy Session

HTTP Cookie 값에 따라 항상 동일한 host와 연결되는 Sticky Session 방식을 사용할 수 있다. 다만 코드 레벨에서 헤더값에 대한 정의와 전달이 이루어저야 한다. 다음은 'user'라는 이름의 cookie에 대해 1800초 동안 Sticky Session을 유지하는 예시이다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
        consistentHash:
            httpCookie:
                name: user
                ttl: 1800s

 

Rate Limiting

Destination Rule을 통해 Connection Pool의 크기를 조정하여, DoS 공격 등을 차단할 수 있다. HTTP 또는 TCP 레벨의 설정이 가능하며, 다음은 reviews 서비스의 동시 연결 갯수를 100개로 제한하고, timeout을 30ms로 설정한 예시이다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  tcp:
    maxConnections: 100
    connectTimeout: 30ms
    tcpKeepalive:
      time: 7200s
      interval: 75s

 

Circuit Breaker

Istio는 문제가 발생한 Pod(outlier)을 Load Balancing Pool로부터 잠시 제외시키는 Circuit Breaker 기능을 제공한다. Outlier를 판단하는 기준은 다음과 같다.

  • HTTP 서비스: 주어진 시간 동안 연속으로 5xx 에러를 리턴
  • TCP 서비스: 계속해서 timeout 또는 연결 실패

 

다음은 1초마다 productpage 서비스 중 연속해서 2개 이상의 502, 503, 504 에러 코드를 발생시키는 Outlier를 탐지하여, 3분간 제외시키는 DestinationRule 예시이다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    outlierDetection:
      consecutiveErrors: 2
      interval: 1s
      baseEjectionTime: 3m 

 

K8s에서 기본 제공하는 Readiness Probe와 비슷한 개념이지만, 상대적으로 HTTP 에러에 더욱 민감하게 대응할 수 있기 때문에 두 기능을 제대로 활용할 경우 서비스 안정성을 더욱 향상시킬 수 있다.

 

'Service Mesh' 카테고리의 다른 글

Istio - (4) Traffic Management  (0) 2021.04.05
Istio - (3) Gateway와 VirtualService  (1) 2021.03.27
Istio - (2) Istio 설치(EKS)  (0) 2021.03.27
Istio - (1) Introduction  (0) 2021.03.27