Migreerimine Nginxilt Envoy Proxy-le

Tere, Habr! Pakun teie tÀhelepanu postituse tÔlget: Migreerimine Nginxilt Envoy Proxy-le.

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 NGINX Wiki. 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:

  1. NGINX-i serveri seadistamine, logistruktuur ja Gzipi funktsionaalsus. See mÀÀratakse globaalselt igas olukorras.
  2. NGINX-i seadistamine, et vastu vÔtta pÀringuid hostilt one.example.com pordil 8080.
  3. 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

  1. Iga kuulaja (listener) jÀlgimine
  2. Uute ĂŒhenduste vastuvĂ”tmine
  3. Filtrite kogumi loomine ĂŒhenduse jaoks
  4. 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 Envoy Proxy blogi.

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 linki.

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.router

Name envoy.http_connection_manager on Envoy Proxy-s sisseehitatud filter. Muud filtrid hÔlmavad Redis, Mongo, TCP. TÀieliku nimekirja leiate dokumentatsioon.

Lisainformatsiooni saamiseks muude koormuse tasakaalustamise poliitikate kohta kĂŒlastage Envoy dokumentatsiooni.

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. Envoy Proxy dokumentatsiooni.

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%"n

Selle 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

https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries

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 jÀlgimise dokumentatsioonist vÔi lÀbi Interaktiivse jÀlgimise stsenaarium.

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/envoy

Testimine

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 -i

HTTP-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 -i

Sa 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: envoy

LÔ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 https://www.getenvoy.io/

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.target

Sulle tuleb luua kaust /etc/envoy/ ja sinna panna config.yaml konfi.

Envoy proxy suhtes on Telegrami jututuba: https://t.me/envoyproxy_ru

Envoy Proxy ei toeta staatilise sisu jagamist. SeetÔttu palun hÀÀlestage funktsiooni poolt: https://github.com/envoyproxy/envoy/issues/378

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, 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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster