Сәлем, Хабр! Назарларыңызға посттың аудармасын ұсынамын:
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 көзі конфигурациясы
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 конфигурацияларында әдетте үш негізгі элемент бар:
- NGINX серверін, журнал құрылымын және Gzip функционалдығын теңшеу. Бұл барлық жағдайларда жаһандық деңгейде анықталады.
- Хостқа сұрауларды қабылдау үшін NGINX конфигурациялануда one.example.com 8080 портында.
- Мақсатты орынды орнату, 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 жүйедегі әрбір аппараттық ағын үшін жұмысшы ағынын жасайды. Әрбір жұмысшы ағыны жауап беретін блокталмаған оқиғалар циклін орындайды
- Әр тыңдаушыны тыңдау
- Жаңа байланыстарды қабылдау
- Қосылым үшін сүзгілер жинағын жасау
- Қосылымның қызмет ету мерзімі ішінде барлық енгізу/шығару операцияларын өңдеңіз.
Барлық келесі қосылымды өңдеу толығымен жұмысшы ағынында өңделеді, соның ішінде кез келген қайта жіберу әрекеті.
Envoy ішіндегі әрбір жұмысшы ағыны үшін қосылым пулы бар. Осылайша, HTTP/2 қосылым пулдары бір уақытта сыртқы хостқа бір ғана қосылым орнатады, егер төрт жұмыс ағыны болса, тұрақты күйдегі сыртқы хост үшін төрт HTTP/2 қосылымы болады. Барлығын бір жұмысшы ағынында сақтау арқылы барлық дерлік кодты блоктаусыз жазуға болады, ол жалғыз ағын сияқты. Қажеттіден көбірек жұмысшы ағындары бөлінсе, бұл бос орын алған жадқа, бос қосылымдардың көп санын жасауға және қосылымдарды пулға қайтару санын азайтуға әкелуі мүмкін.
Қосымша ақпарат алу үшін кіріңіз
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)%"}
Өкілді тіркеу әдістемесі туралы қосымша ақпарат алу үшін мына сайтқа кіріңіз
Тіркеу 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 орнату нұсқауларын веб-сайттан табуға болады
Әдепкі бойынша, 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 конфигурациясын сол жерге қою керек.
Өкіл прокси арқылы телеграмма чаты бар:
Envoy Proxy статикалық мазмұнға қызмет көрсетуді қолдамайды. Сондықтан, мүмкіндікке кім дауыс бере алады:
Сауалнамаға тек тіркелген пайдаланушылар қатыса алады.
Бұл пост сізге өкіл проксиді орнатуға және сынауға шақырды ма?
-
иә
-
жоқ
75 пайдаланушы дауыс берді. 18 пайдаланушы қалыс қалды.
Ақпарат көзі: www.habr.com