Nginx-тен Envoy Proxy-ге көшу

Сәлем, Хабр! Назарларыңызға посттың аудармасын ұсынамын: Nginx-тен Envoy Proxy-ге көшу.

Envoy - жеке қызметтер мен қолданбаларға арналған жоғары өнімді таратылған прокси сервер (C++ тілінде жазылған), ол сонымен қатар үлкен микросервис «қызмет торы» архитектурасына арналған байланыс шинасы және «әмбебап деректер жазықтығы». Оны құру кезінде NGINX, HAProxy, аппараттық жүктемені теңестірушілер және бұлттық жүктемені теңестірушілер сияқты серверлерді әзірлеу кезінде туындаған мәселелердің шешімдері ескерілді. Envoy әр қолданбамен қатар жұмыс істейді және платформаға қарамастан ортақ функционалдылықты қамтамасыз ету үшін желіні қысқартады. Инфрақұрылымдағы барлық қызмет трафигі Envoy торы арқылы ағып жатқанда, тұрақты бақылау мүмкіндігі бар проблемалық аймақтарды визуализациялау, жалпы өнімділікті реттеу және белгілі бір орынға негізгі функцияларды қосу оңай болады.

Ерекшеліктері

  • Процесстен тыс архитектура: envoy – бұл жедел жадтың аз мөлшерін алатын дербес, өнімділігі жоғары сервер. Ол кез келген қолданба тілімен немесе фреймворкпен бірге жұмыс істейді.
  • http/2 және grpc қолдауы: өкілде кіріс және шығыс қосылымдар үшін бірінші дәрежелі http/2 және grpc қолдауы бар. Бұл http/1.1 және http/2 аралығындағы мөлдір прокси.
  • Жетілдірілген жүктемені теңестіру: өкіл автоматты қайталау, тізбекті үзу, жаһандық жылдамдықты шектеу, сұрауды көлеңкелеу, жергілікті аймақтық жүктемені теңестіру және т.б. қоса, қосымша жүктеме теңестіру мүмкіндіктерін қолдайды.
  • Configuration Management API: envoy конфигурацияңызды динамикалық басқару үшін сенімді API ұсынады.
  • Бақылау мүмкіндігі: L7 трафигінің терең бақылануы, бөлінген трафикті жергілікті қолдау және mongodb, dynamodb және басқа да көптеген қосымшаларды бақылау.

1-қадам — NGINX конфигурациясының мысалы

Бұл сценарий арнайы жасалған файлды пайдаланады nginx.conf, толық мысалға негізделген NGINX Wiki. Редактордағы конфигурацияны ашу арқылы көруге болады nginx.conf

nginx көзі конфигурациясы

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

NGINX конфигурацияларында әдетте үш негізгі элемент бар:

  1. NGINX серверін, журнал құрылымын және Gzip функционалдығын теңшеу. Бұл барлық жағдайларда жаһандық деңгейде анықталады.
  2. Хостқа сұрауларды қабылдау үшін NGINX конфигурациялануда one.example.com 8080 портында.
  3. Мақсатты орынды орнату, URL мекенжайының әртүрлі бөліктері үшін трафикті өңдеу әдісі.

Барлық конфигурациялар Envoy проксиге қолданылмайды және кейбір параметрлерді конфигурациялаудың қажеті жоқ. Өкіл прокси бар төрт негізгі түріNGINX ұсынатын негізгі инфрақұрылымды қолдайтын . Негізгі болып табылады:

  • Тыңдаушылар: Олар Envoy Proxy кіріс сұрауларды қалай қабылдайтынын анықтайды. Envoy Proxy қазіргі уақытта тек TCP негізіндегі тыңдаушыларды қолдайды. Байланыс орнатылғаннан кейін ол өңдеу үшін сүзгілер жинағына беріледі.
  • Сүзгілер: Олар кіріс және шығыс деректерді өңдей алатын конвейер архитектурасының бөлігі болып табылады. Бұл функция деректерді клиентке жібермес бұрын қысатын Gzip сияқты сүзгілерді қамтиды.
  • Маршрутизаторлар: Олар трафикті кластер ретінде анықталған қажетті мақсатқа бағыттайды.
  • Кластерлер: Олар трафик пен конфигурация параметрлерінің соңғы нүктесін анықтайды.

Арнайы NGINX конфигурациясына сәйкес келетін Envoy Proxy конфигурациясын жасау үшін осы төрт құрамды пайдаланамыз. Өкілдің мақсаты - API интерфейстерімен және динамикалық конфигурациямен жұмыс істеу. Бұл жағдайда негізгі конфигурация NGINX статикалық, қатты кодталған параметрлерді пайдаланады.

2-қадам – NGINX конфигурациясы

Бірінші бөлім nginx.conf конфигурациялануы қажет кейбір NGINX ішкі бөліктерін анықтайды.

Жұмысшы қосылымдары

Төмендегі конфигурация жұмысшы процестері мен қосылымдарының санын анықтайды. Бұл NGINX сұранысты қанағаттандыру үшін қалай масштабталатынын көрсетеді.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy жұмыс процестері мен қосылымдарды әртүрлі жолдармен басқарады.

Envoy жүйедегі әрбір аппараттық ағын үшін жұмысшы ағынын жасайды. Әрбір жұмысшы ағыны жауап беретін блокталмаған оқиғалар циклін орындайды

  1. Әр тыңдаушыны тыңдау
  2. Жаңа байланыстарды қабылдау
  3. Қосылым үшін сүзгілер жинағын жасау
  4. Қосылымның қызмет ету мерзімі ішінде барлық енгізу/шығару операцияларын өңдеңіз.

Барлық келесі қосылымды өңдеу толығымен жұмысшы ағынында өңделеді, соның ішінде кез келген қайта жіберу әрекеті.

Envoy ішіндегі әрбір жұмысшы ағыны үшін қосылым пулы бар. Осылайша, HTTP/2 қосылым пулдары бір уақытта сыртқы хостқа бір ғана қосылым орнатады, егер төрт жұмыс ағыны болса, тұрақты күйдегі сыртқы хост үшін төрт HTTP/2 қосылымы болады. Барлығын бір жұмысшы ағынында сақтау арқылы барлық дерлік кодты блоктаусыз жазуға болады, ол жалғыз ағын сияқты. Қажеттіден көбірек жұмысшы ағындары бөлінсе, бұл бос орын алған жадқа, бос қосылымдардың көп санын жасауға және қосылымдарды пулға қайтару санын азайтуға әкелуі мүмкін.

Қосымша ақпарат алу үшін кіріңіз Envoy Proxy блогы.

HTTP конфигурациясы

Келесі NGINX конфигурация блогы HTTP параметрлерін анықтайды, мысалы:

  • Қандай мим түрлеріне қолдау көрсетіледі
  • Әдепкі күту уақыттары
  • Gzip конфигурациясы

Бұл аспектілерді кейінірек талқылайтын Envoy Proxy ішіндегі сүзгілер арқылы теңшеуге болады.

3-қадам – Сервер конфигурациясы

HTTP конфигурация блогында NGINX конфигурациясы 8080 портында тыңдауды және домендерге арналған кіріс сұрауларына жауап беруді көрсетеді. one.example.com и www.one.example.com.

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

Inside Envoy оны тыңдаушылар басқарады.

Өкіл тыңдаушылар

Envoy Proxy қызметін бастаудың ең маңызды аспектісі тыңдаушыларыңызды анықтау болып табылады. Envoy данасын қалай іске қосқыңыз келетінін сипаттайтын конфигурация файлын жасау керек.

Төмендегі үзінді жаңа тыңдаушыны жасайды және оны 8080 портына байланыстырады. Конфигурация Envoy Proxy-ге кіріс сұраулары үшін қай порттармен байланыстыру керектігін айтады.

Envoy Proxy конфигурациясы үшін YAML нотациясын пайдаланады. Бұл белгіге кіріспе үшін мына жерден қараңыз сілтеме.

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

Анықтаудың қажеті жоқ server_name, өйткені Envoy Proxy сүзгілері мұны өңдейді.

4-қадам – Орын конфигурациясы

Сұраныс NGINX жүйесіне түскенде, орналасу блогы трафикті өңдеу және қайда бағыттау керектігін анықтайды. Келесі фрагментте сайттың барлық трафигі аталған жоғары ағын (аудармашының ескертпесі: жоғары ағын әдетте қолданба сервері) кластеріне тасымалданады. мақсатты кластер. Жоғары ағын кластері сұрауды өңдеу керек түйіндерді анықтайды. Бұл туралы келесі қадамда талқылаймыз.

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

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

Envoy қолданбасында Сүзгілер мұны жасайды.

Өкіл сүзгілері

Статикалық конфигурация үшін сүзгілер кіріс сұрауларды өңдеу жолын анықтайды. Бұл жағдайда сәйкес келетін сүзгілерді орнатамыз сервер_аттары алдыңғы қадамда. Белгілі бір домендер мен маршруттарға сәйкес келетін кіріс сұраулар келгенде, трафик кластерге бағытталады. Бұл NGINX төменнен жоғары конфигурациясының баламасы.

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

Аты envoy.http_connection_manager Envoy Proxy ішіндегі кірістірілген сүзгі болып табылады. Басқа сүзгілерге кіреді Редис, Mongo, TCP. Толық тізімді мына жерден таба аласыз құжаттама.

Басқа жүктемені теңестіру саясаттары туралы қосымша ақпарат алу үшін мына сайтқа кіріңіз Өкілдік құжаттама.

5-қадам - ​​Прокси және жоғары ағынды конфигурациялау

NGINX жүйесінде жоғары ағынды конфигурация трафикті өңдейтін мақсатты серверлер жинағын анықтайды. Бұл жағдайда екі кластер тағайындалды.

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

Envoy бағдарламасында бұл кластерлер арқылы басқарылады.

Елші кластерлері

Жоғары ағындық эквивалент кластерлер ретінде анықталады. Бұл жағдайда трафикке қызмет көрсететін хосттар анықталды. Күту уақыттары сияқты хосттарға қатынасу жолы кластер конфигурациясы ретінде анықталады. Бұл кешігу және жүктемені теңестіру сияқты аспектілерді егжей-тегжейлі бақылауға мүмкіндік береді.

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

Қызмет табуды пайдаланған кезде STRICT_DNS Өкіл көрсетілген DNS мақсаттарын үздіксіз және асинхронды түрде шешеді. DNS нәтижесінен қайтарылған әрбір IP мекенжайы жоғарғы кластердегі айқын хост ретінде қарастырылады. Бұл дегеніміз, егер сұрау екі IP мекенжайын қайтарса, өкіл кластерде екі хост бар деп есептейді және екеуі де жүктеме теңдестірілуі керек. Егер хост нәтижеден жойылса, Envoy оны енді жоқ деп есептейді және кез келген бар қосылым пулдарынан трафикті тартады.

Қосымша ақпарат алу үшін қараңыз Өкілдің прокси құжаттамасы.

6-қадам — Журналға кіру және қателер

Соңғы конфигурация - тіркеу. Қате журналдарын дискіге жіберудің орнына, Envoy Proxy бұлтқа негізделген тәсілді қолданады. Барлық қолданба журналдары келесіге шығарылады stdout и stderr.

Пайдаланушылар сұрау жасағанда, кіру журналдары міндетті емес және әдепкі бойынша ажыратылады. HTTP сұраулары үшін кіру журналдарын қосу үшін конфигурацияны қосыңыз кіру_журналы HTTP қосылым менеджері үшін. Жол сияқты құрылғы болуы мүмкін stdout, немесе дискідегі файл, талаптарыңызға байланысты.

Келесі конфигурация барлық кіру журналдарын қайта бағыттайды stdout (аудармашының ескертпесі – stdout докер ішіндегі өкілді пайдалану үшін қажет. Егер докерсіз пайдаланылса, /dev/stdout файлын кәдімгі журнал файлының жолымен ауыстырыңыз). Үзіндіні қосылым менеджерінің конфигурация бөліміне көшіріңіз:

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:

Әдепкі бойынша, Envoy бағдарламасында HTTP сұрауының мәліметтерін қамтитын пішім жолы бар:

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

Журнал жолын өрісті орнату арқылы JSON пішімінде де шығаруға болады json_пішімі. Мысалы:

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

Тіркеу Envoy Proxy бағдарламасымен жұмыс істеу туралы түсінік алудың жалғыз жолы емес. Оның кеңейтілген бақылау және метрика мүмкіндіктері бар. Толығырақ мына жерден біле аласыз бақылау құжаттамасы немесе арқылы Интерактивті бақылау сценарийі.

7-қадам - ​​Іске қосу

Сіз конфигурацияңызды NGINX-тен Envoy Proxy-ге көшірдіңіз. Соңғы қадам оны тексеру үшін Envoy Proxy данасын іске қосу болып табылады.

Пайдаланушы ретінде іске қосыңыз

NGINX конфигурация жолының жоғарғы жағында пайдаланушы www www; қауіпсіздікті жақсарту үшін NGINX мүмкіндігі төмен пайдаланушы ретінде іске қосуды көрсетеді.

Envoy Proxy процесс кімге тиесілі екенін басқару үшін бұлтқа негізделген тәсілді қолданады. Envoy Proxy серверін контейнер арқылы іске қосқан кезде біз артықшылығы төмен пайдаланушыны көрсете аламыз.

Envoy Proxy іске қосылуда

Төмендегі пәрмен Envoy Proxy серверін хосттағы Docker контейнері арқылы іске қосады. Бұл пәрмен Envoy бағдарламасына 80 портындағы кіріс сұрауларды тыңдау мүмкіндігін береді. Дегенмен, тыңдаушы конфигурациясында көрсетілгендей, Envoy Proxy 8080 портындағы кіріс трафикті тыңдайды. Бұл процесті артықшылығы төмен пайдаланушы ретінде іске қосуға мүмкіндік береді.

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

Тестілеу

Прокси іске қосылған кезде сынақтарды енді жасауға және өңдеуге болады. Келесі cURL пәрмені прокси конфигурациясында анықталған хост тақырыбымен сұрау шығарады.

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

HTTP сұрауы қатеге әкеледі 503. Себебі жоғары ағын қосылымдары жұмыс істемейді және қол жетімді емес. Сондықтан, Envoy Proxy серверінде сұрау үшін қолжетімді бағыттар жоқ. Келесі пәрмен Envoy үшін анықталған конфигурацияға сәйкес HTTP қызметтерінің сериясын бастайды.

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

Қол жетімді қызметтермен Envoy трафикті тағайындалған жерге сәтті прокси арқылы жібере алады.

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

Қай Docker контейнері сұрауды өңдегенін көрсететін жауапты көруіңіз керек. Envoy Proxy журналдарында сіз сондай-ақ кіру жолының шығысын көруіңіз керек.

Қосымша HTTP жауап тақырыптары

Нақты сұраудың жауап тақырыптарында қосымша HTTP тақырыптарын көресіз. Тақырып жоғары ағын хостының сұрауды өңдеуге жұмсаған уақытын көрсетеді. Миллисекундпен көрсетілген. Бұл клиент желілік кідіріспен салыстырғанда қызмет көрсету уақытын анықтағысы келсе пайдалы.

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 }

Аудармашыдан қосымша ақпарат

Envoy Proxy орнату нұсқауларын веб-сайттан табуға болады https://www.getenvoy.io/

Әдепкі бойынша, rpm жүйесінде жүйелік қызмет конфигурациясы жоқ.

Systemd қызмет конфигурациясын қосыңыз /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

Сізге /etc/envoy/ каталогын жасап, config.yaml конфигурациясын сол жерге қою керек.

Өкіл прокси арқылы телеграмма чаты бар: https://t.me/envoyproxy_ru

Envoy Proxy статикалық мазмұнға қызмет көрсетуді қолдамайды. Сондықтан, мүмкіндікке кім дауыс бере алады: https://github.com/envoyproxy/envoy/issues/378

Сауалнамаға тек тіркелген пайдаланушылар қатыса алады. Кіру, өтінемін.

Бұл пост сізге өкіл проксиді орнатуға және сынауға шақырды ма?

  • иә

  • жоқ

75 пайдаланушы дауыс берді. 18 пайдаланушы қалыс қалды.

Ақпарат көзі: www.habr.com

пікір қалдыру