Istio λž€


Istio λŠ” Service Mesh 의 ν•œ μ’…λ₯˜λ‘œ CNCF μ—μ„œ κ΄€λ¦¬ν•˜λŠ” Open Source 이닀. Service Mesh λŠ” MSA ν™˜κ²½μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ˜ λ³€κ²½ 없이 각 μ„œλΉ„μŠ€μ— λŒ€ν•œ Observability(κ°€μ‹œμ„±, log/metrics/trace), νŠΈλž˜ν”½ 관리, λ³΄μ•ˆ κΈ°λŠ₯을 λ‹΄λ‹Ήν•˜λŠ” 인프라 계측이닀. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 일일이 κ΅¬ν˜„ν•˜λ˜ κΈ°λŠ₯을 인프라 κ³„μΈ΅μœΌλ‘œ λ””μ»€ν”Œλ§ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ 것이닀.

Istio λ₯Ό μ“°λŠ” 이유


Kubernetes ν™˜κ²½μ—μ„  DNS 와 λ‘œλ“œλ°ΈλŸ°μ„œμ˜ μ‘°ν•©μœΌλ‘œλ„ νŠΈλž˜ν”½ 관리가 μΆ©λΆ„νžˆ κ°€λŠ₯ν•˜μ§€λ§Œ Istio λ₯Ό ν™œμš©ν•˜λ©΄ 더 λ§Žμ€ κΈ°λŠ₯을 μ‰½κ²Œ μ μš©ν•  수 μžˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ Observability, νŠΈλž˜ν”½ 관리, λ³΄μ•ˆ, νšŒλ³΅μ„±, 계측 이점 등이 μžˆλ‹€.

Observability, κ°€μ‹œμ„±

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œκ·ΈλŠ” Datadog κ³Ό 같은 μ†”λ£¨μ…˜μœΌλ‘œ μ·¨ν•©ν•  수 μžˆμ§€λ§Œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€κ°„ μ£Όκ³ λ°›λŠ” νŠΈλž˜ν”½μ— λŒ€ν•œ λ‘œκ·ΈλŠ” λ”°λ‘œ ν™•λ³΄ν•˜κΈ° 쉽지 μ•Šλ‹€. Istio λŠ” Envoy Proxy λ₯Ό Sidecar ν˜•νƒœλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό ν•¨κ»˜ λ°°ν¬ν•˜μ—¬ νŠΈλž˜ν”½μ„ μ•žλ‹¨μ—μ„œ λ¨Όμ € λ°›μ•„ 이에 λŒ€ν•œ Log, Metrics, Trace λ₯Ό 확보할 수 μžˆλ‹€.

νŠΈλž˜ν”½ 관리

HTTP, gRPC, WebSocket 및 TCP νŠΈλž˜ν”½μ— λŒ€ν•œ λ‘œλ“œ λ°ΈλŸ°μ‹±μ΄ κ°€λŠ₯ν•˜λ©° Retry, λΌμš°νŒ… κ·œμΉ™, Fault Injection λ“± νŠΈλž˜ν”½ μ œμ–΄ μ—­μ‹œ κ°€λŠ₯ν•˜λ‹€. Istio κ°€ μ œκ³΅ν•˜λŠ” CustomResource 인 VirtualService 와 DestinationRule 을 ν†΅ν•΄μ„œ μ›ν•˜λŠ” μ„œλΉ„μŠ€λ‘œ νŠΈλž˜ν”½μ„ 보내쀄 수 μžˆλ‹€. VirtualService 의 weight, subset 을 톡해 Canary 배포λ₯Ό μˆ˜ν–‰ν•  수 μžˆμ„ 뿐 μ•„λ‹ˆλΌ Header / Path 기반의 L7 λΌμš°νŒ…λ„ μ‰½κ²Œ μ„€μ •ν•  수 μžˆλ‹€.

νŠΈλž˜ν”½μ„ λ‚šμ•„μ±„μ„œ λ‚΄ λ§ˆμŒλŒ€λ‘œ ν•  수 있기 λ•Œλ¬Έμ— νŠΉμ • νŠΈλž˜ν”½λ§Œ μΉ΄λ‚˜λ¦¬ 버전에 ν˜λ €λ³΄λ‚΄λŠ” 상황을 Application μˆ˜μ • 없이 Configuration μˆ˜μ •λ§ŒμœΌλ‘œ κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€.

L4 뿐 μ•„λ‹ˆλΌ L7 κΉŒμ§€ μ œμ–΄ν•˜κΈ° λ•Œλ¬Έμ— λ„€νŠΈμ›Œν¬λ₯Ό κΉŒμ„œ HTTP Header λ₯Ό λ³Ό 수 μžˆλ‹€. 헀더λ₯Ό ν™•μΈν•΄μ„œ μš”μ²­μ΄ μ•„μ΄ν°μ—μ„œ λ“€μ–΄μ˜¨ μš”μ²­μΌ λ•Œ μ•„μ΄ν°μš© μ„œλΉ„μŠ€λ‘œ λΌμš°νŒ…ν•΄μ£ΌλŠ” λ“±μ˜ νŠΈλž˜ν”½ μŠ€ν‹°μ–΄λ§μ΄ κ°€λŠ₯ν•˜λ‹€. 예λ₯Ό λ“€μ–΄ gif 보닀 μ••μΆ•λ₯ μ΄ 쒋은 webp 같은 경우 chrome κ³Ό android λŠ” μ§€μ›ν•˜μ§€λ§Œ 아이폰은 μ§€μ›ν•˜μ§€ μ•ŠλŠ” 상황에 μ‚¬μš©ν•  수 μžˆλ‹€.

λ³΄μ•ˆ

Kubernetes ν™˜κ²½μ—μ„  μ„œλΉ„μŠ€ κ°„ 톡신이 이루어지기 λ•Œλ¬Έμ— 쀑간에 νŠΈλž˜ν”½μ„ λ‚šμ•„μ±„μ„œ λœ―μ–΄λ³Ό 수 μžˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ mTLS λ₯Ό Istio λ₯Ό 톡해 μ‰½κ²Œ μ„€μ •ν•  수 μžˆλ‹€. Istio Control Plane 이 λͺ¨λ₯΄λŠ” μ„œλΉ„μŠ€μ™€λŠ” μ•„μ˜ˆ 톡신을 ν•  수 μ—†κ²Œ ν•  수 있고, Policy λ₯Ό 톡해 μ–΄λ–€ μ„œλΉ„μŠ€κ°€ μ–΄λ–€ μ„œλΉ„μŠ€μ™€ 톡신할 수 μžˆλŠ”μ§€ μ½”λ“œν™”ν•˜μ—¬ 관리할 수 μžˆλ‹€.

Istio μ•„ν‚€ν…μ²˜λŠ” Envoy Proxy λ₯Ό 톡해 톡신을 λ‹€ κ°€λ‘œμ±„κ³  λͺ¨λ“  ꡬ간이 μ•”ν˜Έν™”λ˜κΈ° λ•Œλ¬Έμ— μ ˆλŒ€ λͺ» μ—΄μ–΄λ³΄λŠ” 톡신 λ³΄μ•ˆμ„ μ œκ³΅ν•œλ‹€ (Zero Trust)

Kubernetes ν΄λŸ¬μŠ€ν„°λŠ” 내뢀망 톡신일텐데 μ™œ μ•”ν˜Έν™”ν•΄μ•Όν• κΉŒ? 졜근 λ³΄μ•ˆ 업계 νŠΈλ Œλ“œλŠ” Zero Trust μ•„ν‚€ν…μ²˜λ‹€. 내뢀망이어도 μ ˆλŒ€ μ‹ λ’°ν•˜μ§€ 말고 항상 검증해야 λœλ‹€λŠ” κ°œλ…μ΄λ‹€. μ™œ ν΄λŸ¬μŠ€ν„° 내뢀망이 μœ„ν—˜ν•  수 μžˆμ„κΉŒ? λ‚΄λΆ€μžμ˜ 경우 λ„€νŠΈμ›Œν¬λ₯Ό λœ―μ–΄λ³Ό 수 μžˆκΈ°λ„ ν•˜κ³ , Pod ν•˜λ‚˜κ°€ 취약점을 κ°€μ§€κ³  ν•΄μ»€μ—κ²Œ μž₯악될 경우 λ‚΄λΆ€ λ„€νŠΈμ›Œν¬μ— 접근이 κ°€λŠ₯ν•˜κΈ°μ— μ™ΈλΆ€μžκ°€ νŠΈλž˜ν”½μ„ κ°€λ‘œμ±Œ 수 μžˆκΈ°λ„ ν•˜κ³ , Compliance and Regulation 으둜 전솑 쀑 μ•”ν˜Έν™”λ₯Ό λ²•μ μœΌλ‘œ μš”κ΅¬ν•˜λŠ” κ²½μš°κ°€ λ§ŽκΈ°λ„ ν•˜λ‹€.

νšŒλ³΅μ„±, Fault Tolerance

Timeout, Retry, Circuit Breaker 같은 κ³ κΈ‰ νšŒλ³΅μ„± κΈ°λŠ₯을 κ΅¬μ„±ν•˜μ—¬ μ„œλΉ„μŠ€ μž₯애에 λŒ€ν•œ 탄λ ₯성을 높일 수 μžˆλ‹€.

Service 끼리 μ„œλ‘œ ν†΅μ‹ ν•˜λŠ” MSA ν™˜κ²½μ—μ„œ ν˜ΈμΆœλ˜λŠ” Service 에 μž₯μ• κ°€ λ°œμƒν•˜λ©΄ ν˜ΈμΆœν•˜λŠ” Service 의 μŠ€λ ˆλ“œλŠ” 응닡을 κΈ°λ‹€λ¦¬κ²Œ λœλ‹€. κ·Έλ ‡κ²Œ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ μ‘λ‹΅λŒ€κΈ° μƒνƒœκ°€ 되면 λ¬Έμ œκ°€ μ—†λ˜ ν˜ΈμΆœν•˜λŠ” Service μ—­μ‹œ μž₯μ• κ°€ λ°œμƒν•œλ‹€. 즉, μž₯μ• κ°€ μ „νŒŒλ˜λŠ” 상황이 λ°œμƒν•œλ‹€. 이λ₯Ό Noisy Neighborhood 라고도 ν•œλ‹€.

이런 상황을 막기 μœ„ν•΄μ„  ν˜ΈμΆœλ˜λŠ” Service κ°€ 응닡이 μ—†μœΌλ©΄ 컀λ„₯μ…˜μ„ λŠμ–΄μ€˜μ•Ό ν•œλ‹€. κ³Όμ „λ₯˜ μ‹œ ν“¨μ¦ˆκ°€ λ‚΄λ €κ°€λŠ” κ²ƒμ²˜λŸΌ 이λ₯Ό Circuit Breaker 라고 ν•œλ‹€.

이 외에도 λͺ¨λ‹ˆν„°λ§, μ„œλΉ„μŠ€ κ°„ μ˜μ‘΄μ„± λ“± MSA ν™˜κ²½μ—μ„œ λ§ˆμ£Όν•˜λŠ” λ‹€μ–‘ν•œ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Envoy λΌλŠ” ν”„λ‘μ‹œλ₯Ό μ΄μš©ν•˜κ²Œ λœλ‹€. Envoy λŠ” HAProxy λ‚˜ Nginx 같이 WAS μ•žμ— λ†“λŠ” 일반적인 ν”„λ‘μ‹œλ‹€. λ‹¨μˆœν•˜κ²Œ L4 레벨이 μ•„λ‹ˆλΌ L7 λ ˆλ²¨μ—μ„œλ„ 역할을 μˆ˜ν–‰ν•œλ‹€. λ“€μ–΄μ˜€λŠ” νŠΈλž˜ν”½μ–‘μ„ μ‘°μ ˆν•œλ‹€λ˜μ§€, 인증된 νŠΈλž˜ν”½λ§Œ λ°›λŠ”λ‹€λ˜μ§€, HTTP/1.0 뿐만 μ•„λ‹ˆλΌ HTTP/2, gRPC, WebSocket 을 μ§€μ›ν•œλ‹€λ˜μ§€, Circuit Breaker λ₯Ό μ§€μ›ν•œλ‹€λ˜μ§€

계측 이점

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ˜ λ³€κ²½ 없이 인프라 κ³„μΈ΅μ—μ„œ μœ„ λͺ¨λ“  κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆλ‹€λŠ” 것이 κ°€μž₯ 큰 μž₯점이닀. λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 Service Mesh κ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 계측, 인프라 κ³„μΈ΅μœΌλ‘œ λ””μ»€ν”Œλ§ λ˜μ–΄ 있기 λ•Œλ¬Έμ— istio κ°€ μ•„λ‹Œ Consul, Linkerd λ“± κ³Ό 같은 λ‹€λ₯Έ ServiceMesh λ₯Ό μ μš©ν•˜λ”λΌλ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ—” 변경이 ν•„μš” μ—†μ–΄μ§„λ‹€.

Istio λŠ” μ–΄λ–»κ²Œ μž‘λ™ν•˜λ‚˜?


Istio λŠ” λ‚΄λΆ€μ μœΌλ‘œ Envoy Proxy λ₯Ό 각 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ Container μ˜†μ— Sidecar ν˜•νƒœλ‘œ ν•¨κ»˜ 배포해쀀닀. Google μ—μ„œ Istio ν”„λ‘œμ νŠΈλ₯Ό μ€€λΉ„ 쀑일 λ•Œ Nginx λ₯Ό Sidecar Proxy 둜 μ‚¬μš©ν•˜λ €λ‹€ Envoy 의 쑴재λ₯Ό μ•Œκ²Œλ˜κ³  Envoy λ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ κ²°μ •ν–ˆλ‹€κ³  ν•œλ‹€.

Envoy Proxy

  • L4/L7 ν”„λ‘μ‹œ
  • κ²½λŸ‰
  • HTTP2, gRPC λ“± 지원
  • Resilience 와 Scale 지원
  • Health Check, Circuit Breaker, Timeout, Retry 지원
  • API λ₯Ό ν†΅ν•œ μ„€μ • λ³€κ²½, Nginx 와 κ°€μž₯ 큰 차이점으둜 Nginx 의 경우 섀정을 λ³€κ²½ν•  λ•Œ conf νŒŒμΌμ„ μˆ˜μ •ν•˜κ³  reload λ₯Ό μˆ˜ν–‰ν•΄μ•Όν•˜μ§€λ§Œ Envoy λŠ” API λ₯Ό 톡해 λ™μ μœΌλ‘œ 섀정을 λ³€κ²½ν•  수 μžˆλ‹€. VirtualService, DestinationRule κ³Ό 같은 CustomResource κ°€ μƒμ„±λ˜λ©΄ Istio κ°€ 이λ₯Ό μΈμ§€ν•˜κ³  Envoy Proxy 에 섀정을 μ „νŒŒν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€.

Envoy λ₯Ό μ“°λ©΄ μΈν”„λΌλ ˆλ²¨μ—μ„œ 이런 MSA νŒ¨ν„΄λ“€μ„ ν’€μ–΄λ‚˜κ°ˆ 수 μžˆλ‹€. λ¬Έμ œλŠ” Envoy κ°€ 많이 ν•„μš”ν•˜λ‹€λŠ” 점이닀. MSA λŠ” 보톡 μ»΄ν¬λ„ŒνŠΈκ°€ μ²œλ‹¨μœ„ μ΄μƒμœΌλ‘œ κ΅¬μ„±λ˜κΈ° λ•Œλ¬Έμ— λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈ μ•žλ‹¨μ— 일일이 Envoy λ₯Ό λΆ™μ—¬μ£Όλ €λ©΄.. 쉽지 μ•Šλ‹€. κ·Έλž˜μ„œ 쀑앙 컨트둀 μ†”λ£¨μ…˜μΈ Istio λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

Istio λŠ” WAS Container μ˜†μ— 항상 Envoy Container κ°€ 같이 배포될 수 μžˆλ„λ‘ 도와쀀닀. 일반적으둜 Kubernetes μ—μ„œ Pod λŠ” ν•˜λ‚˜μ˜ Container λ₯Ό ν¬ν•¨ν•œλ‹€. Envoy Proxy λŠ” 닀쀑 Container νŒ¨ν„΄ 쀑 ν•˜λ‚˜μΈ Sidecar Pattern 으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ Container 와 ν•¨κ»˜ λ°°ν¬λœλ‹€. Sidecar Pattern 은 κΈ°μ‘΄ Container 의 κΈ°λŠ₯을 λ³€κ²½ν•˜μ§€ μ•Šκ³  ν™•μž₯ν•œλ‹€. 즉, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ μˆ˜μ • 없이 λ‘œκΉ…μ΄λ‚˜ ν”„λ‘μ‹œλ₯Ό λΆ™μ΄λŠ” λ“± κΈ°λŠ₯을 ν™•μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

Pod λŠ” μ—¬λŸ¬ Container 듀을 μ–΄λ–»κ²Œ λ¬Άμ–΄μ€„κΉŒ?

Kubernetes μ—μ„œ Pod λ₯Ό μƒμ„±ν•˜λ©΄ pause λΌλŠ” Container 도 ν•¨κ»˜ μƒμ„±λœλ‹€. μ΄λŠ” Pod λ‚΄λΆ€μ˜ Container 듀이 λ¦¬λˆ…μŠ€ namespace(PID, network, volume mount, UTS, IPC cgroup λ“±) λ₯Ό κ³΅μœ ν•  수 μžˆλ„λ‘ 도와쀀닀. λ˜ν•œ PID 1 (init process)λ‘œμ„œμ˜ μ—­ν• μ„ν•˜κ³  μ’€λΉ„ ν”„λ‘œμ„ΈμŠ€λ₯Ό 거둬듀이기도 ν•œλ‹€. pause Container 덕뢄에 Pod λ‚΄ Container 듀은 λ™μΌν•œ λ„€νŠΈμ›Œν¬ 섀정을 κ³΅μœ ν•˜κ²Œ 되고 localhost 둜 Container κ°„ 톡신도 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

Istio λŠ” Kubernetes namespace 쀑 istio-enabled 섀정이 적용된 namespace 에 μƒμ„±λ˜λŠ” λͺ¨λ“  Pod 에 Envoy Proxy λ₯Ό Sidecar 둜 뢙인닀. Istio 의 Webhook 을 톡해 istiod 의 API λ₯Ό ν˜ΈμΆœν•˜κ³  ν•΄λ‹Ήλ˜λŠ” Pod 에 init-container 와 istio-proxy Container λ₯Ό μ£Όμž…ν•œλ‹€. init-container λŠ” λ‹€λ₯Έ Container 듀이 μƒμ„±λ˜κΈ° 전에 λ¨Όμ € μ‹€ν–‰λ˜λ©° νŠΈλž˜ν”½ μ œμ–΄λ₯Ό μœ„ν•œ iptable μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. 이λ₯Ό 톡해 ν•΄λ‹Ή Pod 둜 λ“€μ–΄μ˜€λŠ” νŠΈλž˜ν”½μ„ λͺ¨λ‘ Envoy Proxy 둜 μ „λ‹¬ν•˜λ„λ‘ μ„€μ •ν•œλ‹€.

Istio Architecture


Istio λŠ” 컨트둀 ν”Œλ ˆμΈκ³Ό 데이터 ν”Œλ ˆμΈμœΌλ‘œ 이루어진닀. 데이터 ν”Œλ ˆμΈμ€ Envoy λ“€μ˜ 집합이닀. 컨트둀 ν”Œλ ˆμΈμ€ Envoy ν”„λ‘μ‹œλ“€μ„ μ»¨νŠΈλ‘€ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.

Control Plane, istiod

컨트둀 ν”Œλ ˆμΈμ€ pilot, mixer, citadel 으둜 κ΅¬μ„±λ˜λ©° istiod λΌλŠ” μ‹±κΈ€ λ°”μ΄λ„ˆλ¦¬λ‘œ λ¬Άμ—¬ λ°°ν¬λœλ‹€. istiod λŠ” μ„œλΉ„μŠ€ λ””μŠ€μ»€λ²„λ¦¬, ν”„λ‘μ‹œ ꡬ성 및 관리, μΈμ¦μ„œ 관리 등을 μˆ˜ν–‰ν•œλ‹€. mTLS 톡신을 μœ„ν•œ μΈμ¦μ„œλ₯Ό μƒμ„±ν•˜λŠ” CA μ—­ν•  μ—­μ‹œ μˆ˜ν–‰ν•œλ‹€.

Pilot

컨트둀 ν”Œλ ˆμΈμ˜ Pilot μ΄λΌλŠ” μ»΄ν¬λ„ŒνŠΈλŠ” configuration 정보λ₯Ό κ°–κ³  μžˆλ‹€. 예λ₯Ό λ“€λ©΄ Service A 의 IP Address λŠ” 무엇인가, 받을 수 μžˆλŠ” νŠΈλž˜ν”½μ€ μ–΄λ–»κ²Œ λ˜λŠ”μ§€ λ“±.

Mixer

Mixer λŠ” Service κ°€ νŠΈλž˜ν”½μ„ 받을 λ•Œ 1μ΄ˆλ‹Ή μ–Όλ§ˆ 받을 수 μžˆλŠ”μ§€, λ‚˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλŠ” Service 의 μ’…λ₯˜λŠ” 무엇인지, λ˜λŠ” Request 의 μš°μ„ μˆœμœ„ λ“±μ˜ 정책을 ν™•μΈν•˜κ³ , λ‘œκ·Έλ„ μˆ˜μ§‘ν•œλ‹€.

Citadel

Citadel μ΄λΌλŠ” μ»΄ν¬λ„ŒνŠΈλŠ” λ³΄μ•ˆμ„ λ‹΄λ‹Ήν•œλ‹€. Istio λ₯Ό μ μš©ν•œ μ•„ν‚€ν…μ²˜μ—μ„  무쑰건 Envoy Proxy λ₯Ό 톡해 톡신이 이루어진닀. 이 톡신 ꡬ간이 mTLS(Mutual TLS λ˜λŠ” μ–‘λ°©ν–₯ SSL) 둜 μ•”ν˜Έν™”λœλ‹€. μ„œλ²„λ₯Ό λ‚˜κ°€λŠ” μˆœκ°„λΆ€ν„° λͺ¨λ‘ μ•”ν˜Έν™”κ°€ λœλ‹€. mTLS λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ μΈμ¦μ„œλ₯Ό λ°›μ•„μ•Όλ˜λŠ”λ° Citadel 이 이λ₯Ό κ΄€λ¦¬ν•˜κ³  λΏŒλ €μ£ΌλŠ” 역할을 ν•œλ‹€.

References