Tere, Habr! Pakun teie tÀhelepanu postituse tÔlget: .
Envoy on kĂ”rge jĂ”udlusega hajutatud pöördproksi (kirjutatud C++), mis on mĂ”eldud eraldi teenustele ja rakendustele, samuti suhtlusbusiks ja âĂŒldiseks andmeplaaniksâ, mis on loodud suurtel mikroteenuste arhitektuuridel âteenustekettâ. Selle loomisel vĂ”eti arvesse probleemide lahendusi, mis tekkisid selliste serverite nagu NGINX, HAProxy, riistvaraliste koormuse tasandajate ja pilvekoormuse tasandajate arendamisel. Envoy töötab koos iga rakendusega ja absakteerib vĂ”rku, pakkudes ĂŒhisfunktsioone sĂ”ltumatult platvormist. Kui kogu teenustrafik infrastruktuuris kulgeb lĂ€bi Envoy vĂ”rgu, on hĂ”lbus visualiseerida probleemseid kohti koos ĂŒhtse jĂ€lgimisega, seadistada ĂŒldist jĂ”udlust ja lisada pĂ”hifunktsioone kindlas kohas.
VÔimalused
- VÀlise protsessi arhitektuur: envoy on autonoomne, kÔrge jÔudlusega server, mis kasutab vÀhe mÀlumahtu. See töötab koos iga rakenduse keele vÔi raamistikuga.
- http/2 ja grpc tugi: envoy pakub esmaklassilist tuge http/2 ja grpc sissetulevates ja vĂ€ljuvates ĂŒhendustes. See on lĂ€bipaistev pöördproksi http/1.1 kuni http/2.
- TÀpsem koormuse tasandamine: envoy toetab tÀiustatud koormuse tasandamise funktsioone, sealhulgas automaatseid katseid, kettide purunemist, globaalset kiiruspiirangut, pÀringute varjamist, kohaliku koormuse tasandamise tsoonis jne.
- Konfiguratsioonihalduse API: envoy pakub usaldusvÀÀrset API-d oma konfiguratsiooni dĂŒnaamiliseks haldamiseks.
- JĂ€lgimine: L7 liiklust sĂŒgavalt jĂ€lgimine, sisseehitatud tugi jaotatud jĂ€lgimisele ning jĂ€lgimisele mongodb, dynamodb ja paljude teiste rakenduste jaoks.
1. samm â NGINX konfi nĂ€ide
Selles stsenaariumis kasutatakse spetsiaalselt loodud faili nginx.conf, mis pÔhineb tÀielikul nÀidisel . Saate vaadata konfiguratsiooni redigeerijas, avades nginx.conf
Originaal nginx konfig
kasutaja www www;
pid /var/run/nginx.pid;
töötaja_protsessid 2;
events {
töötaja_seosed 2000;
}
http {
gzip on;
gzip_min_pikkus 1100;
gzip_puhvrid 4 8k;
gzip_tĂŒĂŒbid text/plain;
log_format peamine '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format allalaadimine '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
upstream sihtklaster {
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 peamine;
error_log /var/log/nginx.error_log info;
location / {
proxy_pass http://sihtklaster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}NGINX-i konfiguratsioonid sisaldavad tavaliselt kolme pÔhielementi:
- NGINX-i serveri seadistamine, logistruktuur ja Gzipi funktsionaalsus. See mÀÀratakse globaalselt igas olukorras.
- NGINX-i seadistamine, et vastu vÔtta pÀringuid hostilt one.example.com pordil 8080.
- Sihtkoha seadistamine, kuidas liiklust erinevate URL-i osade jaoks töödelda.
Mitte iga konfiguratsioon ei lÀhe Envoy Proxy jaoks, ja mÔned parameetrid ei ole vajalikud seadistada. Envoy Proxy omab nelja pÔhiliiki, mis toetavad NGINX-i pakutavat alusinfrastruktuuri. Need on:
- Kuulajad: Need mÀÀravad, kuidas Envoy Proxy vastu vĂ”tab sissetulevaid pĂ€ringuid. Praegu toetab Envoy Proxy ainult TCP-pĂ”hiseid kuulajaid. Kui ĂŒhendus on loodud, edastatakse see töötlemiseks filtrite kogumile.
- Filtrid: Need on osa toru arhitektuurist, mis suudab töödelda sissetulevaid ja vÀljaminevaid andmeid. See funktsionaalsus sisaldab filtreid nagu Gzip, mis tihendab andmeid enne nende edastamist kliendile.
- Marsruuterid: Need suunavad liiklust nÔutud sihtkohta, mis on mÀÀratud klastrina.
- Klastrid: Need mÀÀravad liikluse lÔpp-punkti ja konfiguratsiooni parameetrid.
Kasutame neid nelja komponenti Envoy Proxy konfiguratsiooni loomiseks, et see vastaks teatud NGINX-i konfiguratsioonile. Envoy eesmĂ€rk on töötada API-dega ja dĂŒnaamilise konfiguratsiooniga. Selles juhul kasutab pĂ”hikonfiguratsioon staatilisi, kindlalt mÀÀratud parameetreid NGINX-ist.
Samm 2 â NGINX-i konfiguratsioon
Esimene osa nginx.conf mÀÀra mÔned NGINX-i sisekomponendid, mida tuleb seadistada.
Worker Connections (Töötaja seosed)
AlljĂ€rgnevad konfigureerimised mÀÀravad tööprotsesside ja ĂŒhenduste arvu. See nĂ€itab, kuidas NGINX skaleerub nĂ”udluse rahuldamiseks.
worker_processes 2;
events {
worker_connections 2000;
}Envoy Proxy haldab tööprotsesse ja ĂŒhendusi erinevalt.
Envoy loob iga sĂŒsteemi riistvaralise lĂ”ime jaoks ĂŒhe tööprotsessi. Iga tööprotsess tĂ€idab mitteblokeerivat sĂŒndmuste tsĂŒklit, mis on vastutav
- Iga kuulaja (listener) jÀlgimine
- Uute ĂŒhenduste vastuvĂ”tmine
- Filtrite kogumi loomine ĂŒhenduse jaoks
- Kogu sisendi- ja vĂ€ljundioperatsioonide töötlemine ĂŒhenduse elu jooksul.
Kogu jĂ€rgnev ĂŒhenduse töötlemine toimub tĂ€ielikult tööprotsessis, sealhulgas mis tahes edastamise kĂ€itumine.
Iga tööprotsessi jaoks Envoy's on ĂŒhendus puulis. Seega HTTP/2 ĂŒhenduste puulad loovad vaid ĂŒhe ĂŒhenduse iga vĂ€lise hosti jaoks korraga, nelja tööprotsessiga on iga vĂ€lise hosti jaoks stabiilses olekus neli HTTP/2 ĂŒhendust. Hoides kĂ”ik ĂŒhes tööprotsessis, saab peaaegu kogu koodi kirjutada ilma blokeerimisteta, nagu oleks see ĂŒhetööprotsessiline. Kui tööprotsesside arv ĂŒletab vajaduse, vĂ”ib see viia ebatĂ”husa mĂ€lukasutuse, suure arvu ootel olevate ĂŒhendusteni ja vĂ€iksema ĂŒhenduste tagasiviimise arvu juurde puuli.
Kuna soovite rohkem teavet, kĂŒlastage .
HTTP konfigureerimine
JÀrgmine NGINX'i konfigureerimismoodul mÀÀrab HTTP seaded, nagu:
- Millised mime tĂŒĂŒbid on toetatud
- Vaikeaegumise seaded
- Gzip konfigureerimine
Saate neid aspekte seadistada Envoy Proxy filtrite kaudu, millest rÀÀgime hiljem.
Sammas 3 â Serveri konfigureerimine
HTTP konfigureerimise plokis, NGINX'i konfigureerimine mÀÀrab, et see kuulaks porti 8080 ja vastaks sissetulevatele pÀringutele domeenide jaoks one.example.com ja www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;Envoy's hallatakse seda kuulajate kaudu.
Envoy kuulajad
Oluline aspekt Envoy Proxy'ga alustamisel on kuulajate mÀÀramine. Peate looma konfigureerimisfaili, mis kirjeldab, kuidas soovite Envoy eksemplari kÀivitada.
Allpooli lÔik loob uue kuulaja ja seob selle sadama 8080. Konfiguratsioon nÀitab, millistele sadamatele Envoy Proxy peaks olema seotud sissetulevate pÀringute jaoks.
Envoy Proxy kasutab YAML-sĂŒntaksit oma konfiguratsioonis. Selle sĂŒntaksiga tutvumiseks vaadake siit .
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }Ei ole vaja mÀÀrata server_name, kuna Envoy Proxy filtrid tegelevad sellega.
Samm 4 â Asukoha konfigureerimine
Kui pĂ€ring jĂ”uab NGINX-i, mÀÀratleb asukohablokk, kuidas töödeldakse ja kuhu suunatakse liiklust. JĂ€rgnevas lĂ”igus suunatakse kogu saidile suunatud liiklus ĂŒlesvoolu (tĂ”lkija mĂ€rkus: ĂŒlesvoolu on tavaliselt rakenduste serverid) klastrisse nimega targetCluster. Ălesvoolu klaster mÀÀratleb sĂ”lmed, mis peavad pĂ€ringu töötlema. Arutame seda jĂ€rgmises etapis.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}Envoy-s tegeleb sellega Filters.
Envoy Filters
Statilise konfiguratsiooni jaoks mÀÀratlevad filtrid, kuidas töödeldakse sissetulevaid pĂ€ringuid. Sellisel juhul seadistame filtrid, mis vastavad server_names eelnevas etapis. Kui sissetulevad pĂ€ringud vastavad teatud domeenidele ja marsruutidele, suunatakse liiklus klastrisse. See vastab NGINX-i ĂŒlesvoolu konfiguratsioonile.
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.routerName envoy.http_connection_manager on Envoy Proxy-s sisseehitatud filter. Muud filtrid hÔlmavad Redis, Mongo, TCP. TÀieliku nimekirja leiate .
Lisainformatsiooni saamiseks muude koormuse tasakaalustamise poliitikate kohta kĂŒlastage .
Samm 5 â Proxy ja ĂŒlesvoolu konfiguratsioon
NGINX-is mÀÀratleb ĂŒlesvoolu konfiguratsioon rĂŒhma sihiserveritest, mis töötlevad liiklust. Sellisel juhul on mÀÀratud kaks klastrit.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}Envoy-s seda haldavad klastrid.
Envoy Clusters
Ălemineku ekvivalent mÀÀratletakse kui klastrid. Antud juhul on mÀÀratud hostid, mis teenindavad liiklust. JuurdepÀÀsuhappe hostidele, nĂ€iteks ooteaeg, mÀÀratakse klastrite konfiguratsiooniga. See vĂ”imaldab tĂ€psemalt kontrollida selliste aspektide nagu ooteaeg ja koormuse tasakaalustamine.
Kopeeri toimetajasse klastrid:
- nimi: 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 }}
]Teenuse avastamise kasutamisel STRICT_DNS Envoy lahendab pidevalt ja asĂŒnkroonselt mÀÀratud DNS-i sihtpunkte. Iga tagasi saadud IP-aadress DNS-i tulemusena loetakse ĂŒlemise klastris selgeks hostiks. See tĂ€hendab, et kui pĂ€ring tagastab kaks IP-aadressi, eeldab Envoy, et klastris on kaks hosti, ja mĂ”lemat tuleb koormuse tasakaalustamiseks kasutada. Kui hosti tulemusest eemaldatakse, eeldab Envoy, et see enam ei eksisteeri, ja hakkab liiklust jagama mistahes olemasolevatesse ĂŒhendusfondidesse.
LisaĂŒksikasjade saamiseks vt. .
Samm 6 â JuurdepÀÀs logidele ja vead
LĂ”plik konfiguratsioon â logimine. Selle asemel, et edastada vealogid kettale, kasutab Envoy Proxy pilvepĂ”hist lĂ€henemist. KĂ”ik rakenduste logid suunatakse stdout ja stderr.
Kui kasutajad teevad pĂ€ringu, on juurdepÀÀsulogid valikulised ja vaikimisi keelatud. HTTP pĂ€ringute juurdepÀÀsulogide lubamiseks aktiveerige seadistus access_log HTTP ĂŒhenduse haldurile. Tee vĂ”ib olla kas seade, nĂ€iteks stdout, vĂ”i fail ketas, olenevalt teie nĂ”udmistest.
JĂ€rgmine konfiguratsioon suunab kĂ”ik juurdepÀÀsulogid stdout (tĂ”lkija mĂ€rkus â stdout on vajalik envoy kasutamiseks dockeris. Kui kasutada vĂ€ljaspool dockerit, asendage /dev/stdout tavalise logifaili tee korral). Kopeerige fragment ĂŒhenduste halduri seadistuse jaossa:
Kopeeri loendi lÔpetamiseks access_log:
- nimi: envoy.file_access_log
config:
path: "\/dev\/stdout"Tulemused peaksid vÀlja nÀgema sellised:
- nimi: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
access_log:
- nimi: envoy.file_access_log
config:
path: "\/dev\/stdout"
route_config:Vaikimisi on Envoy-l formaadi rida, mis sisaldab HTTP-pĂ€ringu ĂŒksikasju:
[%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%"nSelle formaadi rida tulemus:
[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"VÀljundi sisu saab kohandada, seadistades formaadi vÀlja. NÀiteks:
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"Logi rida saab samuti vÀljendada JSON formaadis, seadistades vÀlja json_format. NÀiteks:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}Lisainfo saamiseks logimismetoodika kohta kĂŒlastage
Logimine ei ole ainus viis Envoy Proxy töö kohta arusaamise saamiseks. Sellesse on integreeritud ulatuslikud jÀlgimis- ja mÔÔtmise vÔimalused. Rohkem teavet leiate vÔi lÀbi .
Samm 7 â KĂ€ivitamine
NĂŒĂŒd olete seadistanud konfiguratsiooni NGINX-ist Envoy Proxy-ks. Viimane samm on kĂ€ivitada Envoy Proxy eksemplar selle testimiseks.
KĂ€ivitamine kasutaja poolt
NGINX-i konfiguratsiooni ĂŒlaosas, rida user www www; nĂ€itab, et NGINX kĂ€ivitatakse madala privileegiga kasutajana, et suurendada turvalisust.
Envoy Proxy kasutab pilvepÔhist lÀhenemist protsessi omaniku haldamiseks. Kui kÀivitame Envoy Proxy konteineris, saame mÀÀrata madala privileegiga kasutaja.
Envoy Proxy kÀitamine
Allolev kÀsk kÀivitab Envoy Proxy Docker-konteineri kaudu hostis. See kÀsk vÔimaldab Envoy-l kuulata sissetulevaid pÀringuid porti 80 kaudu. Kuid nagu on mÀÀratud kuulaja konfiguratsioonis, kuulab Envoy Proxy sissetulevat liiklust porti 8080 kaudu. See vÔimaldab protsessil töötada madala privileegiga kasutajana.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoyTestimine
KĂ€ivitunud pöördproksi korral saab nĂŒĂŒd teha ja töödelda teste. JĂ€rgmine cURL kĂ€sk saadab pĂ€ringu, mille hosti pĂ€is on mÀÀratud proksi konfiguratsioonis.
curl -H "Host: one.example.com" localhost -iHTTP-pĂ€ring toob kaasa vea 503See on seotud sellega, et sisenevad ĂŒhendused ei toimi ja need ei ole saadaval. Seega ei ole Envoy Proxy-l saadaval sihtadresse pĂ€ringu jaoks. JĂ€rgmine kĂ€sk kĂ€ivitab HTTP-teenuste seeria, mis vastab Envoy'le mÀÀratud konfiguratsioonile.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;Saadavate teenustega vÔib Envoy edukalt edastada liiklust sihtkohta.
curl -H "Host: one.example.com" localhost -iSa peaksid nÀgema vastust, mis nÀitab, milline Docker konteiner töötles pÀringu. Envoy Proxy logides peaksid samuti olema nÀhtavad juurdepÀÀsu read.
LisakĂŒsimused HTTP-vastuses
Kehtiva pĂ€ringu vastuse pealkirjades nĂ€ed tĂ€iendavaid HTTP pĂ€iseid. Pealkirjas kuvatakse aeg, mille ĂŒlemine host kulutas pĂ€ringu töötlemiseks. See on vĂ€ljendatud millisekundites. See on kasulik, kui klient soovib vĂ”rrelda teenindusaega vĂ”rgu viivitusega.
x-envoy-upstream-service-time: 0
server: envoyLÔplik konfiguratsioon
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 }TÔlkija tÀiendav teave
Envoy Proxy paigaldusjuhised leiad veebisaidilt
Vaikimisi ei ole rpm-s systemd teenuse konfi.
Lisa systemd teenuse konfi /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.targetSulle tuleb luua kaust /etc/envoy/ ja sinna panna config.yaml konfi.
Envoy proxy suhtes on Telegrami jututuba:
Envoy Proxy ei toeta staatilise sisu jagamist. SeetÔttu palun hÀÀlestage funktsiooni poolt:
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Kas see postitus inspireeris sind paigaldama ja testima envoy proxy-d?
jah
ei
75 kasutajat hÀÀletas, 18 kasutajat jÀi erapooletuks.
Allikas: habr.com
