Migratsioon Nginx-ilt Envoy Proxy-le

Tere, Habr! Pakun teie tÀhelepanu postituse tÔlget: Migratsioon Nginx-ilt Envoy Proxy-le.

Envoy on kĂ”rge jĂ”udlusega jaotatud vaheserver (kirjutatud C++ keeles), mis on mĂ”eldud ĂŒksikutele teenustele ja rakendustele. Samuti on see suhtlusbus ja "universaalne andmeplaan", mis on vĂ€lja töötatud suurte mikroteenuste arhitektuuride "teenuste vĂ”rgustik" jaoks. Selle loomisel arvestati probleemide lahendustega, mis tekkisid selliste serverite, nagu NGINX, HAProxy, riistvaraline koormuse tasakaalustajad ja pilve koormuse tasakaalustajad, arendamisel. Envoy töötab iga rakendusega ja abstraktiseerib vĂ”rgu, pakkudes ĂŒldiseid funktsioone sĂ”ltumata platvormist. Kui kogu teenustrafik infrastruktuuris liigub lĂ€bi Envoy vĂ”rgustiku, on lihtne visualiseerida probleemseid valdkondi, kasutades ĂŒhtset jĂ€lgimist, kohandades ĂŒldist jĂ”udlust ja lisades pĂ”hifunktsioone kindlatesse kohtadesse.

VÔimalused

  • ProtsessivĂ€line arhitektuur: envoy on iseseisev, kĂ”rge jĂ”udlusega server, mis kasutab vĂ€he mĂ€lu. Ta toimib koos mis tahes rakenduse keele vĂ”i raamistikuga.
  • http/2 ja grpc tugi: envoy pakub esmaklassilist tugi http/2 ja grpc sissetulevatele ja vĂ€ljuvatele ĂŒhendustele. See on lĂ€bipaistev proksy http/1.1-st http/2-le.
  • TĂ€psem koormuse jaotamine: envoy toetab laiaulatuslikke koormuse jaotamise funktsioone, sealhulgas automaatseid katseid, ahela katkestamist, globaalset kiiruspiirangut, pĂ€ringute varjestamist, kohalikku koormuse jaotamist tsoonis jne.
  • API konfiguratsiooni haldamiseks: envoy pakub usaldusvÀÀrset API-d oma konfiguratsiooni dĂŒnaamiliseks haldamiseks.
  • KĂ€ivitatavus: sĂŒgav L7 liikluse jĂ€lgimine, sisseehitatud tugi jaotatud jĂ€lgimiseks ning jĂ€lgimiseks mongodb, dynamodb ja paljude teiste rakenduste jaoks.

Sammas 1 — NGINX konfi nĂ€idis

Selles stsenaariumis kasutatakse spetsiaalselt loodud faili nginx.conf, mis pÔhineb tÀielikul nÀitel NGINX Wiki. Saate konfiguratsiooni vaadata redigeerijas, avades nginx.conf

Algne nginx konfi

kasutaja 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;
    }
  }
}

NGINX-i konfiguratsioonid koosnevad tavaliselt kolmest pÔhielemendist:

  1. NGINX-i serveri seadistus, logifailide struktuur ja Gzip funktsionaalsus. See mÀÀratakse globaalsetes sÀtetes.
  2. NGINX-i seadistamine pÀringute vastuvÔtmiseks hostil one.example.com porti 8080.
  3. Sihtkoha seadistamine, kuidas suunata liiklust erinevates URL-i osades.

Mitte kÔik konfiguratsioonid ei rakendu Envoy Proxy-le, ja teil ei ole vaja mÔningaid parameetreid seadistada. Envoy Proxy-l on neli pÔhiliiki, mis toetavad NGINX-i pakutavat pÔhi infrastruktuuri. Tuum on:

  • Kuulajad: Need to define how Envoy Proxy handles incoming requests. Currently, Envoy Proxy supports only TCP-based listeners. Once a connection is established, it is passed to a set of filters for processing.
  • Filtrid: Need to be part of a pipeline architecture that can handle incoming and outgoing data. This functionality includes filters such as Gzip, which compresses data before sending it to the client.
  • Marshieldid: Need to redirect traffic to the required destination defined as a cluster.
  • Klastrid: Need to define the endpoint for traffic and configuration parameters.

We will use these four components to create an Envoy Proxy configuration that matches a specific NGINX configuration. The goal of Envoy is to work with APIs and dynamic configuration. In this case, the basic configuration will use static, hard-coded parameters from NGINX.

Step 2 — NGINX Configuration

Esimene osa nginx.conf defines some internal components of NGINX that need to be configured.

Worker Connections

Allpoolige allpool oleval konfiguratsioonil mÀÀratakse tööprotsesside ja ĂŒhenduste arv. See nĂ€itab, kuidas NGINX kohandub nĂ”udlusele vastamiseks.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy haldab tööprotsesse ja ĂŒhendusi erinevalt.

Envoy loob iga sĂŒsteemi fĂŒĂŒsilise lĂ”ime jaoks ĂŒhe töövoo. Iga töövoog kĂ€ivitab mittesĂŒnkroonse sĂŒndmuste tsĂŒkli, mis vastutab

  1. Iga kuulaja (listener) jÀlgimine
  2. Uute ĂŒhenduste vastuvĂ”tmine
  3. Filtrite komplekti loomine ĂŒhenduste jaoks
  4. KĂ”ik sisendi- ja vĂ€ljundioperatsioonid töötleva ĂŒhenduse kogu eksistentsi vĂ€ltel.

Edasine ĂŒhenduse töötlemine toimub tĂ€ielikult töövoos, sealhulgas kĂ”ik suunamiskĂ€itumine.

Iga töövoo kohta Envoy'is on ĂŒhendus basseinist. Seega seadistavad HTTP/2 ĂŒhenduste basseinid ainult ĂŒhe ĂŒhenduse iga vĂ€list hosti jaoks korraga, seega neli töövoogu tĂ€hendavad, et iga vĂ€list hosti jaoks on nelja HTTP/2 ĂŒhenduse olemasolu stabiilses olekus. Hoides kĂ”ik ĂŒhes töövoos, saab peaaegu kogu koodi kirjutada blokeerimiseta, nagu see oleks ĂŒhetöövoogne. Kui töövooge on eraldatud rohkem kui vajalik, vĂ”ib see viia ebaefektiivse mĂ€lukasutuse, rohkete ooteĂŒhenduste tekkimiseni ja ĂŒhenduste tagastamise vĂ€henemiseni basseini.

KĂŒlastage lisainformatsiooni saamiseks Envoy Proxy blogi.

HTTP konfiguratsioon

JÀrgmine NGINX konfiguratsiooni plokk mÀÀratleb HTTP seadistused, nagu:

  • Millised mime tĂŒĂŒbid on toetatud
  • Vaikeaegumised
  • Gzip konfiguratsioon

Saate neid aspekte seadistada Envoy Proxy filtritega, mida arutame hiljem.

Samm 3 — Serveri konfiguratsioon

HTTP konfigureerimise plokis mÀÀrab NGINX, et see kuulab porti 8080 ja vastab 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ĂŒsteemis hallatakse seda kuuldava kaudu.

Envoy kuuldavad

Envoy Proxy kasutamise ĂŒks tĂ€htsamaid aspekte on kuuldavate mÀÀramine. Peate looma konfiguratsioonifaili, mis kirjeldab, kuidas soovite kĂ€ivitada Envoy eksemplari.

AlljÀrgnev fragment loob uue kuuldava ja seob selle pordiga 8080. Konfiguratsioon juhib Envoy Proxy-d, millistele portidele ta peab olema seotud sisenevate pÀringute jaoks.

Envoy Proxy kasutab oma konfiguratsioonis YAML sĂŒntaksit. Selle sĂŒntaksiga tutvumiseks vaadake siit lingil.

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 saavad sellega hakkama.

Samm 4 — Asukoha konfiguratsioon

Kui pĂ€ring jĂ”uab NGINX-i, mÀÀrab asukohablokk, kuidas liiklust töödelda ja kuhu suunata. JĂ€rgmises fragmendis saadetakse kogu liiklus saidile upstream (tĂ”lkija mĂ€rkus: upstream — tavaliselt rakenduste serverid) klastrisse nimega targetCluster. Upstream klaster mÀÀratleb sĂ”lmed, mis peavad pĂ€ringu töötlema. KĂ€sitleme seda jĂ€rgmises sammus.

asukoht / {
    proxy_pass         http://targetCluster/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
}

Envoy's Filters handle this.

Envoy Filters

Filtrid mÀÀravad, kuidas staatilise konfiguratsiooni korral sisenevaid pÀringuid töödelda. Antud juhul seadistame filtrid, mis vastavad server_names eelnevale sammule. Kui sisenevad pÀringud vastavad teatud domeenidele ja marsruutidele, suunatakse liiklus klastrisse. See on vastavuses NGINX-i tÔusva konfiguratsiooniga.

Kopeeri redaktorisse    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

Nimi envoy.http_connection_manager on Envoy Proxy sisseehitatud filter. Muud filtrid sisaldavad Redis, Mongo, TCP. TĂ€ieliku nimekirja leiate dokumentatsioonis.

TĂ€iendava teabe saamiseks teiste koormuse tasakaalustamise poliitikate kohta kĂŒlastage Envoy dokumentatsiooni.

Samm 5 — Proxide ja Ülesvoolu Konfiguratsioon

NGINX-i konfisuratsioonis mÀÀratleb upstream sihtserverite kogumi, mis haldab liiklust. Sel juhul on mÀÀratud kaks klastrit.

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

Envoy-s haldab seda klastrid.

Envoy klastrid

Upstreami ekvivalent mÀÀratletakse klastritena. Sel juhul on mÀÀratud hostid, mis haldavad liiklust. Hostide ligipÀÀsu viis, nÀiteks ooteaeg, mÀÀratletakse klastrikona konfiguratsioonina. See vÔimaldab tÀpsemalt kontrollida selliste aspektide, nagu ooteaeg ja koormuse jaotus, tÀpsust.

Kopeeri redaktorisse  klastrid:
  - 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 }}
    ]

Teenuse avastamisel STRICT_DNS Envoy lahendab pidevalt ja asĂŒnkroonselt mÀÀratud DNS-i sihte. Iga DNS-i pĂ€ringu tulemusena tagastatud IP-aadress loetakse ĂŒlesandes klastris selgeks hostiks. See tĂ€hendab, et kui pĂ€ring tagastab kaks IP-aadressi, eeldab Envoy, et klastris on kaks hosti, ja mĂ”lemad tuleks koormuse tasakaalustamiseks arvesse vĂ”tta. Kui host eemaldatakse tulemustest, eeldab Envoy, et see enam ei eksisteeri, ja suunab liiklust vĂ€lja olemasolevate ĂŒhenduste basseinidest.

Lisainformatsiooni saamiseks vaata. Envoy Proxy dokumentatsiooni..

Samm 6 — Logide ja vigade juurde pÀÀsemine.

LĂ”plik seadistus — logimine. Selle asemel, et saata vealogid kettale, kasutab Envoy Proxy pilvepĂ”hist lĂ€henemist. KĂ”ik rakenduse logid suunatakse. stdout ja stderr.

Kui kasutajad teevad pĂ€ringu, on juurdepÀÀsulogid valikulised ja vaikimisi keelatud. HTTP-pĂ€ringute juurdepÀÀsulogide lubamiseks aktiveeri seadistus. access_log HTTP ĂŒhenduste haldurile. Teekond vĂ”ib olla kas seade, nagu. stdout, vĂ”i fail kettal, sĂ”ltuvalt teie nĂ”uetest.

JĂ€rgmine konfiguratsioon suunab kĂ”ik juurdepÀÀsu logid stdout (tĂ”lkija mĂ€rkus — stdout on vajalik envoy kasutamiseks dockeris. Kui kasutada ilma dockerita, asendage /dev/stdout tavapĂ€rase logifaili teega). Koo see fragment ĂŒhenduste halduri konfiguratsiooni sektsiooni:

Kopeeri lÔikelaualeaccess_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"

Tulemused peaksid vÀlja nÀgema jÀrgmised:

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

Vaikimisi sisaldab Envoy formaadiread, mis sisaldavad HTTP pÀringu detaile:

[%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 formaadirea 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, seades 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 salvestada ka JSON formaadis, kui seadistate 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)%"}

Lisainformatsiooni sÔltumatu registreerimise meetodi kohta leiate siit

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

Logimine ei ole ainus viis saada ĂŒlevaade Envoy Proxy toimimisest. Sellel on sisseehitatud edasijĂ”udnud jĂ€lgimise ja mÔÔdikute vĂ”imalused. Lisainfot leiate jĂ€lgimise dokumentatsioonist vĂ”i lĂ€bi Interaktiivse jĂ€lgimise skripti.

Samm 7 — KĂ€ivitamine

NĂŒĂŒd olete konfigureerimise NGINX-ilt Envoy Proxy-le ĂŒle viinud. Viimane samm on kĂ€ivitada Envoy Proxy eksemplar testimiseks.

KĂ€ivitamine kasutajana

NGINX-i konfiguratsiooni ĂŒlaosas rida user www www; nĂ€itab NGINX-i kĂ€itamise madala privileegiga kasutajana, et suurendada turvalisust.

Envoy Proxy kasutab pilvepÔhist lÀhenemist haldamiseks, kes on protsessi omanik. Kui kÀivitame Envoy Proxy konteineri kaudu, saame mÀÀrata madala privileegiga kasutaja.

Envoy Proxy kÀivitamine

Allpool kÀivitab Envoy Proxy Docker-konteineris hostis. See kÀsk vÔimaldab Envoy'l kuulata sissetulevaid pÀringuid porti 80 kaudu. Siiski, nagu on mÀrgitud kuulaja konfiguratsioonis, kuulab Envoy Proxy sissetulevat liiklust lÀbi pordi 8080. 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Àideldud proxy'ga saab teste teha ja töödelda. JÀrgmine cURL kÀsk saadab pÀringu, mille hosti pealkiri on mÀÀratud proxy konfiguratsioonis.

curl -H "Host: one.example.com" localhost -i

HTTP pĂ€ring toob kaasa vea 503. See on tingitud sellest, et tagasivoolu ĂŒhendused ei tööta ja need ei ole saadaval. Seega ei ole Envoy Proxy'l pĂ€ringu jaoks saadaolevaid sihtkohti. JĂ€rgmine kĂ€sk kĂ€ivitab rea HTTP teenuseid, mis vastavad Envoy'ile mÀÀratud konfiguratsioonile.

docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;

Saadaolevate teenustega suudab Envoy edukalt proksida liiklust sihtkohta.

curl -H "Host: one.example.com" localhost -i

Te peaksite nÀgema vastust, mis nÀitab, milline Docker- konteiner töötles pÀringu. Envoy Proxy logides peaksite samuti nÀgema vÀljundrida.

Lisapealkirjad HTTP vastuses

Kehtiva pĂ€ringu vastuse pealkirjades nĂ€ete lisandusid HTTP pealkirju. Pealkirjas kuvatakse aeg, mis kulus ĂŒlemise hosti pĂ€ringu töötlemiseks. See on vĂ€ljendatud millisekundites. See on kasulik, kui klient soovib mÀÀrata teenindusaega vĂ”rreldes vĂ”rgu viivitusega.

x-envoy-upstream-service-time: 0
server: envoy

LÔppkonfiguratsioon

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 lisainfo

Envoy Proxy paigaldusjuhised leiate veebisaidilt https://www.getenvoy.io/

Vaikeselt ei sisalda rpm systemd teenuse konfi.

Lisage 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

Peate looma kausta /etc/envoy/ ja panema sinna config.yaml faili.

Envoy proxy kohta on olemas Telegrami vestlus: https://t.me/envoyproxy_ru

Envoy Proxy ei toeta staatilise sisu jagamist. SeetĂ”ttu palun hÀÀletage selle funktsiooni ĂŒle. https://github.com/envoyproxy/envoy/issues/378

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, palun.

Kas see postitus innustas teid Envoy Proxy seadistama ja katsetama?

  • jah

  • ei

75 kasutajat hÀÀletasid. 18 kasutajat jÀid erapooletuks.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster