์ ์ /๋์ ์ค์ ์ ์์๋ด
๋๋ค.
traefik์ ๋ง๋ณผ๋๋, ํธ๋๊ฒ ๋ฐ์ธ ๋ถ๋ถ์ธ๋ฐ envoy๋ ์๋์ ์ผ๋ก ๋ช
๋ฃํ์ต๋๋ค.
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. Static Configuration
์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค.
- static_resources
- listeners
- clusters
(a) static_resources
envoy์ ์์๊ณผ ํจ๊ป, ์ ์ ์ผ๋ก ์ค์ ๋๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๋ค๊ณ ํฉ๋๋ค.
์ค์ ๋ก envoy-demo.yaml ํ์ผ์ ์ด์ด๋ณด๋ฉด ์ต์๋จ์ static_resources์ด ์ ์ธ๋์ด ์์ต๋๋ค.
static_resources:
listeners:
(b) listeners
envoy-demo.yaml ํ์ผ ๊ธฐ์ค,
socket_address: ๋ฆฌ์ค๋๋ ํฌํธ 10000์์ ์์ ํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค.route_config: ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํดservice_envoyproxy_ioํด๋ฌ์คํฐ๋ก ๋ผ์ฐํ ํฉ๋๋ค.
# cat envoy-demo.yaml | grep -A 30 -B 2 listeners
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
access_log:
- name: envoy.access_loggers.stdout
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite_literal: www.envoyproxy.io
cluster: service_envoyproxy_io
(c) clusters
envoy-demo.yaml ํ์ผ ๊ธฐ์ค,
service_envoyproxy_ioํด๋ฌ์คํฐ๋www.envoyproxy.io๋ก ํ๋ก์ํฉ๋๋ค.TLS๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ํฉ๋๋ค.
# cat envoy-demo.yaml | grep -A 18 clusters
clusters:
- name: service_envoyproxy_io
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
load_assignment:
cluster_name: service_envoyproxy_io
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.envoyproxy.io
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
sni: www.envoyproxy.io
2. xDS Comprenhensive Overview
๋์ ์ค์ ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ envoy xDS๋ฅผ ์ดํดํ๊ณ ์ ํ์์ต๋๋ค.
xDS ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ํ์ผ๋ค์ ์ฌ์ฉํด์ ๋์ ๊ตฌ์ฑ์ ํ ์ ์๋ค๊ณ ํฉ๋๋ค.
xDSํ๋กํ ์ฝ: envoy๊ฐ ๋์ ๋ฆฌ์์ค๋ฅผ ๊ฒ์ํ ๋ ํด๋น ์๋น์ค์ API๋ฅผ xDS๋ก ์ด์นญํฉ๋๋ค.
(1) ๊ด์ฐฐํ ํ์ผ๋ช ์ ๋ช ์ํ๊ฑฐ๋, (2) gRPC ์คํธ๋ฆผ์ ์์ํ๊ฑฐ๋, ํน์ (3) REST-JSON API๋ฅผ ํด๋งํด์ ๊ตฌํํฉ๋๋ค. ์ด ์ค, 1ํญ์ ๋ฐฉ๋ฒ์ ์ ์ธํ๊ณ ๋ [DiscoveryResquest] Proto Payload์ ํจ๊ป ์์ฒญ์ ๋ณด๋ด์ด ๊ตฌํ๋ฉ๋๋ค.
- ‘xDS’ ํ๋กํ ์ฝ์ ๊ตฌ๋ถ
| SotW | Incremental | |
|---|---|---|
| separeted gRPC | (a) | (b) |
| single gRPC | (c) | (d) |
SotW๋ Snapshot of the World๋ฅผ ์๋ฏธํ๋ฉฐ, ๋ชจ๋ ๋ฆฌ์์ค๋ก ์ดํดํ์ต๋๋ค.
(a) Basic xDS: ๋ชจ๋ ๋ฆฌ์์ค ์ ํ์ ๋ํ, ๋ณ๋์ gRPC ์คํธ๋ฆผ (b) Incremental xDS: ๊ฐ ๋ฆฌ์์ค ์ ํ์ ๋ํ ์ค๋ถ, ๋ณ๋์ gRPC ์คํธ๋ฆผ (c) Aggregated Discovery Service: ๋ชจ๋ ๋ฆฌ์์ค ์ ํ์ ๋ํ, ๋จ์ผ gRPC ์คํธ๋ฆผ (d) Incremental ADS: ๊ฐ ๋ฆฌ์์ค ์ ํ์ ๋ํ ์ค๋ถ, ๋จ์ผ gRPC ์คํธ๋ฆผ
๋ฌธ์๋ฅผ ๋ณด๊ณ , ์ ๋ช ํ๊ฒ ์ดํด๊ฐ ์ค์ง ์์ ๋งคํธ๋ฆญ์ค๋ฅผ ๊ตฌ์ฑํ๋๋ฐ๋ ๋ญ๊ฐ ๊ฐธ์ํฉ๋๋ค.
์ฌํ๊ฐ, ์ฆ๋ถ์ ์ฌ์ฉํ๋ฉด ์ด์ ์ํ์ ์๋ ๋ธํ์๋ง ์ ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
gRPC ๋จ์ผ ์คํธ๋ฆผ์ ์ต์ข
์ผ๊ด์ฑ(๋ฉฑ๋ฑ์ฑ?) ๋ชจ๋ธ์ ์ ๊ณตํ๊ณ , ๋ค์ค ์คํธ๋ฆผ์ ๋ฆฌ์์ค์ lazy loading์ ๋์ํ ๋ฉ์ปค๋์ฆ์ด๋ผ๊ณ ํฉ๋๋ค.
์ผ ์ด๊ฑฐ Firehose…. ์ ์์ง๋ ์ข ๋ชจํธํฉ๋๋ค
3. Dynamic Configuration (from filesystem)
Runtime ๊ฐ ๋ฐํ์ ์ค๋ช ์ด ๋ณ๋๋ก ์๋๋ฐ ์ข ๋ํดํ๋ค์.
์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค.
node: ํ๋ก์ ์๋ฒ ์๋ณdynamic_resources: ๋์ ๊ตฌ์ฑ์ ์์น๋ฅผ ๋ช ์- listeners
- clusters
์๋์ ๊ฐ์ด, ๋ฐ๋ชจ ํ์ผ์ ๋ฐ์๋ด ์๋ค.
curl -O https://www.envoyproxy.io/docs/envoy/latest/_downloads/9a41bc513e17e885884b3deebf435d2a/envoy-dynamic-filesystem-demo.yaml
(a) node
๋ฐ๋์ cluster์ id๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
# cat envoy-dynamic-filesystem-demo.yaml | grep -A 2 node:
node:
cluster: test-cluster
id: test-id
(b) dynamic_resources
์์ ์์๋ LDS์ CDS ๋ฐ๋ชจํ์ผ์ ์ฌ์ฉํฉ๋๋ค.
curl -O https://www.envoyproxy.io/docs/envoy/latest/_downloads/5cf56125ff834c0e2f21f71e1e8916f2/envoy-dynamic-lds-demo.yaml
curl -O https://www.envoyproxy.io/docs/envoy/latest/_downloads/92bba5b0c48a649b4bc8663000cd097a/envoy-dynamic-cds-demo.yaml
- listeners:
envoy-dynamic-lds-demo.yaml
ํฌํธ 10000์์ HTTP ๋ฆฌ์ค๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
๋ชจ๋ ๋๋ฉ์ธ๊ณผ ๊ฒฝ๋ก๋ service_envoyproxy_io ํด๋ฌ์คํฐ๋ก ๋ผ์ฐํ
ํฉ๋๋ค.
host ํค๋๋ www.envoyproxy.io๋ก ๋ฎ์ฌ์๋๋ค.
# cat envoy-dynamic-lds-demo.yaml
resources:
- "@type": type.googleapis.com/envoy.config.listener.v3.Listener
name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
http_filters:
- name: envoy.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
route:
host_rewrite_literal: www.envoyproxy.io
cluster: example_proxy_cluster
- clusters:
envoy-dynamic-cds-demo.yaml
example_proxy_cluster ํด๋ฌ์คํฐ๋ www.envoyproxy.io๋ก TLSํ๋ก์ํฉ๋๋ค.
# cat envoy-dynamic-cds-demo.yaml
resources:
- "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
name: example_proxy_cluster
type: STRICT_DNS
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
explicit_http_config:
http2_protocol_options: {}
load_assignment:
cluster_name: example_proxy_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.envoyproxy.io
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
sni: www.envoyproxy.io
4. Dynamic Configuration (from Control Plane)
์ปจํธ๋กค ํ๋ ์ธ์ ๊ตฌ์ฑ์ envoy์๊ฒ ์ ๋ฌํ๋๋ก ์ค์ ํด์ผํ๊ธฐ์ ๋ญ๊ฐ ๋ ๊ธธ๊ฒ ์จ์์ต๋๋ค.
์ด๋, ์ปจํธ๋กคํ๋ ์ธ์ Envoy API์ ํธํ๋๋ Gloo ๋ฐ Istio ๋ฑ์ ์ง์นญํฉ๋๋ค.
์๋์ ๊ฐ์ ๊ตฌ์ฑ์ด ํ์ํฉ๋๋ค.
node: ๊ณ ์ ํ ํ๋ก์ ์๋ฒ ์๋ณdynamic_resources: ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํด์ผํ๋ ๊ตฌ์ฑ์ envoy์๊ฒ ๋ช ์static_resources: ๊ฐ์ ธ์ฌ ๊ตฌ์ฑ์ ์์น๋ฅผ envoy์๊ฒ ๋ช ์
์์ ์์ ์ฌ์ฉํ ๋ฐ๋ชจ ํ์ผ์ ๋ฐ์๋ด ๋๋ค.
curl -O https://www.envoyproxy.io/docs/envoy/latest/_downloads/fe2234c3a6762bdffb5300e299973700/envoy-dynamic-control-plane-demo.yaml
node: 3-a์ ๋์ผํฉ๋๋ค.dynamic_resources: ๋์ ๊ตฌ์ฑ๊ณผ ์ด ์ ๋ฐ์ดํธ๋ฅผ ์ฐ๊ฒฐํcluster๋ฅผ ๋ช ์ํฉ๋๋ค.
์๋ ์์์์๋ ๊ฐ xDS ์ ํ์ ์ค์ ์ ์ํด ๊ตฌ์ฑ์ด ์ ๊ณต๋ฉ๋๋ค.
# cat envoy-dynamic-control-plane-demo.yaml | grep -A 2 dynamic_resources:
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
cds_config:
ads: {}
lds_config:
ads: {}
static_resources: (๋ง์ด ์ข ์ด์ํ๊ธด ํ๋ฐ)๋์ ๊ตฌ์ฑ์ ๊ฐ์ ธ์ฌ ๊ณณ์ ๋ช ์ํฉ๋๋ค.
์๋ ์์์์๋, http://my-controle-plane:18000์์ ์ปจํธ๋กค ํ๋ ์ธ์ ์ฐพ๋๋ก xds_cluster ์ ์ ์๋์ด ์์ต๋๋ค.
# cat envoy-dynamic-control-plane-demo.yaml | grep -A 17 static_resources:
static_resources:
clusters:
- type: STRICT_DNS
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
explicit_http_config:
http2_protocol_options: {}
name: xds_cluster
load_assignment:
cluster_name: xds_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: my-control-plane
port_value: 18000
kkumtree
Source code on GitHub
ยฉ 2025 kkumtree and contributors All rights reserved.
Licensed under
CC BY-NC-ND 4.0