Migrasyon soti nan Nginx nan Envoy Proxy

Bonjou, Habr! Mwen pote nan atansyon ou yon tradiksyon pòs la: Migrasyon soti nan Nginx nan Envoy Proxy.

Envoy se yon wo-pèfòmans distribiye sèvè prokurasyon (ekri nan C++) ki fèt pou sèvis endividyèl ak aplikasyon, li se tou yon otobis kominikasyon ak "avyon done inivèsèl" ki fèt pou gwo mikwosèvis "may sèvis" achitekti. Lè yo kreye li, solisyon pou pwoblèm ki te parèt pandan devlopman nan serveurs tankou NGINX, HAProxy, balans chaj pyès ki nan konpitè ak balans chaj nwaj yo te pran an kont. Envoy travay ansanm ak chak aplikasyon ak abstrè rezo a bay fonksyonalite komen kèlkeswa platfòm. Lè tout trafik sèvis nan yon enfrastrikti ap koule nan may Envoy la, li vin fasil pou vizyalize zòn pwoblèm yo ak obsèvabilite konsistan, ajiste pèfòmans jeneral, epi ajoute fonksyonalite debaz nan yon kote espesifik.

Kapasite

  • Achitekti andeyò pwosesis la: Envoy se yon sèvè endepandan, pèfòmans segondè ki pran yon ti kantite RAM. Li travay ansanm ak nenpòt lang aplikasyon oswa kad.
  • http/2 ak sipò grpc: Envoy gen sipò http/2 ak grpc premye klas pou koneksyon fèk ap rantre ak sortan. Sa a se yon prokurasyon transparan soti nan http/1.1 a http/2.
  • Balanse chaj avanse: anvwaye sipòte karakteristik balanse chaj avanse ki gen ladan retry otomatik, kraze chèn, limit pousantaj mondyal, lonbraj demann, balanse chaj zòn lokal, elatriye.
  • API Jesyon Konfigirasyon: Envoy bay yon API solid pou jere konfigirasyon ou an dinamik.
  • Obsèvabilite: Obsèvabilite gwo twou san fon nan trafik L7, sipò natif natal pou trase distribiye ak obsèvabilite nan mongodb, dynamodb ak anpil lòt aplikasyon.

Etap 1 - Egzanp NGINX Config

Script sa a sèvi ak yon fichye espesyalman fabrike nginx.conf, ki baze sou egzanp konplè soti nan NGINX Wiki. Ou ka wè konfigirasyon an nan editè a lè w louvri nginx.conf

nginx sous konfigirasyon

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

Konfigirasyon NGINX anjeneral gen twa eleman kle:

  1. Konfigirasyon sèvè NGINX, estrikti log ak fonksyonalite Gzip. Sa a se defini globalman nan tout ka.
  2. Konfigirasyon NGINX pou aksepte demann bay lame a youn.egzanp.com sou pò 8080.
  3. Mete kanpe kote sib la, ki jan yo okipe trafik pou diferan pati nan URL la.

Se pa tout konfigirasyon yo pral aplike nan Envoy Proxy, epi ou pa bezwen konfigirasyon kèk paramèt. Anvwaye Proxy genyen kat kalite kle, ki sipòte enfrastrikti debaz yo ofri nan NGINX. Nwayo a se:

  • Moun k ap koute: Yo detèmine kijan Envoy Proxy aksepte demann k ap vini yo. Envoy Proxy kounye a sèlman sipòte oditè ki baze sou TCP. Yon fwa yo etabli yon koneksyon, li pase nan yon seri filtè pou trete.
  • Filtè: Yo fè pati yon achitekti tiyo ki ka trete done fèk ap rantre ak sortan. Fonksyonalite sa a gen ladan filtè tankou Gzip, ki konprese done yo anvan yo voye li bay kliyan an.
  • Routeurs: Yo voye trafik nan destinasyon ki nesesè yo, ki defini kòm yon gwoup.
  • Gwoup: Yo defini pwen final la pou trafik ak paramèt konfigirasyon.

Nou pral sèvi ak kat eleman sa yo pou kreye yon konfigirasyon Envoy Proxy pou matche ak yon konfigirasyon NGINX espesifik. Objektif Envoy se travay avèk API ak konfigirasyon dinamik. Nan ka sa a, konfigirasyon baz la pral sèvi ak paramèt estatik ki kode di NGINX.

Etap 2 - Konfigirasyon NGINX

Pati nan premye nginx.conf defini kèk entèn NGINX ki bezwen konfigirasyon.

Koneksyon travayè yo

Konfigirasyon ki anba a detèmine kantite pwosesis travayè ak koneksyon. Sa a endike ki jan NGINX pral echèl pou satisfè demann.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy jere workflows ak koneksyon nan diferan fason.

Envoy kreye yon fil travayè pou chak fil pyès ki nan konpitè sou sistèm nan. Chak fil travayè egzekite yon bouk evènman ki pa bloke ki responsab pou

  1. Koute chak moun k ap koute
  2. Aksepte nouvo koneksyon
  3. Kreye yon seri filtè pou yon koneksyon
  4. Pwosesis tout operasyon I/O pandan tout lavi koneksyon an.

Tout pwosesis koneksyon plis okipe antyèman nan fil travayè a, ki gen ladan nenpòt konpòtman transmisyon.

Pou chak fil travayè nan Envoy, gen yon pisin koneksyon. Se konsa, pisin koneksyon HTTP/2 sèlman etabli yon koneksyon pou chak lame ekstèn nan yon moman, si gen kat fil travayè pral gen kat koneksyon HTTP/2 pou chak lame ekstèn nan yon eta ki estab. Lè w kenbe tout bagay nan yon sèl fil travayè, prèske tout kòd ka ekri san yo pa bloke, tankou si li te yon sèl fil. Si yo resevwa plis fil travayè pase sa nesesè, sa ka mennen nan gaspiye memwa, kreye yon gwo kantite koneksyon san fè anyen konsa, ak diminye kantite koneksyon yo te retounen tounen nan pisin lan.

Pou plis enfòmasyon vizite Envoy Proxy blog.

HTTP Konfigirasyon

Blòk konfigirasyon NGINX sa a defini paramèt HTTP tankou:

  • Ki kalite mim yo sipòte
  • Default Timeouts
  • Konfigirasyon Gzip

Ou ka Customize aspè sa yo lè l sèvi avèk filtè nan Envoy Proxy, ke nou pral diskite pita.

Etap 3 - Konfigirasyon sèvè

Nan blòk konfigirasyon HTTP, konfigirasyon NGINX la presize pou koute pò 8080 epi reponn a demann fèk ap rantre pou domèn. youn.egzanp.com и www.one.example.com.

 server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

Anndan Envoy, li kontwole pa moun ki koute.

Anvwaye koute

Aspè ki pi enpòtan nan kòmanse ak Envoy Proxy se defini moun k ap koute w yo. Ou bezwen kreye yon fichye konfigirasyon ki dekri kijan ou vle kouri egzanp Envoy la.

Frag ki anba a pral kreye yon nouvo koute epi mare li nan pò 8080. Konfigirasyon an di Envoy Proxy ki pò li ta dwe mare pou demann fèk ap rantre.

Envoy Proxy itilize notasyon YAML pou konfigirasyon li yo. Pou yon entwodiksyon nan notasyon sa a, gade isit la lyen.

Copy to Editorstatic_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }

Pa bezwen defini server_name, depi filtè Envoy Proxy pral okipe sa a.

Etap 4 - Konfigirasyon Kote

Lè yon demann vini nan NGINX, blòk kote a detèmine kijan pou trete ak ki kote pou wout trafik la. Nan fragman sa a, tout trafik sou sit la transfere nan yon gwoup en (nòt tradiktè a: en se nòmalman yon sèvè aplikasyon) targetCluster. Gwoup la en defini nœuds ki ta dwe trete demann lan. Nou pral diskite sou sa a nan pwochen etap la.

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

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

Nan Envoy, Filtres fè sa.

Envoy Filtè

Pou yon konfigirasyon estatik, filtè detèmine kijan pou trete demann k ap fèk ap rantre yo. Nan ka sa a nou mete filtè ki matche ak server_names nan etap anvan an. Lè demann fèk ap rantre yo rive ki koresponn ak sèten domèn ak wout, trafik yo ap dirije nan gwoup la. Sa a se ekivalan a nan yon konfigirasyon NGINX anba-up.

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

non anvoy.http_connection_manager se yon filtè entegre nan Envoy Proxy. Lòt filtè yo enkli Redis, Mongo, Tchp. Ou ka jwenn lis konplè a nan dokiman.

Pou plis enfòmasyon sou lòt politik balans chaj, vizite Dokimantasyon anvwaye.

Etap 5 - Proxy ak Konfigirasyon En

Nan NGINX, konfigirasyon an en defini yon seri sèvè sib ki pral trete trafik. Nan ka sa a, de grap yo te asiyen.

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

Nan Envoy, sa a se jere pa grap.

Gwoup Anvwaye

Ekivalan a en defini kòm grap. Nan ka sa a, gen tout pouvwa a ki pral sèvi trafik la yo te idantifye. Fason yo jwenn aksè nan lame yo, tankou timeouts, defini kòm yon konfigirasyon gwoup. Sa a pèmèt pou plis kontwòl granulaire sou aspè tankou latansi ak balans chaj.

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 }}
    ]

Lè w ap itilize dekouvèt sèvis STRICT_DNS Envoy pral kontinyèlman ak asynchrone rezoud objektif DNS espesifye yo. Chak adrès IP retounen nan rezilta DNS yo pral konsidere kòm yon lame eksplisit nan gwoup la en. Sa vle di ke si yon demann retounen de adrès IP, Envoy pral asime ke gen de lame nan gwoup la, epi tou de dwe balanse chaj. Si yo retire yon lame nan rezilta a, Envoy pral sipoze li pa egziste ankò epi li pral rale trafik soti nan nenpòt pisin koneksyon ki egziste deja.

Pou plis enfòmasyon gade Dokimantasyon prokurasyon anvwaye.

Etap 6 - Log Aksè ak Erè

Konfigirasyon final la se enskripsyon an. Olye pou yo pouse mòso bwa erè sou disk, Envoy Proxy pran yon apwòch ki baze sou nwaj. Tout mòso bwa aplikasyon yo soti nan stdout и stderr.

Lè itilizatè yo fè yon demann, mòso bwa aksè yo opsyonèl epi yo enfim pa default. Pou pèmèt mòso bwa aksè pou demann HTTP, pèmèt konfigirasyon an access_log pou manadjè koneksyon HTTP. Chemen an kapab swa yon aparèy tankou stdout, oswa yon dosye sou disk, tou depann de kondisyon ou yo.

Konfigirasyon sa a pral redireksyon tout mòso bwa aksè yo stdout (Nòt tradiktè a - stdout oblije sèvi ak envoy andedan docker. Si yo itilize san docker, Lè sa a, ranplase /dev/stdout ak chemen an nan yon dosye regilye). Kopi ti bout la nan seksyon konfigirasyon an pou manadjè koneksyon an:

Copy to Clipboardaccess_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"

Rezilta yo ta dwe sanble tankou sa a:

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

Pa default, Envoy gen yon seri fòma ki gen ladan detay demann HTTP an:

[%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

Rezilta fisèl fòma sa a se:

[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"

Contenu pèsistans yap ogmante jiska kapab personnalisé pa mete jaden fòma. Pa egzanp:

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"

Liy boutèy la kapab tou pwodiksyon an fòma JSON pa mete jaden an json_format. Pa egzanp:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}

Pou plis enfòmasyon sou Metodoloji Enskripsyon anvwaye, vizite

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

Enregistrement se pa sèl fason pou jwenn insight sou travay ak Envoy Proxy. Li gen kapasite avanse trase ak metrik bati nan li. Ou ka jwenn plis enfòmasyon nan trase dokiman oswa nan Entèaktif trase script.

Etap 7 - Lanse

Koulye a, ou te imigre konfigirasyon ou soti nan NGINX nan Envoy Proxy. Dènye etap la se lanse yon egzanp Envoy Proxy pou teste li.

Kouri kòm itilizatè

Nan tèt liy konfigirasyon NGINX la itilizatè www www; presize pou kouri NGINX kòm yon itilizatè ki gen privilèj ki ba pou amelyore sekirite.

Envoy Proxy pran yon apwòch ki baze sou nwaj pou jere moun ki posede yon pwosesis. Lè nou kouri Envoy Proxy atravè yon veso, nou ka presize yon itilizatè ki ba privilèj.

Lanse Envoy Proxy

Kòmand ki anba a pral kouri Envoy Proxy atravè yon veso Docker sou lame a. Kòmandman sa a bay Envoy kapasite pou l koute demann k ap rantre sou pò 80. Sepandan, jan sa espesifye nan konfigirasyon moun k ap koute a, Envoy Proxy koute trafik k ap rantre sou pò 8080. Sa pèmèt pwosesis la kouri kòm yon itilizatè ki pa gen anpil privilèj.

docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy

Tès

Ak proxy a ap kouri, tès yo kapab kounye a fèt ak trete. Kòmand sa a cURL bay yon demann ak header lame defini nan konfigirasyon an prokurasyon.

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

Demann HTTP a pral lakòz yon erè 503. Sa a se paske koneksyon en yo pa travay epi yo pa disponib. Se poutèt sa, Envoy Proxy pa gen okenn destinasyon ki disponib pou demann lan. Kòmandman sa a pral kòmanse yon seri sèvis HTTP ki matche ak konfigirasyon an defini pou Envoy.

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

Avèk sèvis ki disponib yo, Envoy ka avèk siksè proxy trafik nan destinasyon li yo.

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

Ou ta dwe wè yon repons ki endike ki veso Docker ki te trete demann lan. Nan mòso bwa yo Envoy Proxy ou ta dwe wè tou yon pwodiksyon fisèl aksè.

Lòt Tèt repons HTTP

Ou pral wè lòt headers HTTP nan repons demann aktyèl la. Tèt la montre tan lame a en te pase pou trete demann lan. Eksprime nan milisgond. Sa a itil si kliyan an vle detèmine tan sèvis konpare ak latansi rezo a.

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

Final konfigirasyon

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 }

Lòt enfòmasyon ki soti nan tradiktè a

Ou ka jwenn enstriksyon pou enstale Envoy Proxy sou sit entènèt la https://www.getenvoy.io/

Pa default, rpm pa gen yon konfigirasyon sèvis systemd.

Ajoute 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

Ou bezwen kreye yon anyè /etc/envoy/ epi mete konfig.yaml la.

Gen yon chat telegram lè l sèvi avèk envoy proxy: https://t.me/envoyproxy_ru

Envoy Proxy pa sipòte sèvi kontni estatik. Se poutèt sa, ki moun ki ka vote pou karakteristik la: https://github.com/envoyproxy/envoy/issues/378

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Èske pòs sa a ankouraje w enstale ak teste envoy proxy?

  • repons lan se wi

  • нет

75 itilizatè yo te vote. 18 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè