Миграција са Нгинк-а на Енвои проки

Здраво, Хабр! Представљам вам превод поста: Миграција са Нгинк-а на Енвои проки.

Енвои је дистрибуирани проки сервер високих перформанси (написан у Ц++) дизајниран за појединачне услуге и апликације, такође је комуникациона магистрала и „универзална раван података“ дизајнирана за велике микросервисне „сервисне мреже“ архитектуре. Приликом његовог креирања узета су у обзир решења проблема који су настали током развоја сервера као што су НГИНКС, ХАПроки, хардверски балансери оптерећења и балансери оптерећења у облаку. Енвои ради уз сваку апликацију и апстрахује мрежу како би обезбедио заједничку функционалност без обзира на платформу. Када сав саобраћај услуга у инфраструктури тече кроз Енвои мрежу, постаје лако визуелизовати проблематична подручја са доследном видљивошћу, подесити укупне перформансе и додати основну функционалност на одређеној локацији.

Могућности

  • Архитектура ван процеса: енвои је самостални сервер високих перформанси који заузима малу количину РАМ-а. Ради у комбинацији са било којим језиком апликације или оквиром.
  • хттп/2 и грпц подршка: енвои има првокласну хттп/2 и грпц подршку за долазне и одлазне везе. Ово је транспарентни прокси од хттп/1.1 до хттп/2.
  • Напредно балансирање оптерећења: изасланик подржава напредне функције балансирања оптерећења укључујући аутоматске поновне покушаје, прекид ланца, глобално ограничење брзине, праћење захтева, балансирање оптерећења локалне зоне итд.
  • АПИ за управљање конфигурацијом: енвои пружа робустан АПИ за динамичко управљање вашом конфигурацијом.
  • Опсервабилност: Дубока уочљивост Л7 саобраћаја, изворна подршка за дистрибуирано праћење и уочљивост монгодб, динамодб и многих других апликација.

Корак 1 — Пример НГИНКС Цонфиг

Ова скрипта користи посебно направљену датотеку нгинк.цонф, на основу целог примера из НГИНКС Вики. Можете погледати конфигурацију у уређивачу отварањем нгинк.цонф

нгинк изворна конфигурација

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

НГИНКС конфигурације обично имају три кључна елемента:

  1. Конфигурисање НГИНКС сервера, структуре евиденције и Гзип функционалности. Ово је глобално дефинисано у свим случајевима.
  2. Конфигурисање НГИНКС-а да прихвата захтеве хосту оне.екампле.цом на порту 8080.
  3. Подешавање циљне локације, како управљати саобраћајем за различите делове УРЛ-а.

Неће се сва конфигурација применити на Енвои проки и не морате да конфигуришете нека подешавања. Прокси изасланик има четири кључна типа, који подржавају основну инфраструктуру коју нуди НГИНКС. језгро је:

  • Слушаоци: Они одређују како Енвои Проки прихвата долазне захтеве. Енвои Проки тренутно подржава само слушаоце засноване на ТЦП-у. Када је веза успостављена, она се прослеђује у скуп филтера за обраду.
  • Филтери: Они су део архитектуре цевовода која може да обрађује долазне и одлазне податке. Ова функционалност укључује филтере као што је Гзип, који компримује податке пре него што их пошаље клијенту.
  • Рутери: Они прослеђују саобраћај до траженог одредишта, дефинисаног као кластер.
  • Кластери: Они дефинишу крајњу тачку за саобраћај и конфигурационе параметре.

Користићемо ове четири компоненте да креирамо Енвои проки конфигурацију која одговара специфичној НГИНКС конфигурацији. Енвои-ов циљ је да ради са АПИ-јем и динамичком конфигурацијом. У овом случају, основна конфигурација ће користити статичке, тврдо кодиране поставке из НГИНКС-а.

Корак 2 - НГИНКС конфигурација

Први део нгинк.цонф дефинише неке НГИНКС интерне елементе које треба конфигурисати.

Воркер Цоннецтионс

Конфигурација у наставку одређује број радних процеса и веза. Ово указује на то како ће се НГИНКС скалирати да задовољи потражњу.

worker_processes  2;

events {
  worker_connections   2000;
}

Енвои Проки управља токовима посла и везама на различите начине.

Енвои креира радну нит за сваку хардверску нит у систему. Свака радна нит извршава неблокирајућу петљу догађаја за коју је одговорна

  1. Слушање сваког слушаоца
  2. Прихватање нових веза
  3. Креирање скупа филтера за везу
  4. Обради све И/О операције током животног века везе.

Сва даља обрада везе се у потпуности обрађује у радној нити, укључујући свако понашање прослеђивања.

За сваку радничку нит у Енвои-у постоји скуп веза. Дакле, ХТТП/2 скупови веза успостављају само једну везу по екстерном хосту у исто време, ако постоје четири радне нити, биће четири ХТТП/2 везе по спољном хосту у стабилном стању. Држањем свега у једној радној нити, скоро сав код се може написати без блокирања, као да је једнонитни. Ако се додељује више радничких нити него што је потребно, то може довести до губитка меморије, стварања великог броја неактивних веза и смањења броја враћања веза назад у скуп.

За више информација посетите Енвои Проки блог.

ХТТП конфигурација

Следећи блок НГИНКС конфигурације дефинише ХТТП подешавања као што су:

  • Који су мими типови подржани
  • Подразумевана временска ограничења
  • Гзип конфигурација

Ове аспекте можете прилагодити користећи филтере у Енвои проки-ју, о чему ћемо касније разговарати.

Корак 3 - Конфигурација сервера

У блоку ХТТП конфигурације, НГИНКС конфигурација наводи да слуша порт 8080 и одговара на долазне захтеве за домене оне.екампле.цом и ввв.оне.екампле.цом.

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

Унутар Енвои-а, контролишу га слушаоци.

Посланици слушаоци

Најважнији аспект почетка рада са Енвои проки-јем је дефинисање ваших слушалаца. Морате да креирате конфигурациону датотеку која описује како желите да покренете Енвои инстанцу.

Исечак испод ће креирати нови слушалац и повезати га са портом 8080. Конфигурација говори Енвои Проки-у за које портове треба да се повеже за долазне захтеве.

Енвои Проки користи ИАМЛ нотацију за своју конфигурацију. За увод у ову нотацију, погледајте овде линк.

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

Нема потребе да се дефинише сервер_наме, пошто ће филтери Енвои проки-а то решити.

Корак 4 - Конфигурација локације

Када захтев дође у НГИНКС, локацијски блок одређује како да се обради и где да се усмерава саобраћај. У следећем фрагменту, сав саобраћај на сајту се преноси у узводни (напомена преводиоца: упстреам је обично сервер апликација) кластер под називом таргетЦлустер. Узводни кластер дефинише чворове који треба да обрађују захтев. О томе ћемо разговарати у следећем кораку.

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

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

У Енвои-у, Филтерс то ради.

Филтери за посланике

За статичку конфигурацију, филтери одређују како се обрађују долазни захтеви. У овом случају постављамо филтере који се подударају сервер_наме у претходном кораку. Када стигну долазни захтеви који одговарају одређеним доменима и рутама, саобраћај се усмерава ка кластеру. Ово је еквивалент НГИНКС конфигурацији одоздо према горе.

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

име енвои.хттп_цоннецтион_манагер је уграђени филтер у Енвои проки. Остали филтери укључују Редис, монго, ТЦП. Комплетну листу можете пронаћи на документација.

За више информација о другим смерницама за балансирање оптерећења, посетите Документација изасланика.

Корак 5 – Конфигурација проксија и упстреам

У НГИНКС-у, конфигурација узвода дефинише скуп циљних сервера који ће обрадити саобраћај. У овом случају додељена су два кластера.

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

У Енвои-у, овим управљају кластери.

Енвои Цлустерс

Узводни еквивалент је дефинисан као кластери. У овом случају су идентификовани хостови који ће опслуживати саобраћај. Начин на који се приступа хостовима, као што су временска ограничења, дефинисан је као конфигурација кластера. Ово омогућава детаљнију контролу над аспектима као што су кашњење и балансирање оптерећења.

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

Када користите откривање услуге СТРИЦТ_ДНС Изасланик ће континуирано и асинхроно решавати наведене ДНС циљеве. Свака враћена ИП адреса из ДНС резултата ће се сматрати експлицитним хостом у узводном кластеру. То значи да ако захтев врати две ИП адресе, Енвои ће претпоставити да постоје два хоста у кластеру и оба морају да буду избалансирана. Ако се хост уклони из резултата, Енвои ће претпоставити да више не постоји и повући ће саобраћај из свих постојећих скупова веза.

Za više informacija pogledajte Документација о пуномоћју изасланика.

Корак 6 — Приступ евиденцији и грешке

Коначна конфигурација је регистрација. Уместо гурања евиденције грешака на диск, Енвои Проки користи приступ заснован на облаку. Сви записници апликације се излазе на стдоут и стдерр.

Када корисници поднесу захтев, евиденције приступа су опционе и онемогућене су подразумевано. Да бисте омогућили евиденцију приступа за ХТТП захтеве, омогућите конфигурацију аццесс_лог за менаџер ХТТП везе. Пут може бити или уређај као нпр стдоут, или датотеку на диску, у зависности од ваших захтева.

Следећа конфигурација ће преусмерити све евиденције приступа на стдоут (напомена преводиоца - стдоут је неопходан да би се користио изасланик унутар доцкер-а. Ако се користи без доцкер-а, замените /дев/стдоут путањом до обичне датотеке евиденције). Копирајте исечак у одељак за конфигурацију за менаџер везе:

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

Резултати би требали изгледати овако:

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

Подразумевано, Енвои има стринг формата који укључује детаље ХТТП захтева:

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

Резултат овог низа формата је:

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

Излазни садржај се може прилагодити постављањем поља за формат. На пример:

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"

Линија дневника се такође може извести у ЈСОН формату постављањем поља јсон_формат. На пример:

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

За више информација о методологији регистрације изасланика, посетите

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

Евидентирање није једини начин да се стекне увид у рад са Енвои проки-јем. Има напредне могућности праћења и метрике уграђене у њега. Више можете сазнати на трасирање документације или путем Интерактивна скрипта за праћење.

Корак 7 - Покрените

Сада сте мигрирали своју конфигурацију са НГИНКС на Енвои проки. Последњи корак је покретање Енвои проки инстанце да бисте је тестирали.

Покрени као корисник

На врху конфигурационе линије НГИНКС корисник ввв ввв; наводи да се НГИНКС покреће као корисник са ниским привилегијама ради побољшања безбедности.

Енвои Проки има приступ заснован на облаку за управљање ко је власник процеса. Када покренемо Енвои Проки кроз контејнер, можемо навести корисника са ниским привилегијама.

Покретање проксија Енвои

Наредба у наставку ће покренути Енвои Проки кроз Доцкер контејнер на хосту. Ова команда даје Енвои-у могућност да слуша долазне захтеве на порту 80. Међутим, као што је наведено у конфигурацији слушаоца, Енвои Проки ослушкује долазни саобраћај на порту 8080. Ово омогућава да се процес покрене као корисник са ниским привилегијама.

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

Тестирање

Када је прокси покренут, тестови сада могу да се праве и обрађују. Следећа команда цУРЛ издаје захтев са заглављем хоста дефинисаним у прокси конфигурацији.

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

ХТТП захтев ће довести до грешке 503. То је зато што узводне везе не раде и нису доступне. Због тога, Прокси посланика нема доступних одредишта за захтев. Следећа команда ће покренути низ ХТТП услуга које одговарају конфигурацији дефинисаној за Енвои.

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

Са доступним услугама, Енвои може успешно да прокси саобраћај до свог одредишта.

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

Требало би да видите одговор који показује који Доцкер контејнер је обрадио захтев. У евиденцијама проксија Енвои требало би да видите и излаз низа приступа.

Додатна заглавља ХТТП одговора

Видећете додатна ХТТП заглавља у заглављима одговора стварног захтева. Заглавље приказује време које је узводни хост провео обрађујући захтев. Изражено у милисекундама. Ово је корисно ако клијент жели да одреди време услуге у поређењу са кашњењем мреже.

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

Коначна конфигурација

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 }

Додатне информације од преводиоца

Упутства за инсталирање Енвои проки-ја могу се наћи на веб страници https://www.getenvoy.io/

Подразумевано, рпм нема системску конфигурацију услуге.

Додајте системд конфигурацију услуге /етц/системд/систем/енвои.сервице:

[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

Морате да креирате директоријум /етц/енвои/ и тамо поставите конфигурацију цонфиг.иамл.

Постоји телеграм ћаскање помоћу проксија изасланика: https://t.me/envoyproxy_ru

Енвои Проки не подржава приказивање статичког садржаја. Дакле, ко може да гласа за функцију: https://github.com/envoyproxy/envoy/issues/378

Само регистровани корисници могу учествовати у анкети. Пријавите се, Добродошао си.

Да ли вас је овај пост охрабрио да инсталирате и тестирате проки за посланика?

  • да

  • не

Гласало је 75 корисника. Уздржано је било 18 корисника.

Извор: ввв.хабр.цом

Додај коментар