Paglalin gikan sa Nginx ngadto sa Envoy Proxy

Hoy Habr! Ania ang hubad sa post: Paglalin gikan sa Nginx ngadto sa Envoy Proxy.

Ang Envoy usa ka high-performance nga gipang-apod-apod nga proxy server (gisulat sa C ++) nga gidisenyo alang sa indibidwal nga mga serbisyo ug aplikasyon, kini usa usab ka bus sa komunikasyon ug "universal data plane" nga gidisenyo alang sa dagkong "service mesh" nga mga arkitektura sa microservice. Sa diha nga kini gibuhat, ang mga solusyon sa mga problema nga mitungha sa panahon sa pag-uswag sa mga server sama sa NGINX, HAProxy, hardware load balancers ug cloud load balancers gikonsiderar. Ang Envoy nagtrabaho kauban ang matag aplikasyon ug nag-abstract sa network aron mahatagan ang sagad nga pagpaandar bisan unsa pa ang plataporma. Kung ang tanan nga trapiko sa serbisyo sa imprastraktura moagi sa Envoy grid, mahimong dali nga mahanduraw ang mga lugar nga adunay problema pinaagi sa makanunayon nga pag-obserbar, pag-tune sa kinatibuk-ang pasundayag, ug pagdugang sa panguna nga pagpaandar sa usa ka piho nga lokasyon.

Mga Feature

  • Out-of-process nga arkitektura: envoy kay usa ka self-contained, high-performance server nga mokuha ug gamay nga RAM. Naglihok kini kauban sa bisan unsang pinulongan o balangkas sa aplikasyon.
  • http/2 ug grpc nga suporta: envoy adunay top-notch http/2 ug grpc suporta alang sa umaabot ug outgoing koneksyon. Kini usa ka transparent nga proxy gikan sa http/1.1 hangtod sa http/2.
  • Advanced nga pagbalanse sa load: Gisuportahan sa envoy ang mga advanced nga bahin sa pagbalanse sa load, lakip ang awtomatikong pag-ulit, pagtapos sa kadena, paglimite sa tibuuk kalibutan, pag-shadow sa pangutana, pagbalanse sa lokal nga pagkarga sa zone, ug uban pa.
  • Configuration Management API: ang envoy naghatag ug lig-on nga API para sa dinamikong pagdumala sa configuration niini.
  • Pag-obserbar: Lawom nga pag-obserbar sa L7 nga trapiko, built-in nga suporta alang sa giapod-apod nga pagsubay, ug pagka-obserbar sa mongodb, dynamodb ug daghang uban pang mga aplikasyon.

Lakang 1 - Pananglitan sa NGINX Config

Kini nga script naggamit sa usa ka espesyal nga gihimo nga file nginx.conf, base sa kompleto nga pananglitan gikan sa Wiki. Mahimo nimong tan-awon ang configuration sa editor pinaagi sa pag-abli nginx.conf

Inisyal nga nginx 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;
    }
  }
}

Ang mga pag-configure sa NGINX kasagaran adunay tulo ka hinungdanon nga elemento:

  1. Pag-set up sa NGINX server, logging structure, ug Gzip functionality. Kini gihubit sa tibuok kalibutan sa tanang mga kaso.
  2. Pag-configure sa NGINX aron dawaton ang mga hangyo sa host one.example.com sa port 8080.
  3. Pag-setup sa target nga lokasyon, kung giunsa pagdumala ang trapiko alang sa lainlaing mga bahin sa URL.

Dili tanan nga configuration magamit sa Envoy Proxy ug dili nimo kinahanglan nga i-configure ang pipila ka mga setting. Ang Envoy Proxy adunay upat ka yawe nga matang, nga nagsuporta sa nagpahiping imprastraktura nga gitanyag sa NGINX. Ang kernel mao ang:

  • Mga tigpaminaw: Gihubit nila kung giunsa pagdawat sa Envoy Proxy ang umaabot nga mga hangyo. Ang Envoy Proxy sa pagkakaron nagsuporta lamang sa mga tigpaminaw nga nakabase sa TCP. Kung matukod na ang usa ka koneksyon, ipasa kini sa set sa filter alang sa pagproseso.
  • Mga filter: Kabahin sila sa arkitektura sa pipeline nga makaproseso sa umaabot ug paggawas nga datos. Kini nga pag-andar naglakip sa mga pagsala sama sa Gzip, nga nag-compress sa datos sa wala pa ipadala kini sa kliyente.
  • Mga router: Gi-redirect nila ang trapiko sa gusto nga destinasyon, nga gihubit ingon usa ka cluster.
  • Mga pundok: Gihubit nila ang katapusan nga punto alang sa trapiko ug mga kapilian sa pag-configure.

Among gamiton kining upat ka mga sangkap sa paghimo og Envoy Proxy configuration nga mohaum sa usa ka partikular nga NGINX configuration. Ang katuyoan sa Envoy mao ang pagtrabaho sa API ug dinamikong pag-configure. Sa kini nga kaso, ang base configuration mogamit sa static, hard-coded nga mga kapilian gikan sa NGINX.

Lakang 2 - Pag-configure sa NGINX

Una nga bahin nginx.conf naghubit sa pipila ka NGINX internals nga kinahanglang i-configure.

Mga Koneksyon sa Trabaho

Ang configuration sa ubos nagtino sa gidaghanon sa mga proseso ug koneksyon sa trabahante. Gipakita niini kung giunsa ang pagsukod sa NGINX aron matubag ang panginahanglan.

worker_processes  2;

events {
  worker_connections   2000;
}

Ang Envoy Proxy nagdumala sa mga workflow ug koneksyon sa lainlaing paagi.

Ang Envoy nagmugna og worker thread alang sa matag hardware thread sa sistema. Ang matag thread sa trabahador nagpatuman sa usa ka non-blocking event loop nga maoy responsable

  1. Pagpaminaw sa matag tigpaminaw (tigpaminaw)
  2. Pagdawat sa bag-ong mga koneksyon
  3. Paghimo usa ka set sa filter alang sa usa ka koneksyon
  4. Pagproseso sa tanang operasyon sa I/O sa tibuok kinabuhi sa koneksyon.

Ang tanan nga dugang nga pagproseso sa koneksyon gidumala sa tibuuk nga thread sa trabahante, lakip ang bisan unsang pamatasan sa pagpasa.

Alang sa matag thread sa trabahante sa Envoy, adunay koneksyon sa pool. Mao nga ang mga pool sa koneksyon sa HTTP / 2 nagtukod lamang usa ka koneksyon alang sa matag eksternal nga host sa usa ka higayon, nga adunay upat nga mga thread sa trabahante, adunay upat nga koneksyon sa HTTP / 2 alang sa matag eksternal nga host sa usa ka lig-on nga kahimtang. Pinaagi sa pagtipig sa tanan sa usa ka thread sa trabahante, hapit tanan nga code mahimong isulat nga wala’y block nga ingon nga kini usa ka sinulud. Kung daghang mga thread sa trabahante ang gigahin kaysa kinahanglan, mahimo’g moresulta kini sa nausik nga panumduman, pagmugna og daghang mga idle nga koneksyon, ug pagkunhod sa gidaghanon sa pagbalik sa koneksyon sa pool.

Para sa dugang impormasyon bisitaha Envoy Proxy nga blog.

HTTP Configuration

Ang mosunod nga NGINX configuration block naghubit sa mga setting sa HTTP sama sa:

  • Unsa nga mga tipo sa mime ang gisuportahan
  • Default nga mga timeout
  • Pag-configure sa Gzip

Mahimo nimong ipasibo kini nga mga aspeto gamit ang mga pagsala sa Envoy Proxy, nga atong hisgutan sa ulahi.

Lakang 3 - Pag-configure sa Server

Sa HTTP configuration block, ang NGINX configuration nagtino sa pagpaminaw sa port 8080 ug pagtubag sa umaabot nga mga hangyo alang sa mga domain. one.example.com ΠΈ www.one.example.com.

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

Sulod sa Envoy, ang mga tigpaminaw nagdumala niini.

Mga tigpaminaw sa sinugo

Ang labing hinungdanon nga aspeto sa pagsugod sa Envoy Proxy mao ang pagtino sa mga tigpaminaw. Kinahanglan ka nga maghimo usa ka file sa pag-configure nga naghulagway kung giunsa nimo gusto nga ipadagan ang pananglitan sa Envoy.

Ang snippet sa ubos maghimo usa ka bag-ong tigpaminaw ug igapos kini sa port 8080. Ang configuration nagsulti sa Envoy Proxy kung unsang mga pantalan kini kinahanglan nga igapos alang sa umaabot nga mga hangyo.

Ang Envoy Proxy naggamit sa YAML notation para sa configuration niini. Alang sa pasiuna niini nga notasyon, tan-awa dinhi link.

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

Dili kinahanglan nga ipasabut server_name, kay ang Envoy Proxy filters maoy magdumala niini.

Lakang 4 - Pag-configure sa Lokasyon

Kung ang usa ka hangyo moabut sa NGINX, ang bloke sa lokasyon nagtino kung giunsa pagdumala ug kung asa ruta ang trapiko. Sa mosunod nga tipik, ang tanang trapiko sa site gibalhin ngadto sa upstream (note sa maghuhubad: ang upstream kasagaran usa ka application server) cluster nga ginganlan targetCluster. Ang upstream cluster naghubit sa mga node nga kinahanglan magproseso sa hangyo. Atong hisgotan kini sa sunod nga lakang.

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

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

Sa Envoy, mao kini ang gibuhat sa mga Filter.

Mga Filter sa Envoy

Alang sa usa ka static nga pag-configure, ang mga pagsala nagtino kung giunsa giproseso ang umaabot nga mga hangyo. Niini nga kaso, nagbutang kami og mga filter nga motakdo server_ngalan sa miaging lakang. Kung moabut ang umaabot nga mga hangyo nga magkatugma sa pipila nga mga domain ug ruta, ang trapiko madala sa cluster. Kini ang katumbas sa NGINX upstream configuration.

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

ngalan envoy.http_connection_manager usa ka built-in nga filter sa Envoy Proxy. Ang ubang mga pagsala naglakip Redis, Mongo, TCP. Makita nimo ang kompletong listahan sa dokumentasyon.

Para sa dugang nga impormasyon sa ubang mga polisiya sa pagbalanse sa load, bisitaha Dokumentasyon sa Envoy.

Lakang 5 - Proxy ug Upstream Configuration

Sa NGINX, ang upstream configuration naghubit sa usa ka set sa mga target server nga magproseso sa trapiko. Sa kini nga kaso, duha ka cluster ang gi-assign.

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

Sa Envoy kini gidumala sa mga pungpong.

Mga Cluster sa Envoy

Ang upstream nga katumbas kay gihubit ingong mga pungpong. Sa kini nga kaso, ang mga host nga mag-alagad sa trapiko gihubit. Giunsa ang pag-access sa mga host, sama sa timeout, gihubit ingon usa ka configuration sa cluster. Gitugotan niini ang labi ka maayo nga pagkontrol sa granularity sa mga aspeto sama sa latency ug pagbalanse sa load.

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

Kung gigamit ang pagdiskobre sa serbisyo STRICT_DNS Ang Envoy padayon ug asynchronously nga masulbad ang gipiho nga mga target sa DNS. Ang matag gibalik nga IP address gikan sa resulta sa DNS isipon nga usa ka klaro nga host sa upstream cluster. Kini nagpasabot nga kung ang usa ka pangutana magbalik sa duha ka IP address, ang Envoy maghunahuna nga adunay duha ka mga host sa cluster ug ang duha kinahanglan nga balanse sa pagkarga. Kung ang usa ka host tangtangon gikan sa resulta, ang Envoy nagtuo nga kini wala na ug mobira sa trapiko gikan sa bisan unsang kasamtangan nga koneksyon pool.

Alang sa dugang nga kasayuran tan-awa Dokumentasyon sa envoy proxy.

Lakang 6 - Pag-access sa Log ug Mga Kasaypanan

Ang katapusan nga pag-configure mao ang pagrehistro. Imbis nga iduso ang mga error log sa disk, ang Envoy Proxy nagkuha usa ka paagi nga nakabase sa panganod. Ang tanan nga mga log sa aplikasyon gi-output sa stdout ΠΈ stderr.

Kung ang mga tiggamit mohimo usa ka hangyo, ang mga log sa pag-access kay opsyonal ug gi-disable pinaagi sa default. Aron ma-enable ang access logs para sa HTTP requests, i-enable ang configuration access_log alang sa HTTP connection manager. Ang agianan mahimo nga usa ka aparato sama sa stdout, o usa ka file sa disk, depende sa imong mga kinahanglanon.

Ang mosunud nga pag-configure mag-redirect sa tanan nga mga log sa pag-access stdout (pahinumdom sa tighubad - gikinahanglan ang stdout nga gamiton ang envoy sulod sa docker. Kung gigamit nga walay docker, unya pulihan ang /dev/stdout sa agianan sa naandan nga log file). Kopyaha ang snippet sa seksyon sa pag-configure alang sa manager sa koneksyon:

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

Ang mga resulta kinahanglan nga tan-awon sama niini:

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

Sa kasagaran, ang Envoy adunay format nga string nga naglakip sa mga detalye sa HTTP nga hangyo:

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

Ang resulta niini nga format nga string mao ang:

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

Ang sulud sa output mahimong ipasibo pinaagi sa pagtakda sa natad sa format. Pananglitan:

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"

Ang linya sa log mahimo usab nga ma-output sa format nga JSON pinaagi sa pag-set sa uma json_format. Pananglitan:

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

Alang sa dugang nga kasayuran sa pamaagi sa pagparehistro sa envoy, bisitaha

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

Ang pag-log dili lamang ang paagi aron mabati ang pagtrabaho kauban ang Envoy Proxy. Kini adunay advanced nga pagsubay ug mga sukatan nga gitukod. Mahibal-an nimo ang dugang sa pagsubay sa dokumentasyon o pinaagi sa Interactive nga Routing Script.

Lakang 7 - Ilunsad

Imong gibalhin karon ang configuration gikan sa NGINX ngadto sa Envoy Proxy. Ang katapusang lakang mao ang paglansad sa usa ka pananglitan sa Envoy Proxy aron sulayan kini.

Pagdagan ingon nga tiggamit

Sa tumoy sa linya sa pagsumpo sa NGINX tiggamit www www; nagpakita nga ang NGINX nagdagan isip ubos nga pribilihiyo nga tiggamit aron sa pagpalambo sa seguridad.

Ang Envoy Proxy nagkuha ug cloud-based nga pamaagi sa pagdumala kon kinsay tag-iya sa proseso. Kung gipadagan namon ang Envoy Proxy pinaagi sa usa ka sudlanan, mahimo namon nga ipiho ang usa ka ubos nga pribilihiyo nga tiggamit.

Pagdalag Envoy Proxy

Ang sugo sa ubos maglunsad sa Envoy Proxy pinaagi sa usa ka Docker container sa host. Kini nga sugo naghatag sa Envoy og abilidad sa pagpaminaw sa umaabot nga mga hangyo sa port 80. Apan, sumala sa gipiho sa listener configuration, Envoy Proxy naminaw alang sa umaabot nga trapiko sa port 8080. Kini nagtugot sa proseso sa pagdagan ingon nga usa ka user nga adunay ubos nga mga pribilehiyo.

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

Pagsulay

Uban sa proxy nga nagdagan, ang mga pagsulay mahimo na karon ug maproseso. Ang mosunod nga cURL command nag-isyu og hangyo sa host header nga gihubit sa proxy configuration.

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

Ang hangyo sa HTTP moresulta sa usa ka sayup 503. Kini tungod kay ang mga koneksyon sa upstream dili molihok ug dili magamit. Busa, ang Envoy Proxy walay magamit nga target nga mga destinasyon alang sa hangyo. Ang mosunod nga sugo magsugod sa usa ka serye sa mga serbisyo sa HTTP nga mohaum sa configuration nga gihubit alang sa Envoy.

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

Uban sa mga serbisyo nga magamit, Envoy mahimong malampuson nga proxy sa trapiko sa destinasyon niini.

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

Kinahanglan nimo nga makita ang usa ka tubag nga nagpakita kung unsang sudlanan sa Docker ang nagdumala sa hangyo. Sa Envoy Proxy logs, kinahanglan nimo nga makita usab ang access string nga giimprinta.

Dugang HTTP Response Header (HTTP Response)

Makita nimo ang dugang nga mga ulohan sa HTTP sa mga ulohan sa tubag sa usa ka balido nga hangyo. Gipakita sa header ang oras nga gigasto sa upstream host sa pagproseso sa hangyo. Gipahayag sa milliseconds. Mapuslanon kini kung gusto sa kliyente nga mahibal-an ang oras sa serbisyo kumpara sa latency sa network.

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

Katapusan nga config

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 }

Dugang nga impormasyon gikan sa tighubad

Ang mga panudlo sa pag-instalar sa Envoy Proxy makita sa website https://www.getenvoy.io/

Walay systemd service config sa rpm nga default.

Idugang ang systemd service config sa /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

Kinahanglan nimong himoon ang /etc/envoy/ directory ug ibutang ang config.yaml config didto.

Adunay usa ka telegrama nga chat alang sa envoy proxy: https://t.me/envoyproxy_ru

Ang Envoy Proxy dili mosuporta sa pag-alagad sa static nga sulod. Busa kinsay makabotar sa usa ka bahin: https://github.com/envoyproxy/envoy/issues/378

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Gidasig ka ba niini nga post sa pag-instalar ug pagsulay sa envoy proxy?

  • oo

  • dili

75 ka tiggamit ang nagboto. 18 ka tiggamit ang nag-abstain.

Source: www.habr.com

Idugang sa usa ka comment