[네떡스터디🔥kans] Service Mesh: Istio

CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다.

 

 

마이크로서비스 아키텍처가 널리 도입되면서 서비스 간 통신이 복잡해졌고, 이를 해결하기 위한 기술 중 하나가 바로 서비스 메쉬(Service Mesh)입니다. Istio는 대표적인 서비스 메쉬로, 서비스 간의 네트워크 트래픽을 관리하고 제어하는 역할을 합니다. 이번 글에서는 Istio의 다양한 역할에 대해 알아보겠습니다.

 

Service Mesh란?

Service Mesh는 마이크로서비스 간 통신을 제어하고 관리하는 레이어입니다. 마이크로서비스 아키텍처에서는 각 서비스가 독립적으로 배포되고 실행되기 때문에 서비스 간 통신이 매우 중요합니다. Service Mesh는 이런 통신을 제어하면서 보안, 로깅, 모니터링 같은 부가 기능을 제공하여 복잡한 통신을 간편하게 관리할 수 있도록 돕습니다. 개발자는 애플리케이션 코드에 네트워킹 로직을 직접 작성할 필요 없이, 중앙에서 통신을 관리할 수 있게 됩니다.

 

Istio의 리소스 

트래픽 관리 및 라우팅 관련 리소스

Gateway

Gateway는 Istio의 네트워크 경계를 정의하는 리소스입니다. 외부에서 내부 네트워크로의 트래픽을 관리하며, HTTP, TCP, TLS 등 다양한 프로토콜을 지원합니다. Gateway는 IngressGateway와 EgressGateway로 구분되어 각각 외부에서 내부로 들어오는 트래픽과 내부에서 외부로 나가는 트래픽을 제어합니다. 이 리소스를 사용하면 외부 클라이언트가 내부 서비스에 접근하는 방법을 제어할 수 있으며, 보안 정책과 트래픽 제어 규칙을 설정할 수 있습니다.

 

VirtualService

VirtualService는 트래픽 라우팅 규칙을 정의하는 Istio의 핵심 리소스 중 하나입니다. 이를 통해 서비스 간의 트래픽 흐름을 제어할 수 있으며, 다양한 트래픽 라우팅 시나리오를 구현할 수 있습니다. 예를 들어, A/B 테스트나 Canary 배포, Blue/Green 배포와 같은 다양한 배포 전략을 손쉽게 구현할 수 있습니다. VirtualService는 서비스의 요청이 어떻게 라우팅될지 상세하게 정의하여 서비스 간의 네트워크를 유연하게 관리할 수 있게 합니다.

 

DestinationRule

DestinationRule은 서비스 간 트래픽의 대상에 대한 규칙을 정의하는 리소스입니다. 이는 특정 서비스의 버전이나 환경에 따라 트래픽을 세분화하여 제어할 수 있습니다. 예를 들어, 특정 서비스의 베타 버전으로 일부 트래픽을 전환하거나, 서로 다른 설정을 사용하여 여러 인스턴스를 운영할 수 있도록 합니다. DestinationRule은 VirtualService와 함께 사용되어 트래픽이 도달하는 목적지의 설정을 제어하며, 서비스의 안정성과 유연성을 높이는 데 중요한 역할을 합니다.

 

ServiceEntry

ServiceEntry는 Istio가 관리하는 서비스 목록에 외부 서비스를 추가할 때 사용됩니다. 외부 API나 서비스를 Istio 네트워크에서 내부 서비스처럼 관리할 수 있게 해줍니다. 이를 통해 외부 서비스와의 통신도 Istio의 통제 하에 두어 통합된 트래픽 관리와 보안 정책을 적용할 수 있습니다.

 

Sidecar

Sidecar 리소스는 특정 워크로드에 대해 Istio 프록시의 동작을 맞춤화할 수 있게 해주는 리소스입니다. 이를 통해 특정 워크로드에 대한 네트워크 트래픽 제어 및 프록시 설정을 세부적으로 관리할 수 있으며, 필요에 따라 해당 워크로드에 특화된 네트워크 구성을 할 수 있습니다.

 

프록시 및 필터 관련 리소스

EnvoyFilter

EnvoyFilter는 Istio 내에서 동작하는 Envoy 프록시의 설정을 수정하거나 추가할 수 있게 해주는 리소스입니다. Istio는 기본적으로 Envoy를 데이터 플레인 프록시로 사용하며, EnvoyFilter를 통해 추가적인 필터를 삽입하거나 프록시의 동작을 맞춤화할 수 있습니다. 이 리소스를 활용하면 기본적인 라우팅과 필터링 외에 고급 기능을 구현할 수 있으며, 특정 요청에 대해 추가적인 처리를 하거나 사용자 정의 로직을 적용할 수 있습니다.

 

ProxyConfig

ProxyConfig는 각 워크로드에 적용되는 프록시 설정을 정의하는 리소스입니다. 이를 통해 프록시의 시간 제한, 버퍼 크기, 로깅 설정 등을 맞춤화하여 개별 워크로드의 프록시 동작을 제어할 수 있습니다. ProxyConfig는 각 워크로드의 특성에 맞는 최적의 프록시 설정을 적용할 수 있게 도와줍니다.

 

WasmPlugin

WasmPlugin은 Istio의 Envoy 프록시에서 WebAssembly(Wasm) 모듈을 실행할 수 있게 하는 리소스입니다. 이를 통해 트래픽 처리에 대한 사용자 정의 로직을 추가할 수 있으며, 기존의 플러그인보다 유연하게 프록시 동작을 확장할 수 있습니다. WasmPlugin을 활용하면 요청 처리 과정에서 복잡한 로직을 구현하거나, 특수한 기능을 손쉽게 추가할 수 있습니다.

 

모니터링 관련 리소스

Telemetry

Telemetry 리소스는 Istio의 관측 기능을 강화하는 리소스입니다. 메트릭, 트레이싱, 로깅과 같은 기능을 설정하여 서비스 간 통신이나 트래픽에 대한 모니터링을 수행할 수 있습니다. 이를 통해 서비스 간의 트래픽을 실시간으로 관찰하고, 문제 발생 시 신속하게 대응할 수 있습니다. Telemetry는 운영자가 시스템의 상태를 파악하고, 성능을 최적화할 수 있도록 돕는 중요한 도구입니다.

 

보안 및 인증 관련 리소스

AuthorizationPolicy

AuthorizationPolicy는 Istio의 보안 정책으로, 특정 서비스나 워크로드에 대한 접근 권한을 정의합니다. 이를 통해 어떤 사용자나 서비스가 어떤 자원에 접근할 수 있는지를 세밀하게 제어할 수 있습니다. 정책은 네임스페이스 단위로 정의되며, 특정 워크로드나 서비스에 대한 접근 제어를 설정할 수 있습니다. AuthorizationPolicy는 서비스 간 통신의 보안을 강화하고, 불필요한 접근을 차단하여 시스템의 안전성을 높입니다.

 

PeerAuthentication

PeerAuthentication은 Istio의 워크로드 간 통신 시 인증 방식을 정의하는 리소스입니다. 이는 주로 서비스 간 통신의 보안을 위해 사용되며, 통신의 암호화나 인증서 교환 방식 등을 정의합니다. 이를 통해 마이크로서비스 간 통신에서 데이터의 기밀성과 무결성을 보장할 수 있습니다.

 

RequestAuthentication

RequestAuthentication은 서비스가 수신하는 요청에 대한 인증 방식을 정의하는 리소스입니다. 주로 JWT(JSON Web Token)를 사용한 인증이 가능하며, 해당 토큰을 기반으로 요청의 유효성을 확인하는 데 사용됩니다. 이를 통해 서비스에 접근하는 요청이 적법한지 확인하고, 보안 위협을 줄일 수 있습니다.

 

워크로드 관련 리소스

WorkloadEntry

WorkloadEntry는 Istio가 관리하는 클러스터 외부의 개별 워크로드를 추가하는 리소스입니다. 클러스터 내부의 서비스처럼 외부 워크로드에 대한 트래픽 라우팅 및 정책 적용을 할 수 있게 합니다. 이를 통해 클러스터 외부에 있는 VM이나 다른 인프라에서 동작하는 서비스를 Istio 네트워크에 통합하여 관리할 수 있습니다.

 

WorkloadGroup

WorkloadGroup은 여러 WorkloadEntry 인스턴스를 그룹화하여 관리할 수 있는 리소스입니다. 동일한 유형의 외부 워크로드를 한 번에 정의하고 관리할 수 있어, 대규모 외부 워크로드를 쉽게 운영할 수 있게 합니다.

 

Envoy란

Envoy의 통신 흐름?

envoy의 룰을 살펴보다 보면 Listener, Route, Cluster, Endpoint이란 용어를 마주하게 됩니다. 각각의 용어를 쉽게 이해하기 위해서 고객이 콜센터에 전화하여 상담원을 만나기까지의 과정을 함께 표현해보았습니다. 

 

Listener

Listener는 고객이 콜센터에 전화를 거는 순간에 해당합니다. 고객이 콜센터에 전화를 걸면 콜센터는 먼저 그 전화를 받아야 합니다. Envoy에서 Listener는 외부에서 들어오는 요청을 받는 첫 단계로, 특정 포트에서 요청을 대기하는 역할을 합니다. 이 단계에서 들어오는 요청은 이후의 단계에서 어떻게 처리될지 결정됩니다.

 

Route

Route는 전화를 접수한 후, 고객의 요청을 이해하고 어떤 부서로 연결할지 결정하는 과정과 같습니다. 고객이 전화를 걸면 콜센터의 접수 직원이 "어떤 문제로 전화를 주셨나요?"라고 물어보고, 그에 맞는 부서로 전화를 넘깁니다. 이처럼 Envoy의 Route는 들어온 요청이 어떤 서비스나 부서(Cluster)로 가야 하는지를 결정하는 규칙입니다. 예를 들어, 고객이 결제 관련 문제를 문의하면 결제 부서로, 기술 지원 관련 문제라면 기술 지원 부서로 전화를 넘기는 것과 같습니다.

 

Cluster

Cluster는 결정된 부서로 전화를 넘긴 후, 해당 부서의 여러 상담원 중 한 명을 선택하는 과정입니다. 이제 고객의 요청이 어느 부서로 가야 할지가 결정되었으니, 그 부서에서 상담원이 전화를 받아야 합니다. Cluster는 부서 자체를 의미하며, 여러 상담원(서버)이 포함되어 있습니다. 결제 부서의 여러 상담원 중 한 명이 전화를 받는 것처럼, Cluster에서는 여러 서버 중 하나가 요청을 처리할 준비를 합니다.

 

Endpoint

Endpoint는 선택된 상담원을 의미합니다. 고객의 요청이 부서(Cluster)로 넘어가면, 이제 그 부서의 특정 상담원이 전화를 받아 실제로 고객 문제를 처리하게 됩니다. 이 상담원이 바로 Envoy에서의 Endpoint입니다. Endpoint는 Cluster 안에서 실제로 요청을 처리하는 개별 서버 또는 서비스 인스턴스입니다.

 

 

용어정리

Host: