์ธ์ฌ๋ง! ์ด๊ฒ์ "ํน์ฌ๋ ๋ฌด์์ ๋๊น?", "์ ํ์ํ๊ฐ์?"๋ผ๋ ์ง๋ฌธ์ ๋ตํ๋ ์งง์ ๊ธฐ์ฌ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ "์ด๋๋ถํฐ ์์ํด์ผ ํ ๊น์?"
์ด๊ฒ ๋ญ์ง?
Envoy๋ ๊ณ ์ฑ๋ฅ๊ณผ ๊ฐ์ฉ์ฑ์ ์ด์ ์ ๋ง์ถ C++๋ก ์์ฑ๋ L4-L7 ๋ฐธ๋ฐ์์ ๋๋ค. ํํธ์ผ๋ก ์ด๊ฒ์ ์ด๋ค ๋ฉด์์ nginx ๋ฐ haproxy์ ์ ์ฌํ๋ฉฐ ์ฑ๋ฅ๋ฉด์์ ๋น์ทํฉ๋๋ค. ๋ฐ๋ฉด์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ๋ ์ค์ ์ ๋๊ณ ์์ผ๋ฉฐ zuul ๋๋ traefik๊ณผ ๊ฐ์ Java ๋ฐ Go ๋ฐธ๋ฐ์๋ณด๋ค ๋์์ง ์์ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
haproxy/nginx/envoy์ ๋น๊ตํ๋ ์ ๋์ ์ธ ์ง์ค์ด๋ผ๊ณ ์ฃผ์ฅํ์ง ์์ง๋ง ์ผ๋ฐ์ ์ธ ๊ทธ๋ฆผ์ ์ ๊ณตํฉ๋๋ค.
Nginx์
ํํฉ
์ฌ์
Traefik
github์ ๋ณ
11.2k/๋ฏธ๋ฌ
1.1k/๋ฏธ๋ฌ
12.4k
27.6k
์ฐ์ฌ์ง
C
C
C + +
go
API
์๋
์์ผ ์ ์ฉ/ํธ์
๋ฐ์ดํฐํ๋ ์ธ/ํ
๋น๊ฒจ
ํ์ฑ ์ํ ํ์ธ
์๋
์
์
์
์คํ ํธ๋ ์ด์ฑ
์ธ๋ถ ํ๋ฌ๊ทธ์ธ
์๋
์
์
JWT
์ธ๋ถ ํ๋ฌ๊ทธ์ธ
์๋
์
์๋
์ ์ฅ
๋ฃจ์/C
๋ฃจ์/C
๋ฃจ์/C++
์๋
๋ฌด์์ ์ํด
์ด ํ๋ก์ ํธ๋ ์ด๊ธฐ ๋จ๊ณ์ด๊ธฐ ๋๋ฌธ์ ๋๋ฝ๋ ๋ถ๋ถ์ด ๋ง์ผ๋ฉฐ ์ผ๋ถ๋ ์ด๊ธฐ ์ํ ๋ฒ์ ์
๋๋ค. ํ์ง๋ง ์ฌ์ ์ญ์ ์ ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ ์ด๋ฏธ ๋์ ๊ตฌ์ฑ, ๊ธฐ์ฑ ํํฐ, ์์ ๋ง์ ํํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ๋จํ ์ธํฐํ์ด์ค ๋ฑ ๋ง์ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
์ ์ฉ ๋ถ์ผ๋ ๋ค์๊ณผ ๊ฐ์ง๋ง ๋จผ์ 2๊ฐ์ง ์ํฐํจํด์ด ์์ต๋๋ค.
- ์ ์ ๋ฐ๋.
์ฌ์ค์ ํ์ฌ ์ด ์๊ฐ์๋ ์ฌ์ ์บ์ฑ ์ง์์ด ์์ต๋๋ค. ๊ตฌ๊ธ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์๋ํ๊ณ ์์ต๋๋ค
์ง๊ธ์ ์ ์ ์ฉ์ผ๋ก nginx๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ ์ ๊ตฌ์ฑ.
์ฌ์ฉํ์ ๋ ๋์ง๋ง ์ฌ์ ๊ทธ๋ฐ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ์ด ์๋๋๋ค. ์ ์ ๊ตฌ์ฑ์ ๊ธฐ๋ฅ์ ๋ ธ์ถ๋์ง ์์ต๋๋ค. ๋ง์ ์๊ฐ์ด ์์ต๋๋ค:
yaml์์ ๊ตฌ์ฑ์ ํธ์งํ ๋ ๊ฐ๋ฐ์๊ฐ ์ฅํฉํ๋ค๊ณ ๊พธ์ง๊ณ nginx/haproxy ๊ตฌ์ฑ์ด ๋ ๊ตฌ์กฐ์ ์ด์ง๋ง ๋ ๊ฐ๊ฒฐํ๋ค๊ณ ์๊ฐํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๊ฒ ์์ ์
๋๋ค. Nginx์ Haproxy์ ๊ตฌ์ฑ์ ์ง์ ํธ์งํ ์ ์๋๋ก ์์ฑ๋์์ผ๋ฉฐ, ์ฌ์ ์ฝ๋์์ ์์ฑ์ ์ํด. ์ ์ฒด ๊ตฌ์ฑ์ ๋ค์์ ์ค๋ช
๋์ด ์์ต๋๋ค.
Canary, b/g ๋ฐฐํฌ ์๋๋ฆฌ์ค ๋ฑ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ ๊ตฌ์ฑ์์๋ง ๊ตฌํ๋ฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๋ ๊ทธ๊ฒ์ ํฉ๋๋ค. ํ์ง๋ง ์ด๋ฅผ ์ํด์๋ ๋ฐธ๋ฐ์์์ ๋ชฉ๋ฐ์ ์ฐฉ์ฉํด์ผ ํฉ๋๋ค. ์ฌ์ ํฌํจ
Envoy๊ฐ ๊ผญ ํ์ํ ์์ :
- ๋ณต์กํ๊ณ ์ญ๋์ ์ธ ์์คํ ์ ํธ๋ํฝ ๋ฐธ๋ฐ์ฑ. ์ฌ๊ธฐ์๋ ์๋น์ค ๋ฉ์๊ฐ ํฌํจ๋์ง๋ง ๋ฐ๋์ ์ ์ผํ ๊ฒ์ ์๋๋๋ค.
- ๋ถ์ฐ ์ถ์ ๊ธฐ๋ฅ, ๋ณต์กํ ์ธ์ฆ ๋๋ ๋ค์์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐํ ๊ธฐ๋ฅ์ ๋ํ ํ์์ฑ ์ฌ์ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฑฐ๋ ํธ๋ฆฌํ๊ฒ ๊ตฌํ๋์ง๋ง nginx/haproxy์์๋ lua ๋ฐ ๋ชจํธํ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋๋ฌ์ธ์ฌ ์์ด์ผ ํฉ๋๋ค.
ํ์ํ ๊ฒฝ์ฐ ๋ ๋ค ๊ณ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด๊ฑฐ ์ด๋ป๊ฒ ์๋ ์์ผ์
Envoy๋ Docker ์ด๋ฏธ์ง๋ก๋ง ๋ฐ์ด๋๋ฆฌ๋ก ๋ฐฐํฌ๋ฉ๋๋ค. ์ด๋ฏธ์ง์๋ ์ด๋ฏธ ์ ์ ๊ตฌ์ฑ์ ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ง ๊ด์ฌ์ด ์์ต๋๋ค.
envoy.yaml ์ ์ ๊ตฌ์ฑ
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.google.com
cluster: service_google
http_filters:
- name: envoy.router
clusters:
- name: service_google
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_google
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.google.com
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
sni: www.google.com
๋์ ๊ตฌ์ฑ
์ฐ๋ฆฌ๋ ์ด๋ค ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ๊ณ ์๋์? ๋ก๋๋ ์ํ์์ ๋ก๋ ๋ฐธ๋ฐ์ ๊ตฌ์ฑ์ ๋ค์ ๋ก๋ํ ์๋ ์์ผ๋ฉฐ "์์" ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๊ตฌ์ฑ ๊ฒ์ฆ.
๊ตฌ์ฑ์ ํด ์๋ ์๊ณ ๋งค์ฐ ํด ์๋ ์์ต๋๋ค. ํ ๋ฒ์ ๋ชจ๋ ๊ณผ๋ถํํ๋ฉด ์ด๋๊ฐ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
- ์ค๋ ์ง์๋๋ ์ฐ๊ฒฐ.
์ ๋ฆฌ์ค๋๋ฅผ ์ด๊ธฐํํ ๋ ์ด์ ๋ฆฌ์ค๋์์ ์คํ ์ค์ธ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ๋ณ๊ฒฝ์ด ์์ฃผ ๋ฐ์ํ๊ณ ์ฐ๊ฒฐ์ด ์ค๋ ์ง์๋๋ ๊ฒฝ์ฐ ํํ์ ์ ์ฐพ์์ผ ํฉ๋๋ค. ์๋ ํ์ธ์, nginx์ kubernetes ์์ ์ ๋๋ค.
- ํ์ฑ ์ํ ํ์ธ.
ํ์ฑ ์ํ ํ์ธ์ด ์๋ ๊ฒฝ์ฐ ํธ๋ํฝ์ ๋ณด๋ด๊ธฐ ์ ์ ์ ๊ตฌ์ฑ์์ ์ด๋ฅผ ๋ชจ๋ ๋ค์ ํ์ธํด์ผ ํฉ๋๋ค. ์ ์คํธ๋ฆผ์ด ๋ง์ผ๋ฉด ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ์๋ ํ์ธ์ ํํ๋ก์์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ป๊ฒ ํด๊ฒฐ๋ฉ๋๊น? ์ฌ์ ํ ๋ชจ๋ธ์ ๋ฐ๋ผ ๊ตฌ์ฑ์ ๋์ ์ผ๋ก ๋ก๋ํจ์ผ๋ก์จ ๋ณ๋์ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ ๋ณ๊ฒฝ๋์ง ์์ ๋ถ๋ถ์ ๋ค์ ์ด๊ธฐํํ์ง ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ ์ด๊ธฐํํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ๋ฆฌ์ค๋๊ฐ ์์ต๋๋ค.
๊ตฌ์ฑ ์ฌ์ (์ ํ์ผ์์) ๋ค์๊ณผ ๊ฐ์ ์ํฐํฐ๊ฐ ์์ต๋๋ค.
- ๊ฒฝ์ฒญ์ โ ํน์ IP/ํฌํธ์ ๋ฆฌ์ค๋๊ฐ ๊ฑธ๋ ค ์์ต๋๋ค.
- ๊ฐ์ ํธ์คํธ - ๋๋ฉ์ธ ์ด๋ฆ๋ณ ๊ฐ์ ํธ์คํธ
- ๊ธธ - ๊ท ํ ๊ท์น
- ํด๋ฌ์คํฐ โ ๊ท ํ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ์คํธ๋ฆผ ๊ทธ๋ฃน
- ์๋ ํฌ์ธํธ โ ์ ์คํธ๋ฆผ ์ธ์คํด์ค ์ฃผ์
์ด๋ฌํ ๊ฐ ์ํฐํฐ์ ๋ค๋ฅธ ์ํฐํฐ๋ ๋์ ์ผ๋ก ์ฑ์์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ๊ตฌ์ฑ์ ๊ตฌ์ฑ์ด ์์ ๋ ์๋น์ค์ ์ฃผ์๋ฅผ ์ง์ ํฉ๋๋ค. ์๋น์ค๋ REST ๋๋ gRPC์ผ ์ ์์ผ๋ฉฐ, gRPC๊ฐ ๋ฐ๋์งํฉ๋๋ค.
์๋น์ค ์ด๋ฆ์ ๊ฐ๊ฐ LDS, VHDS, RDS, CDS ๋ฐ EDS๋ก ์ง์ ๋ฉ๋๋ค. ๋์ ๋ฆฌ์์ค๋ฅผ ์ ์ โโ๋ฆฌ์์ค์ ์ง์ ํ ์ ์๋ค๋ ์ ํ ์ฌํญ์ ์ ์ธํ๊ณ ์ ์ ๊ตฌ์ฑ๊ณผ ๋์ ๊ตฌ์ฑ์ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ ์์
์์๋ ๋ง์ง๋ง ์ธ ๊ฐ์ง ์๋น์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ์ด๋ฅผ ADS(Aggregated Discovery Service)๋ผ๊ณ ํฉ๋๋ค.
๊ตฌ์ฑ์ ๋ค์ ํ์์ ์ทจํฉ๋๋ค.
envoy.yaml ๋์ ๊ตฌ์ฑ
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: xds_clr
cds_config:
ads: {}
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
rds:
route_config_name: local_route
config_source:
ads: {}
http_filters:
- name: envoy.router
clusters:
- name: xds_clr
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: xds_clr
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: xds
port_value: 6565
์์ํ ๋ ์ฌ์ ์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ์ ์ด ํ๋ฉด์ ์ฐ๊ฒฐํ๊ณ RDS, CDS ๋ฐ EDS ๊ตฌ์ฑ์ ์์ฒญํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ํธ ์์ฉ ํ๋ก์ธ์ค๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ์ค๋ช
๋ฉ๋๋ค.
์ฆ, ์ฌ์ ์์ฒญ๋๋ ๋ฆฌ์์ค ์ ํ, ๋
ธ๋์ ๋ฒ์ ๋ฐ ๋งค๊ฐ๋ณ์๋ฅผ ๋ํ๋ด๋ ์์ฒญ์ ๋ณด๋
๋๋ค. ์ด์ ๋ํ ์๋ต์ผ๋ก ๋ฆฌ์์ค์ ๋ฒ์ ์ ์์ ํ๋ฉฐ, ์ ์ด ํ๋ฉด์ ๋ฒ์ ์ด ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์๋ตํ์ง ์์ต๋๋ค.
4๊ฐ์ง ์ํธ์์ฉ ์ต์
์ด ์์ต๋๋ค:
- ๋ชจ๋ ์ ํ์ ๋ฆฌ์์ค์ ๋ํ ํ๋์ gRPC ์คํธ๋ฆผ, ๋ฆฌ์์ค์ ์ ์ฒด ์ํ๊ฐ ์ ์ก๋ฉ๋๋ค.
- ๋ณ๋์ ์คํธ๋ฆผ, ์์ ํ ์ํ.
- ํ๋์ ์คํธ๋ฆผ, ์ฆ๋ถ ์ํ.
- ๋ณ๋์ ์คํธ๋ฆผ, ์ฆ๋ถ ์ํ.
์ฆ๋ถ xDS๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ด ์์ญ๊ณผ ์ ์ด ์์ญ ๊ฐ์ ํธ๋ํฝ์ ์ค์ผ ์ ์์ต๋๋ค. ์ฌ์ , ์ด๋ ๋๊ท๋ชจ ๊ตฌ์ฑ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญ์๋ ๊ตฌ๋ ์ทจ์ ๋ฐ ๊ตฌ๋ ์ ์ํ ๋ฆฌ์์ค ๋ชฉ๋ก์ด ํฌํจ๋์ด ์์ด ์ํธ ์์ฉ์ด ๋ณต์กํด์ง๋๋ค.
์ฐ๋ฆฌ์ ์์์๋ RDS, CDS, EDS ๋ฐ ๋น์ฆ๋ถ ๋ชจ๋์ ๋ํ ํ๋์ ์คํธ๋ฆผ์ธ ADS๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ๋ถ ๋ชจ๋๋ฅผ ํ์ฑํํ๋ ค๋ฉด ๋ค์์ ์ง์ ํด์ผ ํฉ๋๋ค. api_type: DELTA_GRPC
์์ฒญ์ ๋ ธ๋ ๋งค๊ฐ๋ณ์๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋ค์ํ ์ธ์คํด์ค์ ๋ํด ๋ค์ํ ๋ฆฌ์์ค๋ฅผ ์ ์ด ํ๋ ์ธ์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค. ์ฌ์ , ์ด๋ ์๋น์ค ๋ฉ์ ๊ตฌ์ถ์ ํธ๋ฆฌํฉ๋๋ค.
์๋ฐ์
์ ์ฌ์ ์์ ์ ๋๋ ์ ์ด ์์ญ์์ ์ ๊ตฌ์ฑ์ ์์ ํ ๋ ๋ฆฌ์์ค ์ค๋น ํ๋ก์ธ์ค๊ฐ ์์๋ฉ๋๋ค. ๋ฆฌ์ค๋ ์๋ฐ์ ๊ณผ ํด๋ฌ์คํฐ ์๋ฐ์ ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ RDS/LDS์ ๋ณ๊ฒฝ์ด ์์ ๋ ์์๋๊ณ , ๋ ๋ฒ์งธ๋ CDS/EDS๊ฐ ์์ ๋ ์์๋ฉ๋๋ค. ์ด๋ ์ ์คํธ๋ฆผ๋ง ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ์ค๋๊ฐ ๋ค์ ์์ฑ๋์ง ์์์ ์๋ฏธํฉ๋๋ค.
์๋ฐ์
ํ๋ก์ธ์ค ์ค์ ์ ํ ์๊ฐ ๋์ ์ ์ด ์์ญ์์ ์ข
์ ๋ฆฌ์์ค๊ฐ ์์๋ฉ๋๋ค. ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ฉด ์ด๊ธฐํ๊ฐ ์คํจํ๊ณ ์ ๋ฆฌ์ค๋๊ฐ ํฌํธ์์ ์์ ๋๊ธฐ๋ฅผ ์์ํ์ง ์์ต๋๋ค.
์ด๊ธฐํ ์์: EDS, CDS, ํ์ฑ ์ํ ํ์ธ, RDS, LDS. ํ์ฑ ์ํ ํ์ธ์ด ํ์ฑํ๋๋ฉด ์ํ ํ์ธ์ด ํ ๋ฒ ์ฑ๊ณตํ ํ์๋ง ํธ๋ํฝ์ด ์
์คํธ๋ฆผ์ผ๋ก ์ด๋ํฉ๋๋ค.
๋ฆฌ์ค๋๊ฐ ๋ค์ ์์ฑ๋ ๊ฒฝ์ฐ ์ด์ ๋ฆฌ์ค๋๋ DRAIN ์ํ๊ฐ ๋๊ณ ๋ชจ๋ ์ฐ๊ฒฐ์ด ๋ซํ๊ฑฐ๋ ์ ํ ์๊ฐ์ด ๋ง๋ฃ๋ ํ ์ญ์ ๋ฉ๋๋ค. --drain-time-s
, ๊ธฐ๋ณธ๊ฐ์ 10๋ถ์
๋๋ค.
๊ณ์ ๋ ๊ฑฐ์ผ.
์ถ์ฒ : habr.com