Search

Istio Concept; Traffic Management

현재 기준 latest(1.20) 문서 참고
트래픽 관리라고 하는 것의 대표적인 예시는 다음이 있다:
회로 차단기(circuit breaker)
timeouts
A/B 테스트
canary, staged rollouts
% 기반 트래픽 분배

용어

Introducing Istio traffic management

트래픽 관리를 위해 서비스와 엔드포인트를 알아야 함 ← 쿠버네티스의 경우 istio를 잘 설치하면 알아 냄(svc , endpoint)
서비스 레지스트리 → envoy proxy → 트래픽을 제어
서비스 → 엔드포인트(로드밸런싱 풀); 기본적으로 least conn
트래픽 관리 API(=쿠버네티스 CRD)로 세세한 트래픽 구성 가능
A/B 테스트(% 기반 분배), least conn 외의 로드밸런싱 정책, …
메시 바깥의 트래픽에 규칙(rule) 적용, 메시 외부 종속성을 서비스 레지스트리에 추가, …
CRs(=API):

Virtual services

요청이 서비스로 라우팅 되는 방식 구성
연결과 검색은 istio + 플랫폼(쿠버네티스)에서 제공
destination rules와 함께 istio 트래픽 라우팅 기능의 핵심 요소
구성: 라우팅 규칙 셋
순서대로 평가 됨
메시 내 목적지(destination)에 요청을 일치

Why use virtual services?

virtual service 없는 (envoy) 기본 동작은 least conn이지만,
virtual service로 세세한 동작을 정의할 수 있다.
e.g. canary rollout
20% of calls go to the new version
calls from these users go to version 2
여러 서비스에 대한 같은 트래픽 정책을 하나의 virtual service로 할 수 있다
e.g. 네임스페이스 내의 모든 서비스에 대해 하나의 virtual service 적용
모놀리식 → 마이크로 서비스 전환에 사용
calls to these URIs of monolith.com go to microservice A
gateway와 조합하여 ingress/egree 트래픽 제어

Virtual service example

apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews # IPs, DNS names, ... wildcard(*) 사용 가능 http: # HTTPRoute; (tcp|tls) 도 사용 가능 - match: # HTTPMatchRequest - headers: end-user: exact: jason route: - destination: host: reviews # svc 이름. (FQDN 권장) subset: v2 - route: - destination: host: reviews subset: v3
YAML
복사
특정 사용자(jason)은 v2, 나머지는 v3로 라우팅
.spec.hosts : 호스트네임. “실제” 주소, 서비스 레지스트리 안에 구성될 필요 없음
.spec.http[].route[].destination.host : 서비스 레지스트리에 구성된 목적지(destination)
라우팅 규칙은 위에서부터 순서대로 평가 됨
virtual service에 항상 하나 이상의 일치 평가가 되도록 마지막 규칙에
default “no condition” 규칙을
또는 가중치 기반 규칙 사용 권장

More about routing rules

apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - bookinfo.com http: - match: - uri: prefix: /reviews route: - destination: host: reviews - match: - uri: prefix: /ratings route: - destination: host: ratings
YAML
복사
(ingress처럼) 하나의 호스트에서 uri(path) 조건을 줄 수 있음
옵션 exact, prefix, regex, …
spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 75 - destination: host: reviews subset: v2 weight: 25
YAML
복사
A/B 테스트를 위한 % 가중치 라우팅
그 외
헤더 추가/삭제
url rewrite(오!)
목적지마다 재시도 정책

Destination Rules

virtual service (routing rule) → destination. 이후 목적지에서 트래픽 제어 구성
virtual service routing rule 평가 후 “실제” 목적지에 적용
서비스 서브셋(특정 이름의 인스턴스 모음)으로 트래픽 제어
e.g. 서비스 버전별 라우팅
envoy 트래픽 정책 지정 가능
e.g. 로드밸런싱 모델
TLS 보안 모드
회로 차단기 설정

Load balancing options

(default) leat conn
random
weighted
rr

Destination rule example

apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-destination-rule spec: host: my-svc trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 trafficPolicy: loadBalancer: simple: ROUND_ROBIN - name: v3 labels: version: v3
YAML
복사
subsets마다 labels 가 쿠버네티스 서비스에 붙어? 식별한다.
subsets 이 아닌 전체에 trafficPolicy 를 지정할 수도, subsets 마다 지정할 수도 있다.

Gateways

메시 ingress/egress 트래픽에 대한 관리.
워크로드 사이드카 envoy가 아닌, 메시 끝단의 standalone envoy에 구성
vs. k8s Ingress
L4-6의 로드밸런싱 속성(포트, TLS, …)을 구성할 수 있다.
virtual services에 바인딩 할 수 있다
보통 ingress에 사용, egress 구성도 가능
e.g. 전용 출구 노드 구성, 보안 강화
기본적인 사전 구성 deploy 제공; istio-ingressgateway, istio-egressgateway
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: ext-host-gwy spec: selector: app: my-gateway-controller servers: - port: number: 443 name: https protocol: HTTPS hosts: - ext-host.example.com tls: mode: SIMPLE credentialName: ext-host-cert
YAML
복사
외부에서 ingress gateway에 대한 구성
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: virtual-svc spec: hosts: - ext-host.example.com gateways: - ext-host-gwy
YAML
복사
라우팅은 virtual service 의 .spec.gateways 로 구성 가능

Service Entries

서비스 레지스트리에 (쿠버네티스 svc, endpoint 외에) 추가로 등록하는 entry
메시의 서비스 중 하나로 여기게 됨
메시 바깥의 트래픽이 관리 가능해진다.
외부 목적지에 리다이렉션 또는 포워딩; web API, 레거시 인프라의 서비스
외부 목적지에 대한 재시도, timeout 또는 장애 주입 정책
VM에서 메시 운영
모든 외부 서비스를 메시에 등록하지 않아도 동작은 가능하다.
요청은 기본적으로 envoy를 통과함
다만, 제어는 불가하다.

Service entry example

apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: svc-entry spec: hosts: # 외부 서비스(의존성) 정의 - ext-svc.example.com ports: - number: 443 name: https protocol: HTTPS location: MESH_EXTERNAL resolution: DNS
YAML
복사
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ext-res-dr spec: host: ext-svc.example.com trafficPolicy: connectionPool: tcp: connectTimeout: 1s
YAML
복사
서비스 엔트리로 등록된 외부 서비스의 TCP 연결 timeout 제어

Sidecars

기본적으론 envoy 프록시는 워크로드의 모든 포트에서 트래픽을 받고, 모든 워크로드에 트래픽을 포워딩한다.
사이드카 구성으로 이를 제어할 수 있다:
트래픽을 받을 포트와 프로토콜 조정
envoy proxy가 도달할 서비스 셋 제한
특정 네임스페이스
특정 워크로드(workloadSelector)
apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: bookinfo spec: egress: - hosts: - "./*" - "istio-system/*"
YAML
복사

Network resilience and testing

런타임 동적 ‘옵트인 장애 복구’ 및 ‘장애 주입 기능’이 있다.
애플리케이션 reliability
메시의 장애 노드 toleration
국지적 장애 확산 방지

Timeouts

요청 후 서비스 hang 방지. 예측 가능한 시간 내에 성공이나 실패를 보장한다.
HTTP timout은 기본으로 비활성화 되어 있다.
virtual service routing rule에 구성 가능하다.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 timeout: 10s
YAML
복사

Retries

서비스 초기 요청이 실패했을 때, 다시 연결을 시도하는 최대 횟수를 구성할 수 있다.
일시적인 네트워크/서비스 과부하 시 요청이 실패하지 않도록 하는 장치이다.
재시도 간격(interval)은 랜덤(25ms+, istio가 판단)
HTTP 기본 재시도는 2번.
virtual service routing rule에 구성 가능하다.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 retries: attempts: 3 perTryTimeout: 2s
YAML
복사

Circuit breakers

서비스에 대한 요청 제한하는 메커니즘이다.
e.g. 동시 연결 수(concurrent connections)
실패한 요청 수
제한에 도달하면 “trip” 된다. → 더 이상 서비스로의 요청이 불가해진다.
서비스 과부하 방지
destination rule(”실제” 메시 목적지)에 구성 가능하다.
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews subsets: - name: v1 labels: version: v1 trafficPolicy: connectionPool: tcp: maxConnections: 100
YAML
복사

Fault injection

장애 복구 정책이 있는 네트워크를 테스트 할 수 있다.
테스트 대상(메트릭): 장애 복구 용량(failure recovery capacity)
같은 virtual service에 retry나 timeout과 같이 구성할 수 없다. (Virtual service with fault injection and retry/timeout policies not working as expected)
애플리케이션 계층의 장애 주입이 가능하다.
e.g. HTTP 오류 응답 코드
virtual service에 구성할 수 있는 두 가지 타입:
지연(delay): 타이밍 장애. 네트워크 지연이나 업스트립 서비스 과부하를 모방함.
중단(abort): 충돌(crash) 장애. 업스트림 장애를 모방함.
보통 HTTP 오류 코드나 TCP 연결 실패의 형태.
# 1/1000 비율로 5초 딜레이 발생 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - fault: delay: percentage: value: 0.1 fixedDelay: 5s route: - destination: host: ratings subset: v1
YAML
복사

Working with your applications

애플리케이션의 장애 복구 기능과 겹칠 수 있다.
e.g. 애플리케이션에서 2초의 timeout vs. envoy 3초 timout
→ envoy의 기능은 동작하지 않는다.
istio 장애 복구 기능은 “메시 수준에서 서비스 안정성과 가용성”을 높이지만,
애플리케이션에서 장애나 오류에 대한 처리가 필요하다.
e.g. 애플리케이션에서 503 fallback 처리가 있어야 한다.