ããã«ã¡ã¯ïŒããã¯ããEnvoy ãšã¯äœã§ããïŒãããªãå¿ èŠãªã®ã§ããïŒããã©ãããå§ããã°ããã§ããïŒããšãã質åã«çããçãèšäºã§ãã
ããã¯äœã§ãã
Envoyã¯C++ã§æžãããL4-L7ããŒããã©ã³ãµãŒã§ãé«ããã©ãŒãã³ã¹ãšå¯çšæ§ã«éç¹ã眮ããŠããŸããäžæ¹ã§ãããã©ãŒãã³ã¹é¢ã§ã¯nginxãhaproxyãšããçšåºŠé¡äŒŒããŠãããåçã®æ§èœãåããŠããŸããäžæ¹ã§ããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«éç¹ã眮ããŠãããZuulãTraefikãšãã£ãJavaãGoããŒã¹ã®ãã©ã³ãµãŒã«å£ããªãæ©èœãåããŠããŸãã
haproxy/nginx/envoy ã®æ¯èŒè¡šã絶察çãªçå®ã䞻匵ããŠããããã§ã¯ãããŸããããæŠèŠã瀺ããŠããŸãã
nginx
ããããã·
ç¹äœ¿
ãã¬ãã£ã¯
githubã®ã¹ã¿ãŒ
11.2k/ãã©ãŒ
1.1k/ãã©ãŒ
12.4k
27.6k
æžããã
C
C
C + +
go
API
ããŒ
ãœã±ããã®ã¿/ããã·ã¥
ããŒã¿ãã¬ãŒã³/ãã«
ãã«
ã¢ã¯ãã£ããã«ã¹ãã§ãã¯
ããŒ
ã¯ã
ã¯ã
ã¯ã
ãªãŒãã³ãã¬ãŒã¹
å€éšãã©ã°ã€ã³
ããŒ
ã¯ã
ã¯ã
JWT
å€éšãã©ã°ã€ã³
ããŒ
ã¯ã
ããŒ
æ¡åŒµ
ã«ã¢/C
ã«ã¢/C
ã«ã¢/C++
ããŒ
äœã®ããã«
ããã¯ãŸã è¥ããããžã§ã¯ãã§ãããå€ãã®ãã®ãæ¬ ããŠãããåæã¢ã«ãã¡çã®ãã®ããããŸããããã ç¹äœ¿ã¯ããã®è¥ãããã«æ¥éã«çºå±ããŠããããã§ã«å€ãã®è峿·±ãæ©èœãåããŠããŸããåçãªæ§æã倿°ã®æ¢è£œã®ãã£ã«ã¿ãŒãç¬èªã®ãã£ã«ã¿ãŒãäœæããããã®ã·ã³ãã«ãªã€ã³ã¿ãŒãã§ãŒã¹ãªã©ã§ãã
é©çšé åã¯ããã«åŸããŸããããŸã 2 ã€ã®ã¢ã³ããã¿ãŒã³ããããŸãã
- éçååã
åé¡ã¯ãçŸæç¹ã§ã¯ ç¹äœ¿ ãã£ãã·ã¥ã¯ãµããŒããããŠããªããGoogleã詊ããŠãã æã ãããå®è£ ãããšããã¢ã€ãã¢ã§ã ç¹äœ¿ RFCæºæ ã®ãããã埮åŠãªéšåïŒããããŒã®å±±ïŒãšãç¹å®ã®å®è£ ã®ããã®ã€ã³ã¿ãŒãã§ãŒã¹ã®äœæããããããŸã ã¢ã«ãã¡çã«ãè³ã£ãŠããããã¢ãŒããã¯ãã£ã¯è°è«äžã ã ãªãŒãã³ïŒãã®èšäºãæžããŠããéã«PRãããŒãžãããŸãããããã®ç¹ã¯ãŸã é¢é£ããŠããŸãïŒã
ãã®éãéçã«ã¯ nginx ã䜿çšããŠãã ããã
- éçæ§æã
䜿ãããšã¯ã§ããŸããã ç¹äœ¿ ãã®ããã«äœããããã®ã§ã¯ãããŸãããéçèšå®ã®å¯èœæ§ã¯æããã«ãããŸãããå€ãã®ç¹ããããŸãã
yamlã§èšå®ãç·šéãããšããã¹ãç¯ããããéçºè ã®åé·ããåããããnginx/haproxyã®èšå®ã¯æ§é åãããŠããªããã®ã®ãããç°¡æœã ãšæã£ããããã§ããããããããã€ã³ãã§ããnginxãšhaproxyã®èšå®ã¯æåã§ç·šéã§ããããã«äœæãããŠããã ç¹äœ¿ ã³ãŒãããçæããããã®ãã®ã§ããèšå®å šäœã¯ proto ãã¡ã€ã«ããçæãããšãééããèµ·ãã«ãããªããŸãã
ã«ããªã¢ã·ããªãªããã©ãã¯ããã¯ã¹å±éãªã©ãå€ãã®ã·ããªãªã¯éåžžãåçæ§æã§ã®ã¿å®è£ ãããŸããéçæ§æã§ã¯äžå¯èœã ãšèšã£ãŠããããã§ã¯ãããŸãããç§ãã¡ã¯çããããè¡ã£ãŠããŸãããããããã®ããã«ã¯ããã©ã³ãµãŒãã ç¹äœ¿ å«ã
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 Ingress ã§ãã
- ã¢ã¯ãã£ããªãã«ã¹ãã§ãã¯ã
ã¢ã¯ãã£ããªãã«ã¹ãã§ãã¯ãããå Žåã¯ããã©ãã£ãã¯ãéä¿¡ããåã«ãæ°ããèšå®ã§ãã¹ãŠãåãã§ãã¯ããå¿ èŠããããŸããã¢ããã¹ããªãŒã ã倿°ããå Žåã¯ããã®åŠçã«æéãããããŸããhaproxyãããããã«ã¡ã¯ã
ããã¯ã©ã®ããã«è§£æ±ºãããã®ã§ãããã ç¹äœ¿ã¢ãã«ããŒã«ã«åºã¥ããŠæ§æãåçã«ããŒãããããšã§ãæ§æãè€æ°ã®éšåã«åå²ãã倿ŽãããŠããªãéšåã¯ååæåããã«æžã¿ãŸããäŸãã°ããªã¹ããŒã¯ååæåã«ã³ã¹ãããããã倿Žé »åºŠãäœãããããã®ãããªåŠçãäžèŠã«ãªããŸãã
èšå® ç¹äœ¿ (äžèšã®ãã¡ã€ã«ãã) 次ã®ãšã³ãã£ãã£ããããŸãã
- ãªã¹ã㌠â ç¹å®ã® IP/ããŒãã§ãã³ã°ããŠãããªã¹ããŒ
- ä»®æ³ãã¹ã - ãã¡ã€ã³åã«ããä»®æ³ãã¹ã
- route â ãã©ã³ã¹ã«ãŒã«
- â ãã©ã³ã¹ãã©ã¡ãŒã¿ãæã€ã¢ããã¹ããªãŒã ã®ã°ã«ãŒã
- çµç¹ â ã¢ããã¹ããªãŒã ã€ã³ã¹ã¿ã³ã¹ã¢ãã¬ã¹
ãããã®ãšã³ãã£ãã£ãšãã®ä»ã®ãšã³ãã£ãã£ã¯åçã«å ¥åã§ããŸãããã®ãããèšå®ãåãåããµãŒãã¹ã®ã¢ãã¬ã¹ãèšå®ã§æå®ããŸãããµãŒãã¹ã¯RESTãŸãã¯gRPCã§ãããgRPCã®äœ¿çšããå§ãããŸãã
ãµãŒãã¹ã¯ããããLDSãVHDSãRDSãCDSãEDSãšåœåãããŠããŸããéçæ§æãšåçæ§æãçµã¿åãããããšã¯å¯èœã§ãããåçãªãœãŒã¹ãéçãªãœãŒã¹ã«æå®ã§ããªããšããå¶éããããŸãã
ã»ãšãã©ã®ã¿ã¹ã¯ã§ã¯ãæåŸã®3ã€ã®ãµãŒãã¹ãå®è£ ããã ãã§ååã§ãããããã¯ADSïŒAggregated Discovery ServiceïŒãšåŒã°ãã Go ã«ã¯ gRPC ããŒã¿ãã¬ãŒã³ã®æ¢æã®å®è£ ãããããœãŒã¹ãããªããžã§ã¯ããå ¥åããã ãã§æžã¿ãŸãã
æ§æã¯æ¬¡ã®åœ¢åŒã«ãªããŸãã
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 ã€ã®ãªãã·ã§ã³ããããŸãã
- ãã¹ãŠã®ãªãœãŒã¹ ã¿ã€ãã«å¯Ÿã㊠1 ã€ã® gRPC ã¹ããªãŒã ã§ããªãœãŒã¹ã®å®å šãªç¶æ ãéä¿¡ãããŸãã
- å¥ã ã®ã¹ããªãŒã ãå®å šãªç¶æ ã
- 1 ã€ã®ã¹ããªãŒã ãå¢åç¶æ ã
- åå¥ã®ã¹ããªãŒã ãå¢åç¶æ ã
ã€ã³ã¯ãªã¡ã³ã¿ã«xDSã¯ãã³ã³ãããŒã«ãã¬ãŒã³ãš ç¹äœ¿ããã¯å€§èŠæš¡ãªæ§æã«é¢ä¿ããŸãããã ãããªã¯ãšã¹ãã¯è³Œèªè§£é€ãšè³Œèªã®ããã®ãªãœãŒã¹ã®ãªã¹ããéä¿¡ãããããããåããè€éã«ãªããŸãã
ãã®äŸã§ã¯ADSã䜿çšããŸããããã¯RDSãCDSãEDSãéå¢åã¢ãŒãã®ããããã«1ã€ã®ã¹ããªãŒã ã§ããå¢åã¢ãŒããæå¹ã«ããã«ã¯ã以äžãæå®ããå¿
èŠããããŸãã api_type: DELTA_GRPC
ãªã¯ãšã¹ãã«ã¯ããŒã ãã©ã¡ãŒã¿ãå«ãŸããŠãããããã€ã³ã¹ã¿ã³ã¹ããšã«ç°ãªããªãœãŒã¹ãã³ã³ãããŒã« ãã¬ãŒã³ã«éä¿¡ã§ããŸãã ç¹äœ¿ããã¯ããµãŒãã¹ ã¡ãã·ã¥ã®æ§ç¯ã«äŸ¿å©ã§ãã
æºåãå§ãã
Ðа ç¹äœ¿ èµ·åæããŸãã¯ã³ã³ãããŒã«ãã¬ãŒã³ããæ°ããèšå®ãåä¿¡ããéã«ããªãœãŒã¹ãŠã©ãŒã ã¢ããããã»ã¹ãéå§ãããŸããããã¯ããªã¹ããŒãŠã©ãŒã ã¢ãããšã¯ã©ã¹ã¿ãŠã©ãŒã ã¢ããã«åãããŠããŸããåè ã¯RDS/LDSã«å€æŽããã£ãå Žåã«ãåŸè ã¯CDS/EDSã«å€æŽããã£ãå Žåã«èµ·åãããŸããã€ãŸããã¢ããã¹ããªãŒã ã®ã¿ã倿Žãããå Žåããªã¹ããŒã¯åäœæãããŸããã
ãŠã©ãŒã ã¢ããäžãã³ã³ãããŒã«ãã¬ãŒã³ããã®äŸåãªãœãŒã¹ã¯ã¿ã€ã ã¢ãŠããŸã§åŸ
æ©ãããŸããã¿ã€ã ã¢ãŠãã«éãããšåæåã¯å€±æããæ°ãããªã¹ããŒã¯ããŒãã®ãªãã¹ã³ãéå§ããŸããã
åæåé åºïŒEDSãCDSãã¢ã¯ãã£ããã«ã¹ãã§ãã¯ãRDSãLDSãã¢ã¯ãã£ããã«ã¹ãã§ãã¯ãæå¹ã«ãããšã1åã®ãã«ã¹ãã§ãã¯ãæåããå Žåã«ã®ã¿ãã©ãã£ãã¯ãã¢ããã¹ããªãŒã ã«éä¿¡ãããŸãã
ãªã¹ããŒãåäœæããããšãå€ããªã¹ããŒã¯ DRAIN ç¶æ
ã«ãªãããã¹ãŠã®æ¥ç¶ãéãããããã¿ã€ã ã¢ãŠããçµéãããšåé€ãããŸãã --drain-time-sããã©ã«ãã¯10åã§ãã
ç¶ç¶ããããã«ã
åºæïŒ habr.com
