Ssoon
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy 구성 본문
CloudNet@ 가시다님이 진행하는 Istio Hands-on Study [1기]
🚀 Envoy Proxy 설정이란?
Envoy Proxy는 강력한 네트워크 기능을 제공하지만, 이를 제대로 활용하려면 적절한 **설정(Configuration)**이 필요합니다. Envoy는 설정 파일을 통해 동작을 정의하며, 초보자도 이해하기 쉽게 설정의 기본 개념과 방법을 알아보겠습니다.
Envoy는 설정 파일을 통해 동작을 제어하며, 이를 통해 네트워크 기능을 최적화합니다.
📝 설정 파일: Envoy의 동작 지침서
Envoy는 JSON 또는 YAML 형식의 설정 파일을 사용해 동작을 정의합니다. 이 파일에는 Listeners, Routes, Clusters 같은 주요 구성 요소와 서버 설정이 포함됩니다. 예를 들어, Admin API 활성화 여부, **액세스
Envoy는 JSON 또는 YAML 형식의 설정 파일로 Listeners, Routes, Clusters와 서버 설정을 정의합니다.
🛠️ 서버 설정: Envoy의 추가 기능
설정 파일에는 Admin API, 액세스 로그 경로, 트레이싱 엔진 설정 같은 서버 관련 설정도 포함됩니다. Admin API는 Envoy의 상태를 모니터링하거나 설정을 동적으로 변경할 수 있게 해줍니다. 액세스 로그는 트래픽 기록을 저장하고, 트레이싱 설정은 분산 추적 시스템과 연동해 네트워크 흐름을 분석합니다.
설정 파일은 Admin API, 액세스 로그, 트레이싱 같은 서버 기능을 포함해 Envoy를 커스터마이징합니다.
🔄 최신 v3 설정: 현대적인 표준
Envoy는 시간이 지나며 설정 API 버전이 발전해왔습니다. 초기 v1, v2 버전은 더 이상 사용되지 않으며, 현재는 v3가 표준입니다. Istio 같은 최신 도구도 v3 설정을 사용하므로, 이 글에서는 v3에 초점을 맞춥니다. v3는 최신 기능과 호환성을 제공해 Envoy를 더 효율적으로 만듭니다.
v3는 Envoy의 최신 설정 버전으로, Istio와 호환되며 최신 기능을 지원합니다.
🌐 gRPC 기반 v3 API: 실시간 설정 업데이트
Envoy의 v3 설정 API는 gRPC를 기반으로 설계되었습니다. gRPC의 스트리밍 기능을 활용해 설정 업데이트를 빠르게 반영할 수 있습니다. 기존에는 주기적으로 API를 폴링(polling)해야 했지만, v3에서는 서버가 Envoy 프록시에 실시간으로 업데이트를 푸시(push)할 수 있어 설정이 빠르게 적용됩니다.
v3 API는 gRPC 기반으로 스트리밍을 지원해 실시간 설정 업데이트를 가능하게 합니다.
📝 요약: Envoy 설정의 핵심
Envoy Proxy는 JSON 또는 YAML 설정 파일을 통해 Listeners, Routes, Clusters와 같은 핵심 구성 요소와 Admin API, 액세스 로그, 트레이싱 같은 서버 설정을 정의합니다. 최신 v3 설정은 Istio와 호환되며, gRPC 기반의 스트리밍 API를 통해 실시간으로 설정을 업데이트할 수 있습니다. 이 설정 방식을 이해하면 Envoy의 강력한 기능을 쉽게 활용할 수 있습니다.
🚀 1. Envoy Proxy 정적 설정이란?
Envoy Proxy는 강력한 네트워크 기능을 제공하지만, 이를 사용하려면 적절한 설정이 필요합니다. **정적 설정(Static Configuration)**은 Envoy의 동작을 정의하는 가장 기본적인 방법으로, 설정 파일에 모든 세부 사항을 명시적으로 작성합니다.
정적 설정은 Envoy의 동작을 설정 파일에 명시적으로 정의하는 방식입니다.
📝 정적 설정 파일: Envoy의 동작 지침서
Envoy는 JSON 또는 YAML 형식의 설정 파일을 통해 Listeners, Routes, Clusters를 정의합니다. 아래는 간단한 Envoy 정적 설정 파일의 예제입니다. 이 설정은 httpbin 서비스로 트래픽을 라우팅하는 기본적인 구성을 보여줍니다.
static_resources:
listeners:
- name: httpbin-demo
address:
socket_address: { address: 0.0.0.0, port_value: 15001 }
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
stat_prefix: egress_http
route_config:
name: httpbin_local_route
virtual_hosts:
- name: httpbin_local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route:
auto_host_rewrite: true
cluster: httpbin_service
http_filters:
- name: envoy.router
clusters:
- name: httpbin_service
connect_timeout: 5s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [{ socket_address: { address: httpbin, port_value: 8000 }}]
Envoy의 정적 설정 파일은 Listeners, Routes, Clusters를 포함해 모든 설정을 명시적으로 정의합니다.
🔌 Listener 설정: 트래픽의 입구
위 예제에서 Listener는 포트 15001에서 트래픽을 수신하도록 설정되었습니다. Listener는 외부 요청을 받아들이는 Envoy의 첫 번째 관문으로, filter_chains를 통해 들어온 트래픽에 특정 동작을 적용합니다. 이 경우, http_connection_manager 필터가 트래픽을 처리합니다.
Listener는 포트(예: 15001)를 열어 트래픽을 수신하고, filter_chains로 동작을 정의합니다.
🛤️ Routes 설정: 트래픽의 길잡이
Routes는 들어온 트래픽을 어떻게 처리할지 정의합니다. 예제에서는 모든 요청(/*)을 httpbin_service 클러스터로 라우팅하도록 설정했습니다. virtual_hosts의 domains: ["*"]는 모든 도메인에 대해 이 규칙을 적용한다는 뜻입니다. 이는 트래픽을 간단히 특정 클러스터로 보내는 기본적인 라우팅 규칙입니다.
Routes는 트래픽을 특정 Cluster로 라우팅하며, 모든 요청을 처리하도록 설정할 수 있습니다.
🖥️ Clusters 설정: 트래픽의 목적지
Clusters는 트래픽이 최종적으로 도달하는 업스트림 서비스를 정의합니다. 예제에서는 httpbin_service 클러스터가 httpbin 서비스(포트 8000)로 연결되도록 설정했습니다. 주요 설정은 다음과 같습니다:
- connect_timeout: 연결 타임아웃을 5초로 설정.
- type: LOGICAL_DNS: 서비스 디스커버리에 DNS를 사용.
- lb_policy: ROUND_ROBIN: 부하 분산 방식으로 라운드 로빈을 선택.
Clusters는 업스트림 서비스를 정의하며, 타임아웃, DNS, 부하 분산 설정을 포함합니다.
⚙️ 정적 설정의 특징: 명시적이고 간단
이 설정은 정적 설정의 전형적인 예로, 모든 설정(Listener, Routes, Clusters 등)이 파일에 명시적으로 작성됩니다. 이는 설정이 간단하고 예측 가능하지만, 동적으로 변경하려면 파일을 수정하고 Envoy를 재시작해야 합니다. Envoy는 **동적 설정(Dynamic Configuration)**도 지원하지만, 이 글에서는 정적 설정에 초점을 맞춥니다.
정적 설정은 모든 설정을 명시적으로 작성해 간단하지만, 변경 시 재시작이 필요합니다.
🔄 동적 설정과의 비교
Envoy는 xDS APIs를 사용한 동적 설정도 지원합니다. 동적 설정은 설정을 실시간으로 업데이트할 수 있어 더 유연하지만, 초보자에게는 정적 설정이 더 직관적입니다. 이 예제에서는 정적 설정을 사용했으며, 동적 설정은 나중에 다룰 예정입니다.
정적 설정은 간단하지만 유연성이 낮고, 동적 설정은 xDS APIs로 실시간 업데이트를 지원합니다.
📝 요약: Envoy 정적 설정의 핵심
Envoy Proxy의 정적 설정은 JSON 또는 YAML 파일을 통해 Listeners, Routes, Clusters를 명시적으로 정의합니다. 예제에서는 포트 15001에서 트래픽을 받아 httpbin_service로 라우팅하며, LOGICAL_DNS와 ROUND_ROBIN 부하 분산을 사용했습니다. Listener는 트래픽의 입구, Routes는 라우팅 규칙, Clusters는 목적지를 설정하며, 모든 설정은 파일에 명시됩니다. 이는 간단하지만 변경 시 재시작이 필요한 방식으로, 동적 설정과 대비됩니다.
🚀 2. Envoy Proxy 동적 설정이란?
Envoy Proxy는 **동적 설정(Dynamic Configuration)**을 통해 서비스 중단 없이 설정을 실시간으로 업데이트할 수 있는 강력한 기능을 제공합니다. 이를 통해 Listeners, Routes, Clusters 같은 설정을 동적으로 관리할 수 있습니다.
동적 설정은 Envoy의 설정을 실시간으로 업데이트하며, xDS APIs를 통해 유연성을 제공합니다.
📝 동적 설정의 기본: Bootstrap 파일과 xDS APIs
Envoy의 동적 설정은 간단한 Bootstrap 설정 파일로 시작됩니다. 이 파일은 Envoy가 xDS APIs를 통해 설정을 가져올 디스커버리 서비스를 지정합니다. 주요 xDS APIs는 다음과 같습니다:
- LDS (Listener Discovery Service): Envoy가 어떤 Listeners를 열어야 하는지 알려줍니다.
- RDS (Route Discovery Service): Listeners에 적용할 Routes를 정의합니다.
- CDS (Cluster Discovery Service): Envoy가 사용할 Clusters와 그 설정을 제공합니다.
- EDS (Endpoint Discovery Service): 특정 Cluster의 엔드포인트를 지정합니다.
- SDS (Secret Discovery Service): 인증서 같은 보안 정보를 배포합니다.
- ADS (Aggregate Discovery Service): 모든 xDS API의 변경 사항을 순서대로 스트리밍합니다.
xDS APIs는 LDS, RDS, CDS, EDS, SDS, ADS로 구성되며, 설정을 동적으로 관리합니다.
🔄 ADS: 설정 순서 문제 해결
xDS APIs는 Eventual Consistency를 기반으로 동작합니다. 즉, 설정이 최종적으로 일치하지만, 업데이트 순서에 따라 일시적인 오류가 발생할 수 있습니다. 예를 들어, RDS가 새로운 Route를 추가했지만, 해당 Cluster가 CDS에 아직 업데이트되지 않았다면 라우팅 오류가 생길 수 있습니다. ADS는 모든 xDS 변경 사항을 순서대로 스트리밍해 이러한 문제를 해결합니다. Istio는 ADS를 사용해 프록시 설정을 관리합니다.
ADS는 xDS API의 변경 사항을 순서대로 스트리밍해 설정 순서 문제를 방지합니다.
🛠️ 동적 설정 예제: LDS 설정
다음은 LDS를 사용해 Listeners를 동적으로 가져오는 Envoy 설정 예제입니다:
dynamic_resources:
lds_config:
api_config_source:
api_type: GRPC
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
clusters:
- name: xds_cluster
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
hosts: [{ socket_address: { address: 127.0.0.3, port_value: 5678 }}]
이 설정은 LDS API를 통해 Listeners를 동적으로 가져오며, xds_cluster라는 클러스터를 명시적으로 정의해 LDS API의 위치를 지정합니다.
핵심 포인트: LDS 설정은 Listeners를 동적으로 가져오며, xds_cluster로 API 위치를 지정합니다.
🌐 Istio와 동적 설정: 실전 예제
Istio는 ADS를 활용해 동적 설정을 구현합니다. 다음은 Istio의 Bootstrap 설정 예제입니다:
bootstrap:
dynamicResources:
ldsConfig:
ads: {}
cdsConfig:
ads: {}
adsConfig:
apiType: GRPC
grpcServices:
- envoyGrpc:
clusterName: xds-grpc
refreshDelay: 1.000s
staticResources:
clusters:
- name: xds-grpc
type: STRICT_DNS
connectTimeout: 10.000s
hosts:
- socketAddress:
address: istio-pilot.istio-system
portValue: 15010
circuitBreakers:
thresholds:
- maxConnections: 100000
maxPendingRequests: 100000
maxRequests: 100000
- priority: HIGH
maxConnections: 100000
maxPendingRequests: 100000
maxRequests: 100000
http2ProtocolOptions: {}
이 설정은 LDS와 CDS를 ADS로 동적으로 가져오며, xds-grpc 클러스터는 Istio의 Pilot 컴포넌트(포트 15010)와 연결됩니다. Circuit Breakers는 네트워크 안정성을 높이기 위한 설정입니다.
Istio는 ADS를 사용해 LDS, CDS를 동적으로 관리하며, Pilot과 연결됩니다.
📝 요약: Envoy 동적 설정의 핵심
Envoy Proxy의 동적 설정은 xDS APIs(LDS, RDS, CDS, EDS, SDS, ADS)를 통해 설정을 실시간으로 업데이트합니다. Bootstrap 설정 파일은 디스커버리 서비스를 지정하며, ADS는 변경 사항을 순서대로 스트리밍해 설정 순서 문제를 해결합니다. 예제에서는 LDS로 Listeners를 동적으로 가져오고, Istio는 ADS를 사용해 Pilot과 연동합니다. 이 방식을 통해 Envoy는 유연하고 강력한 네트워크 관리를 제공합니다.
'Istio Hands-on Study [1기]' 카테고리의 다른 글
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy와 Istio의 사용 방법 (0) | 2025.04.15 |
---|---|
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy in action (0) | 2025.04.15 |
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy 프록시란 무엇인가요? (0) | 2025.04.15 |
1주차 : Istio 첫걸음 (7) - Traffic Routing (0) | 2025.04.12 |
1주차 : Istio 첫걸음 (6) - Resiliency (0) | 2025.04.12 |