Hei Habr! Dyma gyfieithiad o'r post:
Mae Envoy yn weinydd dirprwy dosbarthedig perfformiad uchel (wedi'i ysgrifennu yn C ++) sydd wedi'i gynllunio ar gyfer gwasanaethau a chymwysiadau unigol, mae hefyd yn fws cyfathrebu ac yn "awyren data cyffredinol" a gynlluniwyd ar gyfer pensaernïaeth microwasanaeth "rhwyll gwasanaeth" fawr. Pan gafodd ei greu, ystyriwyd atebion i broblemau a gododd yn ystod datblygiad gweinyddwyr fel NGINX, HAProxy, balanswyr llwyth caledwedd a balanswyr llwyth cwmwl. Mae Cennad yn gweithio gyda phob cymhwysiad ac yn crynhoi'r rhwydwaith i ddarparu swyddogaethau cyffredin waeth beth fo'r platfform. Pan fydd yr holl draffig gwasanaeth yn y seilwaith yn mynd trwy'r grid Envoy, mae'n dod yn hawdd delweddu meysydd problem trwy arsylwi cyson, tiwnio perfformiad cyffredinol, ac ychwanegu ymarferoldeb craidd mewn lleoliad penodol.
Galluoedd
- Pensaernïaeth y tu allan i'r broses: gweinydd hunangynhwysol, perfformiad uchel yw cennad sy'n cymryd ychydig o RAM. Mae'n gweithio ar y cyd ag unrhyw iaith neu fframwaith cymhwysiad.
- http/2 a chefnogaeth grpc: mae gan y llysgennad http/2 o'r radd flaenaf a chefnogaeth grpc ar gyfer cysylltiadau sy'n dod i mewn ac yn mynd allan. Mae'n ddirprwy tryloyw o http/1.1 i http/2.
- Cydbwyso llwyth uwch: mae llysgennad yn cefnogi nodweddion cydbwyso llwyth uwch, gan gynnwys ail-geisiau awtomatig, terfynu cadwyn, cyfyngu ar gyfraddau byd-eang, cysgodi ymholiadau, cydbwyso llwyth lleol parth, ac ati.
- API Rheolaeth Ffurfweddu: mae cennad yn darparu API cadarn ar gyfer rheoli ei ffurfweddiad yn ddeinamig.
- Arsylwi: Arsylwi dwfn traffig L7, cefnogaeth frodorol ar gyfer olrhain gwasgaredig, ac arsylwi mongodb, dynamodb a llawer o gymwysiadau eraill.
Cam 1 - Enghraifft Ffurfwedd NGINX
Mae'r sgript hon yn defnyddio ffeil wedi'i saernïo'n arbennig nginx.conf, yn seiliedig ar yr enghraifft gyflawn o
Cyfluniad nginx cychwynnol
user www www;
pid /var/run/nginx.pid;
worker_processes 2;
events {
worker_connections 2000;
}
http {
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
server {
listen 8080;
server_name one.example.com www.one.example.com;
access_log /var/log/nginx.access_log main;
error_log /var/log/nginx.error_log info;
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Yn nodweddiadol mae gan gyfluniadau NGINX dair elfen allweddol:
- Sefydlu gweinydd NGINX, strwythur logio, ac ymarferoldeb Gzip. Diffinnir hyn yn fyd-eang ym mhob achos.
- Wrthi'n ffurfweddu NGINX i dderbyn ceisiadau i'r gwesteiwr un.enghraifft.com ar borth 8080.
- Gosod lleoliad targed, sut i drin traffig ar gyfer gwahanol rannau o'r URL.
Ni fydd pob ffurfweddiad yn berthnasol i Envoy Proxy ac nid oes angen i chi ffurfweddu rhai gosodiadau. Mae gan Gennad Dirprwy pedwar math allweddol, sy'n cefnogi'r seilwaith sylfaenol a gynigir gan NGINX. Y cnewyllyn yw:
- Gwrandawyr: Maent yn diffinio sut mae Envoy Proxy yn derbyn ceisiadau sy'n dod i mewn. Ar hyn o bryd dim ond gwrandawyr sy'n seiliedig ar TCP y mae Envoy Proxy yn eu cefnogi. Unwaith y bydd cysylltiad wedi'i sefydlu, caiff ei drosglwyddo i'r set hidlo i'w brosesu.
- Hidlau: Maent yn rhan o bensaernïaeth biblinell sy'n gallu prosesu data sy'n dod i mewn ac sy'n mynd allan. Mae'r swyddogaeth hon yn cynnwys hidlwyr fel Gzip, sy'n cywasgu data cyn ei anfon at y cleient.
- Llwybryddion: Maent yn ailgyfeirio traffig i'r gyrchfan a ddymunir, a ddiffinnir fel clwstwr.
- Clystyrau: Maent yn diffinio'r pwynt terfyn ar gyfer opsiynau traffig a chyfluniad.
Byddwn yn defnyddio'r pedair cydran hyn i greu cyfluniad Envoy Proxy i gyd-fynd â chyfluniad NGINX penodol. Pwrpas Cennad yw gwaith API a chyfluniad deinamig. Yn yr achos hwn, bydd y ffurfweddiad sylfaen yn defnyddio'r opsiynau statig, cod caled o NGINX.
Cam 2 - Ffurfweddiad NGINX
Rhan gyntaf nginx.conf yn diffinio rhai mewnoliadau NGINX y mae'n rhaid eu ffurfweddu.
Cysylltiadau Gweithwyr
Mae'r ffurfweddiad isod yn pennu nifer y prosesau a'r cysylltiadau gweithwyr. Mae hyn yn dangos sut y bydd NGINX yn graddio i ateb y galw.
worker_processes 2;
events {
worker_connections 2000;
}
Mae Envoy Proxy yn rheoli llifoedd gwaith a chysylltiadau mewn gwahanol ffyrdd.
Mae Cennad yn creu edefyn gweithiwr ar gyfer pob edefyn caledwedd yn y system. Mae pob edefyn gweithiwr yn gweithredu dolen digwyddiad di-rwystro sy'n gyfrifol amdani
- Gwrando ar bob gwrandäwr (gwrandäwr)
- Derbyn cysylltiadau newydd
- Creu set hidlydd ar gyfer cysylltiad
- Prosesu'r holl weithrediadau I/O yn ystod oes y cysylltiad.
Mae holl brosesu pellach y cysylltiad yn cael ei drin yn gyfan gwbl yn yr edefyn gweithiwr, gan gynnwys unrhyw ymddygiad anfon ymlaen.
Ar gyfer pob llinyn gweithiwr yn Envoy, mae cysylltiad yn y pwll. Felly dim ond un cysylltiad y mae pyllau cysylltiad HTTP/2 yn ei sefydlu ar gyfer pob gwesteiwr allanol ar y tro, gyda phedwar llinyn gweithiwr, bydd pedwar cysylltiad HTTP/2 ar gyfer pob gwesteiwr allanol mewn cyflwr sefydlog. Trwy gadw popeth ar edefyn gweithiwr sengl, gellir ysgrifennu bron pob cod yn rhydd o flociau fel pe bai'n un edau. Os bydd mwy o edafedd gweithwyr yn cael eu dyrannu nag sydd angen, gall hyn arwain at wastraffu cof, creu nifer fawr o gysylltiadau segur, a lleihau nifer y cysylltiadau sy'n dychwelyd yn ôl i'r pwll.
Am fwy o wybodaeth, ewch i
Ffurfweddiad HTTP
Mae'r bloc cyfluniad NGINX canlynol yn diffinio gosodiadau HTTP fel:
- Pa fathau o feim sy'n cael eu cefnogi
- Goramser rhagosodedig
- Cyfluniad Gzip
Gallwch chi addasu'r agweddau hyn gyda hidlwyr yn Envoy Proxy, y byddwn yn eu trafod yn nes ymlaen.
Cam 3 - Ffurfweddu Gweinydd
Yn y bloc cyfluniad HTTP, mae'r ffurfweddiad NGINX yn nodi gwrando ar borth 8080 ac ymateb i geisiadau sy'n dod i mewn am barthau un.enghraifft.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Tu Mewn Cennad, Gwrandawyr sy'n rheoli hyn.
Gwrandawyr cenhadol
Yr agwedd bwysicaf ar ddechrau gyda Envoy Proxy yw diffinio'r gwrandawyr. Mae angen i chi greu ffeil ffurfweddu sy'n disgrifio sut rydych chi am redeg yr enghraifft Envoy.
Bydd y pyt isod yn creu gwrandäwr newydd ac yn ei rwymo i borthladd 8080. Mae'r ffurfweddiad yn dweud wrth Envoy Proxy pa borthladdoedd y dylai fod yn rhwym iddynt ar gyfer ceisiadau sy'n dod i mewn.
Mae Envoy Proxy yn defnyddio nodiant YAML ar gyfer ei ffurfweddiad. Am gyflwyniad i'r nodiant hwn, gweler yma
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Nid oes angen diffinio gweinydd_name, gan y bydd yr hidlwyr Envoy Proxy yn trin hyn.
Cam 4 — Ffurfweddu Lleoliad
Pan fydd cais yn cyrraedd NGINX, mae'r bloc lleoliad yn pennu sut i drin a ble i gyfeirio'r traffig. Yn y darn canlynol, trosglwyddir yr holl draffig i'r safle i'r clwstwr i fyny'r afon (nodyn y cyfieithydd: gweinydd cymhwysiad yw i fyny'r afon fel arfer) a enwir targedClwstwr. Mae'r clwstwr i fyny'r afon yn diffinio'r nodau a ddylai brosesu'r cais. Byddwn yn trafod hyn yn y cam nesaf.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Yn Envoy, dyma beth mae Filters yn ei wneud.
Hidlau Cenhadol
Ar gyfer cyfluniad statig, mae hidlwyr yn pennu sut mae ceisiadau sy'n dod i mewn yn cael eu prosesu. Yn yr achos hwn, rydym yn gosod hidlwyr sy'n cyfateb gweinydd_enwau yn y cam blaenorol. Pan ddaw ceisiadau sy'n dod i mewn sy'n cyd-fynd â rhai parthau a llwybrau, mae traffig yn cael ei gyfeirio i'r clwstwr. Mae hyn yn cyfateb i ffurfweddiad NGINX i fyny'r afon.
Copy to Editor filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains:
- "one.example.com"
- "www.one.example.com"
routes:
- match:
prefix: "/"
route:
cluster: targetCluster
http_filters:
- name: envoy.router
enw envoy.http_connection_manager yn hidlydd adeiledig yn Envoy Proxy. Mae hidlwyr eraill yn cynnwys Redis, Mongo, TCP. Gallwch ddod o hyd i'r rhestr gyflawn yn
I gael rhagor o wybodaeth am bolisïau cydbwyso llwythi eraill, ewch i
Cam 5 - Ffurfweddu Dirprwy a Upstream
Yn NGINX, mae'r cyfluniad i fyny'r afon yn diffinio set o weinyddion targed a fydd yn prosesu'r traffig. Yn yr achos hwn, mae dau glwstwr wedi'u neilltuo.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Mewn Cennad rheolir hyn gan glystyrau.
Clystyrau Cenhadon
Diffinnir yr hyn sy'n cyfateb i fyny'r afon fel clystyrau. Yn yr achos hwn, mae'r gwesteiwyr a fydd yn gwasanaethu'r traffig wedi'u diffinio. Mae sut y ceir mynediad i westeion, megis terfyn amser, yn cael ei ddiffinio fel ffurfwedd clwstwr. Mae hyn yn caniatáu rheolaeth fanylach dros ronynnedd agweddau megis hwyrni a chydbwyso llwyth.
Copy to Editor clusters:
- name: targetCluster
connect_timeout: 0.25s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [
{ socket_address: { address: 172.18.0.3, port_value: 80 }},
{ socket_address: { address: 172.18.0.4, port_value: 80 }}
]
Wrth ddefnyddio darganfod gwasanaeth STRICT_DNS Bydd y Cennad yn datrys y targedau DNS penodedig yn barhaus ac yn anghydamserol. Bydd pob cyfeiriad IP a ddychwelir o ganlyniad DNS yn cael ei ystyried yn westeiwr penodol yn y clwstwr i fyny'r afon. Mae hyn yn golygu, os bydd ymholiad yn dychwelyd dau gyfeiriad IP, bydd Envoy yn tybio bod dau westeiwr yn y clwstwr a dylai'r ddau fod yn gytbwys o ran llwyth. Os caiff gwesteiwr ei dynnu o'r canlyniad, mae Envoy'n tybio nad yw'n bodoli mwyach a bydd yn tynnu traffig o unrhyw byllau cysylltu presennol.
Am fwy o wybodaeth gweler
Cam 6 - Mynediad Log a Gwallau
Y cyfluniad terfynol yw cofrestru. Yn lle gwthio logiau gwall i ddisg, mae Envoy Proxy yn defnyddio dull sy'n seiliedig ar gwmwl. Mae holl logiau cais yn allbwn i stdout и stderr.
Pan fydd defnyddwyr yn gwneud cais, mae logiau mynediad yn ddewisol ac yn anabl yn ddiofyn. I alluogi logiau mynediad ar gyfer ceisiadau HTTP, galluogwch y ffurfweddiad log_mynediad ar gyfer y rheolwr cysylltiad HTTP. Gall y llwybr naill ai fod yn ddyfais fel stdout, neu ffeil ar ddisg, yn dibynnu ar eich gofynion.
Bydd y ffurfweddiad canlynol yn ailgyfeirio'r holl logiau mynediad i stdout (nodyn y cyfieithydd - mae angen stdout i ddefnyddio cennad y tu mewn i'r docwr. Os caiff ei ddefnyddio heb docwr, rhowch y llwybr i'r ffeil log arferol yn lle /dev/stdout). Copïwch y pyt i'r adran ffurfweddu ar gyfer y rheolwr cysylltiad:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Dylai'r canlyniadau edrych fel hyn:
- name: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
route_config:
Yn ddiofyn, mae gan Envoy linyn fformat sy'n cynnwys manylion y cais HTTP:
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n
Canlyniad y llinyn fformat hwn yw:
[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"
Gellir addasu'r cynnwys allbwn trwy osod y maes fformat. Er enghraifft:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n"
Gellir hefyd allbwn y llinell log yn fformat JSON trwy osod y maes json_fformat. Er enghraifft:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
I gael rhagor o wybodaeth am y fethodoleg cofrestru llysgenhadon, ewch i
Nid mewngofnodi yw'r unig ffordd i gael teimlad o weithio gyda'r Envoy Proxy. Mae ganddo olrhain a metrigau datblygedig wedi'u hymgorffori. Gallwch ddarganfod mwy yn
Cam 7 - Lansio
Rydych chi bellach wedi mudo'r ffurfweddiad o NGINX i Envoy Proxy. Y cam olaf yw lansio enghraifft Envoy Proxy i'w brofi.
Rhedeg fel defnyddiwr
Ar frig y llinell ffurfweddu NGINX defnyddiwr www; yn nodi bod NGINX yn rhedeg fel defnyddiwr breintiedig isel i wella diogelwch.
Mae Envoy Proxy yn defnyddio dull sy'n seiliedig ar gwmwl i reoli pwy sy'n berchen ar broses. Pan fyddwn yn rhedeg Envoy Proxy trwy gynhwysydd, gallwn nodi defnyddiwr braint isel.
Rhedeg Dirprwy Genhadol
Bydd y gorchymyn isod yn lansio Envoy Proxy trwy gynhwysydd Docker ar y gwesteiwr. Mae'r gorchymyn hwn yn rhoi'r gallu i Envoy wrando am geisiadau sy'n dod i mewn ar borthladd 80. Fodd bynnag, fel y nodir yn y ffurfweddiad gwrandäwr, mae Envoy Proxy yn gwrando am draffig sy'n dod i mewn ar borthladd 8080. Mae hyn yn caniatáu i'r broses redeg fel defnyddiwr â breintiau isel.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Profi
Gyda'r dirprwy yn rhedeg, gellir gwneud a phrosesu profion nawr. Mae'r gorchymyn cURL canlynol yn cyhoeddi cais gyda'r pennawd gwesteiwr a ddiffinnir yn y ffurfweddiad dirprwy.
curl -H "Host: one.example.com" localhost -i
Bydd cais HTTP yn arwain at wall 503. Mae hyn oherwydd nad yw cysylltiadau i fyny'r afon yn gweithio ac nid ydynt ar gael. Felly, nid oes gan Envoy Proxy unrhyw gyrchfannau targed ar gael ar gyfer y cais. Bydd y gorchymyn canlynol yn cychwyn cyfres o wasanaethau HTTP sy'n cyd-fynd â'r cyfluniad a ddiffinnir ar gyfer Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Gyda'r gwasanaethau sydd ar gael, gall Cennad traffig dirprwyol llwyddiannus i'w gyrchfan.
curl -H "Host: one.example.com" localhost -i
Dylech weld ymateb yn nodi pa gynhwysydd Docker ymdriniodd y cais. Yn y logiau Envoy Proxy, dylech hefyd weld y llinyn mynediad wedi'i argraffu.
Penawdau Ymateb HTTP Ychwanegol (Ymateb HTTP)
Fe welwch benawdau HTTP ychwanegol ym mhenawdau ymateb cais dilys. Mae'r pennawd yn dangos yr amser a dreuliodd y gwesteiwr i fyny'r afon yn prosesu'r cais. Wedi'i fynegi mewn milieiliadau. Mae hyn yn ddefnyddiol os yw'r cleient am bennu amser gwasanaeth yn erbyn hwyrni rhwydwaith.
x-envoy-upstream-service-time: 0
server: envoy
Cyfluniad terfynol
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains:
- "one.example.com"
- "www.one.example.com"
routes:
- match:
prefix: "/"
route:
cluster: targetCluster
http_filters:
- name: envoy.router
clusters:
- name: targetCluster
connect_timeout: 0.25s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [
{ socket_address: { address: 172.18.0.3, port_value: 80 }},
{ socket_address: { address: 172.18.0.4, port_value: 80 }}
]
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 0.0.0.0, port_value: 9090 }
Gwybodaeth ychwanegol gan y cyfieithydd
Mae cyfarwyddiadau ar gyfer gosod Envoy Proxy ar y wefan
Nid oes unrhyw config gwasanaeth systemd yn rpm yn ddiofyn.
Ychwanegu cyfluniad gwasanaeth systemd i /etc/systemd/system/envoy.service:
[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
After=network-online.target
Requires=envoy-auth-server.service
Wants=nginx.service
[Service]
User=root
Restart=on-failure
ExecStart=/usr/bin/envoy --config-path /etc/envoy/config.yaml
[Install]
WantedBy=multi-user.target
Mae angen i chi greu'r cyfeiriadur /etc/envoy/ a rhoi'r config config.yaml yno.
Mae yna sgwrs telegram ar gyfer dirprwy cennad:
Nid yw Envoy Proxy yn cefnogi gwasanaethu cynnwys statig. Felly pwy all bleidleisio dros nodwedd:
Dim ond defnyddwyr cofrestredig all gymryd rhan yn yr arolwg.
A wnaeth y post hwn eich annog i osod a phrofi dirprwy cennad?
-
ie
-
dim
Pleidleisiodd 75 o ddefnyddwyr. Ataliodd 18 o ddefnyddwyr.
Ffynhonnell: hab.com