Kubernetes Tools/Istio

[Istio κ°€μ΄λ“œ ep.35] 5λΆ€ 운영 및 μ΅œμ ν™” #5 | Istio λΉ„μš© 절감 및 μ„±λŠ₯ νŠœλ‹ κ°€μ΄λ“œ

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

πŸ”Ή κ°œμš”

이번 κΈ€μ—μ„œλŠ” Istio의 운영 λΉ„μš©μ„ μ ˆκ°ν•˜κ³ , μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
IstioλŠ” μ„œλΉ„μŠ€ λ©”μ‹œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” κ°•λ ₯ν•œ λ„κ΅¬μ§€λ§Œ,
잘λͺ»λœ μ„€μ •μœΌλ‘œ 인해 λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€ μ‚¬μš© 증가 및 운영 λΉ„μš© μƒμŠΉμ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” Istio의 λΉ„μš©μ„ μ€„μ΄λŠ” μ΅œμ ν™” μ „λž΅, λ¦¬μ†ŒμŠ€ νš¨μœ¨ν™” 및 μ‹€μ „ 적용 사둀λ₯Ό μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.


πŸ”Ή 1. Istio 운영 λΉ„μš©μ΄ μ¦κ°€ν•˜λŠ” 원인

Istio 운영 λΉ„μš©μ΄ μ¦κ°€ν•˜λŠ” μ£Όμš” 원인은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

βœ… 1.1 λΆˆν•„μš”ν•œ Sidecar Proxy μ‚¬μš©

  • λͺ¨λ“  Pod에 Sidecar(Envoy Proxy)λ₯Ό μ£Όμž…ν•˜λ©΄ CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.
  • λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½μ΄ μ κ±°λ‚˜ Sidecarκ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ μ„œλΉ„μŠ€μ—λ„ μžλ™μœΌλ‘œ μ£Όμž…λ˜λ©΄ λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€ λ‚­λΉ„κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ ν•΄κ²° 방법: λΆˆν•„μš”ν•œ Sidecar μ£Όμž…μ„ λ°©μ§€ν•˜κ³ , νŠΉμ • λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œλ§Œ Sidecarλ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.


βœ… 1.2 κ³Όλ„ν•œ λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½ λ‘œκΉ…

  • 기본적으둜 IstioλŠ” λͺ¨λ“  νŠΈλž˜ν”½ 둜그λ₯Ό μˆ˜μ§‘ 및 μ €μž₯ν•©λ‹ˆλ‹€.
  • νŠΈλž˜ν”½ λ‘œκ·Έκ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ λ””μŠ€ν¬ μ‚¬μš©λŸ‰κ³Ό λ‘œκΉ… λΉ„μš©μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.

πŸ’‘ ν•΄κ²° 방법: ν•„μš”ν•œ 둜그만 μ €μž₯ν•˜κ³ , κ³Όλ„ν•œ νŠΈλž˜ν”½ λ‘œκΉ…μ„ λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€.


βœ… 1.3 Envoy Proxy λ¦¬μ†ŒμŠ€ κ³Όλ‹€ μ‚¬μš©

  • Envoy ProxyλŠ” λ„€νŠΈμ›Œν¬ μš”μ²­μ„ μ²˜λ¦¬ν•˜λ©΄μ„œ CPU 및 λ©”λͺ¨λ¦¬λ₯Ό μ†ŒλΉ„ν•©λ‹ˆλ‹€.
  • μš”μ²­μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ Envoy Proxyκ°€ ν΄λŸ¬μŠ€ν„°μ—μ„œ μ°¨μ§€ν•˜λŠ” λ¦¬μ†ŒμŠ€κ°€ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ ν•΄κ²° 방법: Envoy Proxy의 Keepalive 및 Connection Pool 섀정을 μ΅œμ ν™”ν•˜μ—¬ λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€ μ‚¬μš©μ„ 쀄여야 ν•©λ‹ˆλ‹€.


πŸ”Ή 2. Istio λΉ„μš© μ ˆκ°μ„ μœ„ν•œ μ΅œμ ν™” 방법

βœ… 2.1 λΆˆν•„μš”ν•œ Sidecar μžλ™ μ£Όμž… λ°©μ§€

λͺ¨λ“  λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— Sidecarλ₯Ό μžλ™ μ£Όμž…ν•˜λŠ” 것은 λΉ„νš¨μœ¨μ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ ν•„μš”ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œλ§Œ Sidecarλ₯Ό ν™œμ„±ν™”ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

kubectl label namespace default istio-injection=enabled
kubectl label namespace kube-system istio-injection=disabled

πŸ’‘ νŠΉμ • λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œλ§Œ Sidecar μ£Όμž…μ„ ν™œμ„±ν™”ν•˜λ©΄ λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€ μ‚¬μš©μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.


βœ… 2.2 Sidecar λ¦¬μ†ŒμŠ€ μ œν•œ μ„€μ •

Sidecar Proxy(Envoy)의 CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ œν•œν•˜λ©΄ λΉ„μš©μ„ μ ˆκ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  template:
    spec:
      containers:
        - name: my-app
          image: my-app:v1
        - name: istio-proxy
          resources:
            requests:
              cpu: "100m"   # μ΅œμ†Œ 100m CPU μš”μ²­
              memory: "256Mi" # μ΅œμ†Œ 256Mi λ©”λͺ¨λ¦¬ μš”μ²­
            limits:
              cpu: "500m"  # μ΅œλŒ€ 500m CPU μ œν•œ
              memory: "512Mi" # μ΅œλŒ€ 512Mi λ©”λͺ¨λ¦¬ μ œν•œ

μ„€λͺ…:

  • requests.cpu: "100m" → μ΅œμ†Œ 100m(0.1 CPU)λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ„€μ •
  • limits.cpu: "500m" → μ΅œλŒ€ 500m(0.5 CPU)κΉŒμ§€λ§Œ μ‚¬μš© κ°€λŠ₯
  • requests.memory: "256Mi" → μ΅œμ†Œ 256Mi λ©”λͺ¨λ¦¬ μš”μ²­
  • limits.memory: "512Mi" → μ΅œλŒ€ 512Mi λ©”λͺ¨λ¦¬ μ œν•œ

πŸ’‘ Sidecar의 λ¦¬μ†ŒμŠ€λ₯Ό μ œν•œν•˜λ©΄ ν΄λŸ¬μŠ€ν„° λΉ„μš©μ„ μ ˆκ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


βœ… 2.3 λΆˆν•„μš”ν•œ νŠΈλž˜ν”½ λ‘œκΉ… λ°©μ§€

λͺ¨λ“  μš”μ²­μ„ λ‘œκΉ…ν•˜λ©΄ λ””μŠ€ν¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•˜κ³ , 운영 λΉ„μš©μ΄ λ†’μ•„μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ ν•„μš”ν•œ μš”μ²­λ§Œ 둜그둜 μ €μž₯ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: access-logs
  namespace: istio-system
spec:
  accessLogging:
    providers:
      - name: envoy
    filter:
      expression: 'response.code >= 400'  # HTTP 400 이상 μ—λŸ¬ 둜그만 μ €μž₯

μ„€λͺ…:

  • filter.expression: 'response.code >= 400' → 였λ₯˜(HTTP 400 이상)만 둜그둜 μ €μž₯

πŸ’‘ λΆˆν•„μš”ν•œ νŠΈλž˜ν”½ 둜그λ₯Ό 쀄이면 λ””μŠ€ν¬ μ‚¬μš©λŸ‰κ³Ό 운영 λΉ„μš©μ„ μ ˆκ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


βœ… 2.4 Envoy Proxy Keepalive 및 Connection Pool μ„€μ • μ΅œμ ν™”

Envoy Proxyκ°€ λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ 연결을 μœ μ§€ν•˜λ©΄ λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰μ΄ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.
이λ₯Ό λ°©μ§€ν•˜λ €λ©΄ Keepalive 및 Connection Pool 섀정을 μ΅œμ ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service-dr
  namespace: default
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 5  # λŒ€κΈ° 쀑인 μš”μ²­ 수 μ œν•œ
        maxRequestsPerConnection: 3  # ν•˜λ‚˜μ˜ μ—°κ²°λ‹Ή μ΅œλŒ€ μš”μ²­ 개수 μ œν•œ
      tcp:
        maxConnections: 50  # μ΅œλŒ€ TCP μ—°κ²° 수 μ œν•œ
    outlierDetection:
      consecutiveErrors: 3  # 였λ₯˜κ°€ 3회 λ°œμƒν•˜λ©΄ μ—°κ²° ν•΄μ œ
      interval: 5s  # 였λ₯˜ 감지 μ£ΌκΈ°
      baseEjectionTime: 10s  # μ—°κ²° ν•΄μ œ ν›„ μž¬μ‹œλ„ μ‹œκ°„

μ„€λͺ…:

  • http1MaxPendingRequests: 5 → HTTP μš”μ²­ λŒ€κΈ°μ—΄μ„ 5개둜 μ œν•œ
  • maxRequestsPerConnection: 3 → ν•˜λ‚˜μ˜ μ—°κ²°μ—μ„œ μ΅œλŒ€ 3개의 μš”μ²­λ§Œ ν—ˆμš©
  • tcp.maxConnections: 50 → μ΅œλŒ€ 50개의 TCP μ—°κ²° μœ μ§€
  • consecutiveErrors: 3 → 3번 연속 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή μ—°κ²° 차단

πŸ’‘ Envoy의 μ—°κ²° 수λ₯Ό μ΅œμ ν™”ν•˜λ©΄ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄이고 μ„±λŠ₯을 ν–₯상할 수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ“Œ κ²°λ‘ 

  • λΆˆν•„μš”ν•œ Sidecar μžλ™ μ£Όμž…μ„ λ°©μ§€ν•˜λ©΄ λ¦¬μ†ŒμŠ€λ₯Ό μ ˆκ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Sidecar Proxy(Envoy)의 CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ œν•œν•˜λ©΄ 운영 λΉ„μš©μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λΆˆν•„μš”ν•œ νŠΈλž˜ν”½ λ‘œκΉ…μ„ λ°©μ§€ν•˜λ©΄ λ””μŠ€ν¬ μ‚¬μš©λŸ‰κ³Ό λ„€νŠΈμ›Œν¬ λΉ„μš©μ„ μ ˆκ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Envoy Proxy의 Connection Pool 및 Keepalive 섀정을 μ΅œμ ν™”ν•˜λ©΄ μ„±λŠ₯을 κ°œμ„ ν•˜κ³  λΉ„μš©μ„ μ ˆκ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

728x90