Salama, Habr! Mitondra ny sainao ny fandikana ny lahatsoratra aho:
Ny Envoy dia mpizara proxy zaraina mahomby (voasoratra amin'ny C ++) natao ho an'ny serivisy sy fampiharana tsirairay, fiara fitateram-pifandraisana sy "fiaramanidina data manerantany" natao ho an'ny maritrano "service mesh" lehibe. Rehefa namorona azy, dia noraisina ny vahaolana amin'ny olana nipoitra nandritra ny fampivoarana ireo mpizara toa ny NGINX, HAProxy, ny mpanelanelana mavesatra amin'ny fitaovana ary ny mpandrindra mavesatra rahona. Miara-miasa amin'ny fampiharana tsirairay ny Envoy ary manaisotra ny tambajotra mba hanomezana fiasa mahazatra na inona na inona sehatra. Rehefa mikoriana amin'ny mesh Envoy ny fifamoivoizana rehetra amin'ny fotodrafitrasa, dia lasa mora ny maka sary an-tsaina ireo faritra misy olana miaraka amin'ny fanaraha-maso tsy tapaka, mampifanaraka ny zava-bita amin'ny ankapobeny ary manampy ny fiasa fototra amin'ny toerana iray manokana.
fahafahana
- Ny maritrano ivelan'ny fizotry ny fizotry ny asa: ny iraka dia mpizara manana fahaiza-manao avo lenta izay maka RAM kely. Miara-miasa amin'ny fiteny na rafitra fampiharana rehetra izy io.
- http/2 sy ny fanohanan'ny grpc: ny iraka dia manana http/2 kilasy voalohany ary fanohanana grpc ho an'ny fifandraisana miditra sy mivoaka. Ity dia proxy mangarahara manomboka amin'ny http/1.1 ka hatramin'ny http/2.
- Advanced Load Balancing: Ny iraka dia manohana ny fampifandanjana entana mandroso ao anatin'izany ny famerenana mandeha ho azy, ny famotehana rojo, ny famerana ny tahan'ny eran-tany, ny fangatahan'ny aloka, ny fifandanjana enta-mavesatra eo an-toerana, sns.
- Configuration Management API: ny iraka dia manome API matanjaka ho an'ny fitantanana dynamic ny configuration anao.
- Observability: Fandinihana lalina ny fifamoivoizana L7, fanohanana teratany ho an'ny tracing mizara sy ny fahitana ny mongodb, dynamodb ary fampiharana maro hafa.
Dingana 1 - Ohatra NGINX Config
Ity script ity dia mampiasa rakitra noforonina manokana nginx.conf, mifototra amin'ny ohatra feno avy amin'ny
nginx source config
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;
}
}
}
Ny fanamafisana NGINX matetika dia manana singa telo lehibe:
- Fandrindrana ny mpizara NGINX, rafitra log ary fiasa Gzip. Voafaritra maneran-tany izany amin'ny tranga rehetra.
- Fametrahana NGINX hanaiky ny fangatahana amin'ny mpampiantrano one.example.com amin'ny port 8080.
- Fametrahana ny toerana kendrena, ny fomba fitantanana ny fifamoivoizana amin'ny faritra samihafa amin'ny URL.
Tsy ny fanovana rehetra no mihatra amin'ny Envoy Proxy, ary tsy mila manamboatra fanovana sasany ianao. Envoy Proxy dia manana karazana fanalahidy efatra, izay manohana ny fotodrafitrasa fototra atolotry ny NGINX. Ny fototra dia:
- mpihaino: Izy ireo no mamaritra ny fomba faneken'ny Envoy Proxy ny fangatahana miditra. Envoy Proxy amin'izao fotoana izao dia tsy manohana afa-tsy mpihaino mifototra amin'ny TCP. Rehefa tafapetraka ny fifandraisana dia ampitaina amin'ny sivana maromaro ho an'ny fanodinana.
- Sivana: Izy ireo dia ampahany amin'ny rafitra fantsona izay afaka manodina ny angona miditra sy mivoaka. Ity fampiasa ity dia misy sivana toy ny Gzip, izay manindry ny angona alohan'ny handefasana azy amin'ny mpanjifa.
- Routers: Mandefa fifamoivoizana mankany amin'ny toerana ilaina izy ireo, voafaritra ho cluster.
- Vondrona: Izy ireo no mamaritra ny teboka farany ho an'ny fifamoivoizana sy ny masontsivana fanitsiana.
Hampiasa ireo singa efatra ireo izahay mba hamoronana fikandrana Envoy Proxy mba hifanaraka amin'ny konfigurasi NGINX manokana. Ny tanjon'ny Envoy dia ny hiara-hiasa amin'ny API sy ny fikandrana mavitrika. Amin'ity tranga ity, ny fandrindrana fototra dia hampiasa fametahana static, mafy-kaody avy amin'ny NGINX.
Dingana 2 - Fanofanana NGINX
Ny ampahany voalohany nginx.conf dia mamaritra ny anatiny NGINX sasany mila amboarina.
Fifandraisana amin'ny mpiasa
Ny fanamafisam-peo etsy ambany dia mamaritra ny isan'ny fizotran'ny mpiasa sy ny fifandraisana. Izany dia manondro ny fomba hamaliana ny fangatahana NGINX.
worker_processes 2;
events {
worker_connections 2000;
}
Ny Envoy Proxy dia mitantana ny workflows sy ny fifandraisana amin'ny fomba samihafa.
Ny Envoy dia mamorona kofehy mpiasa ho an'ny kofehy hardware tsirairay amin'ny rafitra. Ny kofehy mpiasa tsirairay dia manatanteraka famoriana hetsika tsy manakana izay tompon'andraikitra amin'izany
- Mihaino ny mpihaino tsirairay
- Manaiky fifandraisana vaovao
- Mamorona andiana sivana ho an'ny fifandraisana
- Ataovy ny asa I/O rehetra mandritra ny androm-piainan'ny fifandraisana.
Ny fanodinana fifandraisana hafa rehetra dia karakaraina tanteraka ao amin'ny kofehy mpiasa, ao anatin'izany ny fitondran-tena rehetra.
Ho an'ny kofehy mpiasa tsirairay ao amin'ny Envoy dia misy dobo fampifandraisana. Noho izany, ny dobo fifandraisana HTTP/2 dia mametraka fifandraisana iray isaky ny mpampiantrano ivelany amin'ny fotoana iray, raha misy kofehy mpiasa efatra dia misy fifandraisana HTTP/2 efatra isaky ny mpampiantrano ivelany ao amin'ny fanjakana stable. Amin'ny fitazonana ny zava-drehetra ao anaty kofehy mpiasa iray, saika ny code rehetra dia azo soratana tsy misy fanakanana, toy ny hoe kofehy tokana. Raha betsaka kokoa ny kofehy atolotra noho ny ilaina, dia mety hitarika ho amin'ny fitadidiana very maina izany, hamorona fifandraisana tsy miasa be dia be, ary hampihenana ny isan'ny fiverenan'ny fifandraisana amin'ny dobo.
Raha mila fanazavana fanampiny tsidiho
HTTP Configuration
Ity sakana fanamafisana NGINX manaraka ity dia mamaritra ny fanovana HTTP toy ny:
- Karazana mime inona no tohana
- Fotoana fiafaran'ny default
- Gzip Configuration
Azonao atao ny manamboatra ireo lafiny ireo amin'ny alàlan'ny sivana ao amin'ny Envoy Proxy, izay horesahina any aoriana.
Dingana 3 - Configuration Server
Ao amin'ny bloc configuration HTTP, ny configuration NGINX dia mamaritra ny mihaino amin'ny port 8080 ary mamaly ny fangatahana miditra ho an'ny sehatra. one.example.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Ao anatin'ny Envoy dia fehezin'ny mpihaino izany.
Iraka mpihaino
Ny lafiny manan-danja indrindra amin'ny fanombohana amin'ny Envoy Proxy dia ny famaritana ny mpihaino anao. Mila mamorona rakitra fanamafisana ianao izay mamaritra ny fomba tianao hampandehanana ny ohatra Envoy.
Ny snippet etsy ambany dia hamorona mpihaino vaovao ary hamatotra azy amin'ny seranan-tsambo 8080. Ny fanamafisana dia milaza amin'ny Envoy Proxy izay seranana tokony hamatotra azy amin'ny fangatahana miditra.
Ny Envoy Proxy dia mampiasa fanamarihana YAML ho an'ny fanamboarana azy. Ho fampidirana an'ity fanamarihana ity dia jereo eto
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Tsy mila mamaritra server_name, satria ny sivana Envoy Proxy no hiatrika izany.
Dingana 4 - Toerana Configuration
Rehefa misy fangatahana tonga ao amin'ny NGINX, ny sakana toerana dia mamaritra ny fomba fikarakarana sy ny toerana halehan'ny fifamoivoizana. Amin'ity sombiny manaraka ity, ny fifamoivoizana rehetra mankany amin'ny tranokala dia afindra any amin'ny tampony (fanamarihan'ny mpandika teny: lohamilina fampiharana matetika) targetCluster. Ny kluster ambony dia mamaritra ny nodes tokony hikarakara ny fangatahana. Hiresaka momba izany isika amin’ny dingana manaraka.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Ao amin'ny Envoy, ny Filters no manao izany.
Envoy Filters
Ho an'ny fanamafisana static, ny sivana dia mamaritra ny fomba hikarakarana ny fangatahana miditra. Amin'ity tranga ity dia mametraka sivana mifanentana server_name amin'ny dingana teo aloha. Rehefa tonga ny fangatahana miditra mifanandrify amin'ny sehatra sy lalana sasany, dia alefa any amin'ny cluster ny fifamoivoizana. Ity dia mitovy amin'ny konfigurasi NGINX ambany.
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
anarana envoy.http_connection_manager dia sivana namboarina ao amin'ny Envoy Proxy. Misy sivana hafa Redis, mongo, TCP. Azonao atao ny mahita ny lisitra feno ao amin'ny
Raha mila fanazavana fanampiny momba ny politikan'ny fampifandanjana entana hafa dia tsidiho
Dingana 5 - Fanamboarana proxy sy Upstream
Ao amin'ny NGINX, ny fanamafisana ambony dia mamaritra andiana mpizara kendrena izay handamina ny fifamoivoizana. Amin'ity tranga ity, cluster roa no nomena.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Ao amin'ny Envoy, clusters no mitantana izany.
Clusters iraka
Ny equivalent ambony dia faritana ho cluster. Amin'ity tranga ity dia efa fantatra ireo mpampiantrano izay hikarakara ny fifamoivoizana. Ny fomba hidirana amin'ny mpampiantrano, toy ny fotoana fiafaran'ny fotoana, dia faritana ho tefin'ny cluster. Izany dia ahafahan'ny fanaraha-maso misimisy kokoa amin'ny lafiny toy ny latency sy ny fifandanjana entana.
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 }}
]
Rehefa mampiasa service discovery STRICT_DNS Ny Envoy dia hamaha tsy an-kijanona sy asynchronous ny tanjona DNS voafaritra. Ny adiresy IP naverina avy amin'ny valin'ny DNS dia ho raisina ho mpampiantrano mazava ao amin'ny cluster upstream. Midika izany fa raha misy fangatahana mamerina adiresy IP roa, dia hihevitra ny Envoy fa misy mpampiantrano roa ao amin'ny cluster, ary tsy maintsy mifandanja ny entana. Raha esorina amin'ny vokatra ny mpampiantrano iray, dia hihevitra ny Envoy fa tsy misy intsony izany ary hisintona fifamoivoizana avy amin'ireo dobo fifandraisana misy.
Raha mila fanazavana fanampiny dia jereo
Dingana 6 - Log Access sy Errors
Ny fanovana farany dia ny fisoratana anarana. Raha tokony hanosika ny diarin'ny hadisoana amin'ny kapila, ny Envoy Proxy dia maka fomba fiasa mifototra amin'ny rahona. Ny log application rehetra dia mivoaka amin'ny stdout и stderr.
Rehefa manao fangatahana ny mpampiasa, dia azo atao ny logiciel miditra ary tsy voasakana amin'ny alàlan'ny default. Mba ahafahana miditra amin'ny logs ho an'ny fangatahana HTTP, avelao ny tefy access_log ho an'ny mpitantana fifandraisana HTTP. Ny lalana dia mety ho fitaovana toy ny stdout, na rakitra amin'ny kapila, arakaraka ny zavatra takinao.
Ity tefy manaraka ity dia hamindra ny diarin'ny fidirana rehetra mankany stdout (fanamarihan'ny mpandika teny - stdout dia takiana amin'ny fampiasana iraka ao anaty docker. Raha ampiasaina tsy misy docker, dia soloy ny /dev/stdout amin'ny lalana mankany amin'ny rakitra log). Adikao any amin'ny faritra fanamafisam-peo ho an'ny mpitantana fifandraisana ny sombintsombiny:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Ny valiny dia tokony ho toy izao:
- 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:
Amin'ny alàlan'ny default, manana tady endrika misy ny antsipirian'ny fangatahana HTTP ny Envoy:
[%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
Ny vokatr'ity tady format ity:
[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"
Ny votoatin'ny vokatra dia azo amboarina amin'ny fametrahana ny saha endrika. Ohatra:
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"
Ny tsipika log dia azo avoaka amin'ny endrika JSON amin'ny alàlan'ny fametrahana ny saha json_format. Ohatra:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Raha mila fanazavana fanampiny momba ny fomba fisoratana anarana Envoy, tsidiho
Tsy ny logging no hany fomba hahazoana fahalalana momba ny fiaraha-miasa amin'ny Envoy Proxy. Izy io dia manana fahaiza-manara-maso avo lenta sy metrika napetraka ao anatiny. Afaka mahita bebe kokoa ianao ao amin'ny
Dingana 7 - Alefaso
Nafindranao avy any NGINX mankany amin'ny Envoy Proxy ny fandrindranao. Ny dingana farany dia ny fandefasana ohatra Envoy Proxy hizaha toetra azy.
Mihazakazaka toy ny mpampiasa
Eo an-tampon'ny tsipika fanamafisana NGINX mpampiasa www www; mamaritra ny fampandehanana ny NGINX ho mpampiasa ambany tombontsoa hanatsarana ny fiarovana.
Ny Envoy Proxy dia maka fomba fiasa mifototra amin'ny rahona amin'ny fitantanana izay tompon'ny dingana iray. Rehefa mihazakazaka Envoy Proxy amin'ny alalan'ny kaontenera iray isika, dia afaka mamaritra mpampiasa ambany tombontsoa.
Fanombohana ny Envoy Proxy
Ny baiko etsy ambany dia handefa Envoy Proxy amin'ny alàlan'ny container Docker amin'ny mpampiantrano. Ity baiko ity dia manome an'i Envoy ny fahafahana mihaino ny fangatahana miditra amin'ny seranan-tsambo 80. Na izany aza, araka ny voatondro ao amin'ny fanamafisana mpihaino, Envoy Proxy dia mihaino ny fifamoivoizana miditra amin'ny seranana 8080. Izany dia ahafahan'ny dingana mandeha amin'ny maha-mpampiasa ambany tombontsoa azy.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
fitiliana
Miaraka amin'ny proxy mandeha dia azo atao sy karakaraina izao ny fitsapana. Ity baiko cURL manaraka ity dia mamoaka fangatahana miaraka amin'ny lohatenin'ny mpampiantrano voafaritra ao amin'ny fandrindrana proxy.
curl -H "Host: one.example.com" localhost -i
Ny fangatahana HTTP dia hiteraka hadisoana 503. Izany dia satria tsy mandeha ny fifandraisana ambony ary tsy misy. Noho izany, ny Envoy Proxy dia tsy manana toerana misy ny fangatahana. Ity baiko manaraka ity dia hanomboka andiana serivisy HTTP mifanandrify amin'ny fanitsiana voafaritra ho an'ny Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Miaraka amin'ireo tolotra misy, ny Envoy dia afaka mamadika ny fifamoivoizana mankany amin'ny toerana halehany.
curl -H "Host: one.example.com" localhost -i
Tokony hahita valiny ianao manondro hoe iza amin'ny Docker container no namatsy ny fangatahana. Ao amin'ny logs Envoy Proxy dia tokony ho hitanao ihany koa ny output string access.
Lohatenin'ny valinteny HTTP fanampiny
Hahita lohapejy HTTP fanampiny ianao ao amin'ny lohatenin'ny valin'ny fangatahana tena izy. Ny lohapejy dia mampiseho ny fotoana lanin'ny mpampiantrano ambony amin'ny fanodinana ny fangatahana. Aseho amin'ny milisegondra. Tena ilaina izany raha te hamaritra ny fotoanan'ny serivisy ny mpanjifa raha oharina amin'ny fahatarana amin'ny tambajotra.
x-envoy-upstream-service-time: 0
server: envoy
Config farany
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 }
Fanampiny avy amin'ny mpandika teny
Ny torolalana amin'ny fametrahana Envoy Proxy dia azo jerena ao amin'ny tranokala
Amin'ny alàlan'ny default, rpm dia tsy manana config service systemd.
Ampio ny systemd service config /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
Mila mamorona lahatahiry /etc/envoy/ ianao ary apetraho eo ny config.yaml config.
Misy resaka telegrama mampiasa proxy proxy:
Ny Envoy Proxy dia tsy manohana ny fandefasana votoaty static. Noho izany, iza no afaka mifidy ny endri-javatra:
Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana.
Namporisika anao hametraka sy hizaha toetra ny proxy iraka ve ity lahatsoratra ity?
-
Eny
-
tsy misy
Mpampiasa 75 no nifidy. Mpampiasa 18 no nifady.
Source: www.habr.com