Kubernetes Tools/Istio

[Istio κ°€μ΄λ“œ ep.13] 2λΆ€ νŠΈλž˜ν”½ 관리 #7 | μ„œλΉ„μŠ€ 볡원λ ₯을 λ†’μ΄λŠ” 리트라이, νƒ€μž„μ•„μ›ƒ, Circuit Breaker μ„€μ •

ygtoken 2025. 3. 18. 11:40
728x90

πŸ”Ή κ°œμš”

이번 κΈ€μ—μ„œλŠ” 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): μ—°μ†λœ μž₯μ•  λ°œμƒ μ‹œ, 일정 μ‹œκ°„ λ™μ•ˆ ν•΄λ‹Ή μ„œλΉ„μŠ€λ‘œμ˜ μš”μ²­μ„ μ°¨λ‹¨ν•˜μ—¬ 전체 μ‹œμŠ€ν…œ 보호
  • μ„Έ κ°€μ§€ κΈ°λŠ₯을 μ‘°ν•©ν•˜λ©΄, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ν™˜κ²½μ—μ„œ 보닀 μ•ˆμ •μ μΈ μ„œλΉ„μŠ€ 운영이 κ°€λŠ₯

 

728x90