[Istio κ°μ΄λ ep.13] 2λΆ νΈλν½ κ΄λ¦¬ #7 | μλΉμ€ 볡μλ ₯μ λμ΄λ 리νΈλΌμ΄, νμμμ, Circuit Breaker μ€μ
πΉ κ°μ
μ΄λ² κΈμμλ Istioλ₯Ό νμ©νμ¬ μλΉμ€ 볡μλ ₯μ ν₯μμν€λ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
λ§μ΄ν¬λ‘μλΉμ€ νκ²½μμλ μΌμμ μΈ μ₯μ λ λ€νΈμν¬ λ¬Έμ λ‘ μΈν΄ μμ²μ΄ μ€ν¨νλ κ²½μ°κ° λ§μ΅λλ€.
Istioμ 리νΈλΌμ΄(Retry), νμμμ(Timeout), μν· λΈλ μ΄μ»€(Circuit Breaker) μ€μ μ νμ©νλ©΄,
μ΄λ¬ν λ¬Έμ λ₯Ό μ΅μννκ³ μλΉμ€μ κ°μ©μ±κ³Ό μμ μ±μ ν₯μμν¬ μ μμ΅λλ€.
μ΄ κΈμμλ κ° μ€μ μ κ°λ , μ¬μ© λ°©λ², κ·Έλ¦¬κ³ μ€μ YAML μμ λ₯Ό ν΅ν΄ μ€μ μ μ© λ°©λ²μ λ€λ£¨κ² μ΅λλ€.
πΉ 1. μλΉμ€ 볡μλ ₯ μ λ΅ κ°μ
β 1.1 리νΈλΌμ΄(Retry)
**리νΈλΌμ΄(Retry)**λ μΌμμ μΈ λ€νΈμν¬ μ₯μ λ μλ² μ€λ₯λ‘ μΈν΄ μμ²μ΄ μ€ν¨νμ λ, μλμΌλ‘ μ¬μλνλ κΈ°λ₯μ λλ€.
리νΈλΌμ΄μ μ£Όμ κΈ°λ₯
- μΌμμ μΈ μ€λ₯κ° λ°μνμ λ μμ²μ λ€μ μλ
- μ₯μ κ° μΌμμ μΈ κ²½μ°, μ 체 μλΉμ€ μ₯μ λ‘ μ΄μ΄μ§λ κ²μ λ°©μ§
- μ΅λ μ¬μλ νμ λ° κ°κ²©μ μ€μ νμ¬ λΆνμν μμ² λ¨λ° λ°©μ§
β 1.2 νμμμ(Timeout)
**νμμμ(Timeout)**μ μμ²μ΄ λ무 μ€λ 걸릴 κ²½μ°, μλμΌλ‘ μ’ λ£νμ¬ μμ€ν 리μμ€λ₯Ό 보νΈνλ κΈ°λ₯μ λλ€.
νμμμμ μ£Όμ κΈ°λ₯
- μλ΅ μκ°μ΄ λ무 κΈ΄ μμ²μ μλμΌλ‘ μ€λ¨νμ¬, μμ€ν κ³ΌλΆν λ°©μ§
- νΉμ μλΉμ€ μλ΅μ΄ λ¦μ΄μ§λ©΄ λΉ λ₯΄κ² μ€λ₯ μ²λ¦¬ κ°λ₯
- λ€λ₯Έ μλΉμ€κ° μν₯μ λ°μ§ μλλ‘ λ³΄νΈ
β 1.3 μν· λΈλ μ΄μ»€(Circuit Breaker)
**μν· λΈλ μ΄μ»€(Circuit Breaker)**λ μ°μλ μμ² μ€ν¨κ° λ°μν κ²½μ°, ν΄λΉ μλΉμ€λ₯Ό μΌμ μκ° λμ μ°¨λ¨νμ¬ μΆκ° μμ²μ λ°©μ§νλ κΈ°λ₯μ
λλ€.
μ΄λ μ₯μ κ° λ°μν μλΉμ€λ‘μ νΈλν½μ μΌμμ μΌλ‘ μ°¨λ¨νμ¬ μ 체 μμ€ν
μ₯μ λ₯Ό μλ°©νλ μν μ ν©λλ€.
μν· λΈλ μ΄μ»€μ μ£Όμ κΈ°λ₯
- μΌμ νμ μ΄μ μμ² μ€ν¨ μ, μλΉμ€λ‘μ μΆκ° μμ²μ μ°¨λ¨
- κ³ΌλΆν μνμ μλΉμ€λ‘μ μμ²μ λ°©μ§νμ¬ μ₯μ νμ°μ λ§μ
- μΌμ μκ°μ΄ μ§λλ©΄ μλμΌλ‘ λ€μ μμ²μ νμ©
πΉ 2. Istioλ₯Ό νμ©ν 리νΈλΌμ΄ μ€μ
β 2.1 κΈ°λ³Έ 리νΈλΌμ΄ μ€μ (VirtualService μ μ©)
μλ VirtualService μ€μ μ μμ²μ΄ μ€ν¨νμ λ, μ΅λ 3λ²κΉμ§ μ¬μλ(Retry)νλ μ€μ μ λλ€.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: v1
retries:
attempts: 3 # μ΅λ 3λ² μ¬μλ
perTryTimeout: 2s # κ° μμ²λΉ μ΅λ 2μ΄ λκΈ°
retryOn: "gateway-error,connect-failure,refused-stream" # νΉμ μ€λ₯ λ°μ μ 리νΈλΌμ΄ μν
μ€λͺ :
- retries.attempts: 3 → μμ² μ€ν¨ μ μ΅λ 3λ²κΉμ§ μ¬μλ
- retries.perTryTimeout: 2s → κ° μμ²μ μ΅λ 2μ΄ λμ λκΈ° ν μ¬μλ
- retries.retryOn → νΉμ μ€λ₯(gateway-error, connect-failure, refused-stream) λ°μ μ μ¬μλ
πΉ 3. Istioλ₯Ό νμ©ν νμμμ μ€μ
β 3.1 κΈ°λ³Έ νμμμ μ€μ (VirtualService μ μ©)
μλ VirtualService μ€μ μ μμ²μ΄ 5μ΄ μ΄μ 걸릴 κ²½μ° μλμΌλ‘ νμμμ μ²λ¦¬νλ μ€μ μ λλ€.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: v1
timeout: 5s # μ΅λ 5μ΄ λμ μλ΅ λκΈ°
μ€λͺ :
- timeout: 5s → μ΅λ 5μ΄ λμ μλ΅μ κΈ°λ€λ¦¬λ©°, μ΄κ³Ό μ μλμΌλ‘ μμ² μ’ λ£
πΉ 4. Istioλ₯Ό νμ©ν μν· λΈλ μ΄μ»€ μ€μ
β 4.1 κΈ°λ³Έ μν· λΈλ μ΄μ»€ μ€μ (DestinationRule μ μ©)
μλ DestinationRule μ€μ μ μν· λΈλ μ΄μ»€λ₯Ό νμ±ννμ¬ κ³ΌλΆν λ°©μ§νλ μμ μ λλ€.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service
spec:
host: my-service
trafficPolicy:
connectionPool:
http:
http1MaxPendingRequests: 5 # μ΅λ 5κ°μ μμ² λκΈ° κ°λ₯
maxRequestsPerConnection: 1 # μ°κ²°λΉ μ΅λ 1κ° μμ² μ²λ¦¬
outlierDetection:
consecutive5xxErrors: 3 # 5xx μ€λ₯κ° 3λ² μ°μ λ°μνλ©΄ μν· λΈλ μ΄μ»€ νμ±ν
interval: 10s # μ€λ₯ κ°μ§ μ£ΌκΈ° (10μ΄)
baseEjectionTime: 30s # μν· λΈλ μ΄μ»€κ° νμ±νλλ©΄ 30μ΄ λμ ν΄λΉ μλΉμ€λ‘μ μμ² μ°¨λ¨
μ€λͺ :
- connectionPool.http.http1MaxPendingRequests: 5 → μ΅λ 5κ°μ μμ²μ λκΈ° μνλ‘ μ μ§
- connectionPool.http.maxRequestsPerConnection: 1 → μ°κ²°λΉ μ΅λ 1κ° μμ²λ§ νμ©
- outlierDetection.consecutive5xxErrors: 3 → 5xx μ€λ₯κ° 3λ² μ°μ λ°μνλ©΄ μν· λΈλ μ΄μ»€ νμ±ν
- outlierDetection.interval: 10s → 10μ΄ κ°κ²©μΌλ‘ μ€λ₯ κ°μ§
- outlierDetection.baseEjectionTime: 30s → λ¬Έμ κ° λ°μν μλΉμ€λ 30μ΄ λμ μ°¨λ¨λ¨
πΉ 5. μλΉμ€ 볡μλ ₯ μ΅μ ν μ¬λ‘
1οΈβ£ 리νΈλΌμ΄ + νμμμ μ‘°ν©
- μλ΅ μκ°μ΄ κΈΈμ΄μ§ κ²½μ° μΌμ μκ° μμ μλ΅μ΄ μ€μ§ μμΌλ©΄ νμμμ μ μ©
- λ€νΈμν¬ μ€λ₯λ‘ μΈν΄ μμ²μ΄ μ€ν¨ν κ²½μ° μ¬μλ(Retry) μν
2οΈβ£ μν· λΈλ μ΄μ»€ μ μ© ν λ‘λ λ°Έλ°μ± μ΅μ ν
- νΉμ μλΉμ€μ μ₯μ κ°μ§ μ, νΈλν½μ μλμΌλ‘ μ°¨λ¨νμ¬ μ 체 μ₯μ λ₯Ό μλ°©
- κΈ°λ³Έμ μΌλ‘ Round Robin λ°©μμ λ‘λ λ°Έλ°μ±μ μ¬μ©νμ¬ μμ²μ κ³ λ₯΄κ² λΆμ°
π κ²°λ‘
- 리νΈλΌμ΄(Retry): μΌμμ μΈ μ₯μ λ°μ μ, μ΅λ μ§μ λ νμλ§νΌ μ¬μλ κ°λ₯
- νμμμ(Timeout): μλ΅ μκ°μ΄ λ무 κΈ΄ μμ²μ μλμΌλ‘ μ€λ¨νμ¬ λ¦¬μμ€ λλΉ λ°©μ§
- μν· λΈλ μ΄μ»€(Circuit Breaker): μ°μλ μ₯μ λ°μ μ, μΌμ μκ° λμ ν΄λΉ μλΉμ€λ‘μ μμ²μ μ°¨λ¨νμ¬ μ 체 μμ€ν 보νΈ
- μΈ κ°μ§ κΈ°λ₯μ μ‘°ν©νλ©΄, λ§μ΄ν¬λ‘μλΉμ€ νκ²½μμ λ³΄λ€ μμ μ μΈ μλΉμ€ μ΄μμ΄ κ°λ₯