Fifindra-monina avy any Nginx mankany Envoy Proxy

Salama, Habr! Mitondra ny sainao ny fandikana ny lahatsoratra aho: Fifindra-monina avy any Nginx mankany Envoy Proxy.

Ny Envoy dia mpizara proxy zaraina mahomby (voasoratra amin'ny C ++) natao ho an'ny serivisy sy fampiharana tsirairay, fiara fitateram-pifandraisana sy "fiaramanidina data manerantany" natao ho an'ny maritrano "service mesh" lehibe. Rehefa namorona azy, dia noraisina ny vahaolana amin'ny olana nipoitra nandritra ny fampivoarana ireo mpizara toa ny NGINX, HAProxy, ny mpanelanelana mavesatra amin'ny fitaovana ary ny mpandrindra mavesatra rahona. Miara-miasa amin'ny fampiharana tsirairay ny Envoy ary manaisotra ny tambajotra mba hanomezana fiasa mahazatra na inona na inona sehatra. Rehefa mikoriana amin'ny mesh Envoy ny fifamoivoizana rehetra amin'ny fotodrafitrasa, dia lasa mora ny maka sary an-tsaina ireo faritra misy olana miaraka amin'ny fanaraha-maso tsy tapaka, mampifanaraka ny zava-bita amin'ny ankapobeny ary manampy ny fiasa fototra amin'ny toerana iray manokana.

fahafahana

  • Ny maritrano ivelan'ny fizotry ny fizotry ny asa: ny iraka dia mpizara manana fahaiza-manao avo lenta izay maka RAM kely. Miara-miasa amin'ny fiteny na rafitra fampiharana rehetra izy io.
  • http/2 sy ny fanohanan'ny grpc: ny iraka dia manana http/2 kilasy voalohany ary fanohanana grpc ho an'ny fifandraisana miditra sy mivoaka. Ity dia proxy mangarahara manomboka amin'ny http/1.1 ka hatramin'ny http/2.
  • Advanced Load Balancing: Ny iraka dia manohana ny fampifandanjana entana mandroso ao anatin'izany ny famerenana mandeha ho azy, ny famotehana rojo, ny famerana ny tahan'ny eran-tany, ny fangatahan'ny aloka, ny fifandanjana enta-mavesatra eo an-toerana, sns.
  • Configuration Management API: ny iraka dia manome API matanjaka ho an'ny fitantanana dynamic ny configuration anao.
  • Observability: Fandinihana lalina ny fifamoivoizana L7, fanohanana teratany ho an'ny tracing mizara sy ny fahitana ny mongodb, dynamodb ary fampiharana maro hafa.

Dingana 1 - Ohatra NGINX Config

Ity script ity dia mampiasa rakitra noforonina manokana nginx.conf, mifototra amin'ny ohatra feno avy amin'ny NGINX Wiki. Azonao atao ny mijery ny fanitsiana ao amin'ny tonian-dahatsoratra amin'ny fanokafana nginx.conf

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

Ny fanamafisana NGINX matetika dia manana singa telo lehibe:

  1. Fandrindrana ny mpizara NGINX, rafitra log ary fiasa Gzip. Voafaritra maneran-tany izany amin'ny tranga rehetra.
  2. Fametrahana NGINX hanaiky ny fangatahana amin'ny mpampiantrano one.example.com amin'ny port 8080.
  3. Fametrahana ny toerana kendrena, ny fomba fitantanana ny fifamoivoizana amin'ny faritra samihafa amin'ny URL.

Tsy ny fanovana rehetra no mihatra amin'ny Envoy Proxy, ary tsy mila manamboatra fanovana sasany ianao. Envoy Proxy dia manana karazana fanalahidy efatra, izay manohana ny fotodrafitrasa fototra atolotry ny NGINX. Ny fototra dia:

  • mpihaino: Izy ireo no mamaritra ny fomba faneken'ny Envoy Proxy ny fangatahana miditra. Envoy Proxy amin'izao fotoana izao dia tsy manohana afa-tsy mpihaino mifototra amin'ny TCP. Rehefa tafapetraka ny fifandraisana dia ampitaina amin'ny sivana maromaro ho an'ny fanodinana.
  • Sivana: Izy ireo dia ampahany amin'ny rafitra fantsona izay afaka manodina ny angona miditra sy mivoaka. Ity fampiasa ity dia misy sivana toy ny Gzip, izay manindry ny angona alohan'ny handefasana azy amin'ny mpanjifa.
  • Routers: Mandefa fifamoivoizana mankany amin'ny toerana ilaina izy ireo, voafaritra ho cluster.
  • Vondrona: Izy ireo no mamaritra ny teboka farany ho an'ny fifamoivoizana sy ny masontsivana fanitsiana.

Hampiasa ireo singa efatra ireo izahay mba hamoronana fikandrana Envoy Proxy mba hifanaraka amin'ny konfigurasi NGINX manokana. Ny tanjon'ny Envoy dia ny hiara-hiasa amin'ny API sy ny fikandrana mavitrika. Amin'ity tranga ity, ny fandrindrana fototra dia hampiasa fametahana static, mafy-kaody avy amin'ny NGINX.

Dingana 2 - Fanofanana NGINX

Ny ampahany voalohany nginx.conf dia mamaritra ny anatiny NGINX sasany mila amboarina.

Fifandraisana amin'ny mpiasa

Ny fanamafisam-peo etsy ambany dia mamaritra ny isan'ny fizotran'ny mpiasa sy ny fifandraisana. Izany dia manondro ny fomba hamaliana ny fangatahana NGINX.

worker_processes  2;

events {
  worker_connections   2000;
}

Ny Envoy Proxy dia mitantana ny workflows sy ny fifandraisana amin'ny fomba samihafa.

Ny Envoy dia mamorona kofehy mpiasa ho an'ny kofehy hardware tsirairay amin'ny rafitra. Ny kofehy mpiasa tsirairay dia manatanteraka famoriana hetsika tsy manakana izay tompon'andraikitra amin'izany

  1. Mihaino ny mpihaino tsirairay
  2. Manaiky fifandraisana vaovao
  3. Mamorona andiana sivana ho an'ny fifandraisana
  4. Ataovy ny asa I/O rehetra mandritra ny androm-piainan'ny fifandraisana.

Ny fanodinana fifandraisana hafa rehetra dia karakaraina tanteraka ao amin'ny kofehy mpiasa, ao anatin'izany ny fitondran-tena rehetra.

Ho an'ny kofehy mpiasa tsirairay ao amin'ny Envoy dia misy dobo fampifandraisana. Noho izany, ny dobo fifandraisana HTTP/2 dia mametraka fifandraisana iray isaky ny mpampiantrano ivelany amin'ny fotoana iray, raha misy kofehy mpiasa efatra dia misy fifandraisana HTTP/2 efatra isaky ny mpampiantrano ivelany ao amin'ny fanjakana stable. Amin'ny fitazonana ny zava-drehetra ao anaty kofehy mpiasa iray, saika ny code rehetra dia azo soratana tsy misy fanakanana, toy ny hoe kofehy tokana. Raha betsaka kokoa ny kofehy atolotra noho ny ilaina, dia mety hitarika ho amin'ny fitadidiana very maina izany, hamorona fifandraisana tsy miasa be dia be, ary hampihenana ny isan'ny fiverenan'ny fifandraisana amin'ny dobo.

Raha mila fanazavana fanampiny tsidiho bilaogy Envoy Proxy.

HTTP Configuration

Ity sakana fanamafisana NGINX manaraka ity dia mamaritra ny fanovana HTTP toy ny:

  • Karazana mime inona no tohana
  • Fotoana fiafaran'ny default
  • Gzip Configuration

Azonao atao ny manamboatra ireo lafiny ireo amin'ny alàlan'ny sivana ao amin'ny Envoy Proxy, izay horesahina any aoriana.

Dingana 3 - Configuration Server

Ao amin'ny bloc configuration HTTP, ny configuration NGINX dia mamaritra ny mihaino amin'ny port 8080 ary mamaly ny fangatahana miditra ho an'ny sehatra. one.example.com и www.one.example.com.

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

Ao anatin'ny Envoy dia fehezin'ny mpihaino izany.

Iraka mpihaino

Ny lafiny manan-danja indrindra amin'ny fanombohana amin'ny Envoy Proxy dia ny famaritana ny mpihaino anao. Mila mamorona rakitra fanamafisana ianao izay mamaritra ny fomba tianao hampandehanana ny ohatra Envoy.

Ny snippet etsy ambany dia hamorona mpihaino vaovao ary hamatotra azy amin'ny seranan-tsambo 8080. Ny fanamafisana dia milaza amin'ny Envoy Proxy izay seranana tokony hamatotra azy amin'ny fangatahana miditra.

Ny Envoy Proxy dia mampiasa fanamarihana YAML ho an'ny fanamboarana azy. Ho fampidirana an'ity fanamarihana ity dia jereo eto rohy.

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

Tsy mila mamaritra server_name, satria ny sivana Envoy Proxy no hiatrika izany.

Dingana 4 - Toerana Configuration

Rehefa misy fangatahana tonga ao amin'ny NGINX, ny sakana toerana dia mamaritra ny fomba fikarakarana sy ny toerana halehan'ny fifamoivoizana. Amin'ity sombiny manaraka ity, ny fifamoivoizana rehetra mankany amin'ny tranokala dia afindra any amin'ny tampony (fanamarihan'ny mpandika teny: lohamilina fampiharana matetika) targetCluster. Ny kluster ambony dia mamaritra ny nodes tokony hikarakara ny fangatahana. Hiresaka momba izany isika amin’ny dingana manaraka.

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

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

Ao amin'ny Envoy, ny Filters no manao izany.

Envoy Filters

Ho an'ny fanamafisana static, ny sivana dia mamaritra ny fomba hikarakarana ny fangatahana miditra. Amin'ity tranga ity dia mametraka sivana mifanentana server_name amin'ny dingana teo aloha. Rehefa tonga ny fangatahana miditra mifanandrify amin'ny sehatra sy lalana sasany, dia alefa any amin'ny cluster ny fifamoivoizana. Ity dia mitovy amin'ny konfigurasi NGINX ambany.

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

anarana envoy.http_connection_manager dia sivana namboarina ao amin'ny Envoy Proxy. Misy sivana hafa Redis, mongo, TCP. Azonao atao ny mahita ny lisitra feno ao amin'ny tahirin-kevitra.

Raha mila fanazavana fanampiny momba ny politikan'ny fampifandanjana entana hafa dia tsidiho Documentation iraka.

Dingana 5 - Fanamboarana proxy sy Upstream

Ao amin'ny NGINX, ny fanamafisana ambony dia mamaritra andiana mpizara kendrena izay handamina ny fifamoivoizana. Amin'ity tranga ity, cluster roa no nomena.

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

Ao amin'ny Envoy, clusters no mitantana izany.

Clusters iraka

Ny equivalent ambony dia faritana ho cluster. Amin'ity tranga ity dia efa fantatra ireo mpampiantrano izay hikarakara ny fifamoivoizana. Ny fomba hidirana amin'ny mpampiantrano, toy ny fotoana fiafaran'ny fotoana, dia faritana ho tefin'ny cluster. Izany dia ahafahan'ny fanaraha-maso misimisy kokoa amin'ny lafiny toy ny latency sy ny fifandanjana entana.

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

Rehefa mampiasa service discovery STRICT_DNS Ny Envoy dia hamaha tsy an-kijanona sy asynchronous ny tanjona DNS voafaritra. Ny adiresy IP naverina avy amin'ny valin'ny DNS dia ho raisina ho mpampiantrano mazava ao amin'ny cluster upstream. Midika izany fa raha misy fangatahana mamerina adiresy IP roa, dia hihevitra ny Envoy fa misy mpampiantrano roa ao amin'ny cluster, ary tsy maintsy mifandanja ny entana. Raha esorina amin'ny vokatra ny mpampiantrano iray, dia hihevitra ny Envoy fa tsy misy intsony izany ary hisintona fifamoivoizana avy amin'ireo dobo fifandraisana misy.

Raha mila fanazavana fanampiny dia jereo Antontan-taratasy proxy iraka.

Dingana 6 - Log Access sy Errors

Ny fanovana farany dia ny fisoratana anarana. Raha tokony hanosika ny diarin'ny hadisoana amin'ny kapila, ny Envoy Proxy dia maka fomba fiasa mifototra amin'ny rahona. Ny log application rehetra dia mivoaka amin'ny stdout и stderr.

Rehefa manao fangatahana ny mpampiasa, dia azo atao ny logiciel miditra ary tsy voasakana amin'ny alàlan'ny default. Mba ahafahana miditra amin'ny logs ho an'ny fangatahana HTTP, avelao ny tefy access_log ho an'ny mpitantana fifandraisana HTTP. Ny lalana dia mety ho fitaovana toy ny stdout, na rakitra amin'ny kapila, arakaraka ny zavatra takinao.

Ity tefy manaraka ity dia hamindra ny diarin'ny fidirana rehetra mankany stdout (fanamarihan'ny mpandika teny - stdout dia takiana amin'ny fampiasana iraka ao anaty docker. Raha ampiasaina tsy misy docker, dia soloy ny /dev/stdout amin'ny lalana mankany amin'ny rakitra log). Adikao any amin'ny faritra fanamafisam-peo ho an'ny mpitantana fifandraisana ny sombintsombiny:

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

Ny valiny dia tokony ho toy izao:

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

Amin'ny alàlan'ny default, manana tady endrika misy ny antsipirian'ny fangatahana HTTP ny Envoy:

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

Ny vokatr'ity tady format ity:

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

Ny votoatin'ny vokatra dia azo amboarina amin'ny fametrahana ny saha endrika. Ohatra:

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"

Ny tsipika log dia azo avoaka amin'ny endrika JSON amin'ny alàlan'ny fametrahana ny saha json_format. Ohatra:

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

Raha mila fanazavana fanampiny momba ny fomba fisoratana anarana Envoy, tsidiho

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

Tsy ny logging no hany fomba hahazoana fahalalana momba ny fiaraha-miasa amin'ny Envoy Proxy. Izy io dia manana fahaiza-manara-maso avo lenta sy metrika napetraka ao anatiny. Afaka mahita bebe kokoa ianao ao amin'ny tracing documentation na amin'ny alàlan'ny script tracing interactive.

Dingana 7 - Alefaso

Nafindranao avy any NGINX mankany amin'ny Envoy Proxy ny fandrindranao. Ny dingana farany dia ny fandefasana ohatra Envoy Proxy hizaha toetra azy.

Mihazakazaka toy ny mpampiasa

Eo an-tampon'ny tsipika fanamafisana NGINX mpampiasa www www; mamaritra ny fampandehanana ny NGINX ho mpampiasa ambany tombontsoa hanatsarana ny fiarovana.

Ny Envoy Proxy dia maka fomba fiasa mifototra amin'ny rahona amin'ny fitantanana izay tompon'ny dingana iray. Rehefa mihazakazaka Envoy Proxy amin'ny alalan'ny kaontenera iray isika, dia afaka mamaritra mpampiasa ambany tombontsoa.

Fanombohana ny Envoy Proxy

Ny baiko etsy ambany dia handefa Envoy Proxy amin'ny alàlan'ny container Docker amin'ny mpampiantrano. Ity baiko ity dia manome an'i Envoy ny fahafahana mihaino ny fangatahana miditra amin'ny seranan-tsambo 80. Na izany aza, araka ny voatondro ao amin'ny fanamafisana mpihaino, Envoy Proxy dia mihaino ny fifamoivoizana miditra amin'ny seranana 8080. Izany dia ahafahan'ny dingana mandeha amin'ny maha-mpampiasa ambany tombontsoa azy.

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

fitiliana

Miaraka amin'ny proxy mandeha dia azo atao sy karakaraina izao ny fitsapana. Ity baiko cURL manaraka ity dia mamoaka fangatahana miaraka amin'ny lohatenin'ny mpampiantrano voafaritra ao amin'ny fandrindrana proxy.

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

Ny fangatahana HTTP dia hiteraka hadisoana 503. Izany dia satria tsy mandeha ny fifandraisana ambony ary tsy misy. Noho izany, ny Envoy Proxy dia tsy manana toerana misy ny fangatahana. Ity baiko manaraka ity dia hanomboka andiana serivisy HTTP mifanandrify amin'ny fanitsiana voafaritra ho an'ny Envoy.

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

Miaraka amin'ireo tolotra misy, ny Envoy dia afaka mamadika ny fifamoivoizana mankany amin'ny toerana halehany.

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

Tokony hahita valiny ianao manondro hoe iza amin'ny Docker container no namatsy ny fangatahana. Ao amin'ny logs Envoy Proxy dia tokony ho hitanao ihany koa ny output string access.

Lohatenin'ny valinteny HTTP fanampiny

Hahita lohapejy HTTP fanampiny ianao ao amin'ny lohatenin'ny valin'ny fangatahana tena izy. Ny lohapejy dia mampiseho ny fotoana lanin'ny mpampiantrano ambony amin'ny fanodinana ny fangatahana. Aseho amin'ny milisegondra. Tena ilaina izany raha te hamaritra ny fotoanan'ny serivisy ny mpanjifa raha oharina amin'ny fahatarana amin'ny tambajotra.

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

Config farany

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 }

Fanampiny avy amin'ny mpandika teny

Ny torolalana amin'ny fametrahana Envoy Proxy dia azo jerena ao amin'ny tranokala https://www.getenvoy.io/

Amin'ny alàlan'ny default, rpm dia tsy manana config service systemd.

Ampio ny 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

Mila mamorona lahatahiry /etc/envoy/ ianao ary apetraho eo ny config.yaml config.

Misy resaka telegrama mampiasa proxy proxy: https://t.me/envoyproxy_ru

Ny Envoy Proxy dia tsy manohana ny fandefasana votoaty static. Noho izany, iza no afaka mifidy ny endri-javatra: https://github.com/envoyproxy/envoy/issues/378

Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana. HiditraPlease.

Namporisika anao hametraka sy hizaha toetra ny proxy iraka ve ity lahatsoratra ity?

  • Eny

  • tsy misy

Mpampiasa 75 no nifidy. Mpampiasa 18 no nifady.

Source: www.habr.com

Add a comment