Сайн уу, Хабр! Би та бүхэнд нийтлэлийн орчуулгыг хүргэж байна.
Envoy нь хувь хүний үйлчилгээ болон програмуудад зориулагдсан өндөр хүчин чадалтай хуваарилагдсан прокси сервер (C++ хэл дээр бичигдсэн) бөгөөд энэ нь мөн томоохон микро үйлчилгээний "үйлчилгээний тор" архитектурт зориулагдсан холбооны автобус ба "бүх нийтийн мэдээллийн хавтгай" юм. Үүнийг бүтээхдээ NGINX, HAProxy, техник хангамжийн ачаалал тэнцвэржүүлэгч, үүлэн ачааллын тэнцвэржүүлэгч гэх мэт серверүүдийг хөгжүүлэх явцад үүссэн асуудлуудын шийдлүүдийг харгалзан үзсэн. Элч программ бүртэй зэрэгцэн ажиллаж, платформоос үл хамааран нийтлэг функцээр хангахын тулд сүлжээг хийсвэрлэдэг. Дэд бүтцийн бүх үйлчилгээний урсгал Envoy сүлжээгээр урсах үед байнгын ажиглалтаар асуудалтай газруудыг дүрслэн харуулах, ерөнхий гүйцэтгэлийг тохируулах, тодорхой байршилд үндсэн функцийг нэмэхэд хялбар болно.
Онцлог
- Процессын гадуурх архитектур: элч нь бие даасан, бага хэмжээний RAM эзэлдэг өндөр хүчин чадалтай сервер юм. Энэ нь ямар ч програмын хэл эсвэл хүрээтэй хамт ажилладаг.
- http/2 болон grpc дэмжлэг: элч нь ирж буй болон гарах холболтын хувьд нэгдүгээр зэрэглэлийн http/2 болон grpc дэмжлэгтэй. Энэ нь http/1.1-ээс http/2 хүртэлх ил тод прокси юм.
- Нарийвчилсан ачааллыг тэнцвэржүүлэх: элч нь автоматаар дахин оролдох, гинжийг таслах, дэлхийн хурдыг хязгаарлах, хүсэлтийн сүүдэрлэх, орон нутгийн бүсийн ачааллыг тэнцвэржүүлэх гэх мэт ачааллыг тэнцвэржүүлэх дэвшилтэт функцуудыг дэмждэг.
- Тохиргооны удирдлагын API: элч нь таны тохиргоог динамикаар удирдах найдвартай 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 Proxy-д хамаарахгүй бөгөөд та зарим тохиргоог хийх шаардлагагүй. Төлөөлөгчийн төлөөлөгч дөрвөн үндсэн төрөл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 нь ажлын урсгал болон холболтыг янз бүрийн аргаар удирддаг.
Элч нь систем дэх техник хангамжийн хэлхээ бүрт ажилчны утас үүсгэдэг. Ажилчны утас бүр нь блоклохгүй үйл явдлын давталтыг гүйцэтгэдэг
- Сонсогч бүрийг сонсох
- Шинэ холболтыг хүлээн авах
- Холболтын шүүлтүүрийн багц үүсгэх
- Холболтын ашиглалтын хугацаанд бүх I/O үйлдлийг боловсруулна.
Цаашдын бүх холболтын боловсруулалтыг бүхэлд нь ажилчны хэлхээнд, түүний дотор дамжуулалтын үйлдлийг гүйцэтгэдэг.
Envoy дахь ажилчны утас бүрийн хувьд холболтын сан байдаг. Тиймээс HTTP/2 холболтын сан нь гадаад хост бүрт нэг удаад зөвхөн нэг холболт үүсгэдэг бөгөөд хэрэв дөрвөн ажилчин хэлхээтэй бол гадаад хост бүрт дөрвөн HTTP/2 холболт тогтвортой төлөвт байх болно. Бүх зүйлийг нэг ажилчны хэлхээнд хадгалснаар бараг бүх кодыг блоклохгүйгээр нэг урсгалтай мэт бичиж болно. Хэрэв шаардлагатай хэмжээнээс илүү олон ажилчны утас хуваарилагдсан бол энэ нь санах ойг дэмий үрж, олон тооны сул холболт үүсгэж, холболтыг усан сан руу буцаах тоог багасгахад хүргэдэг.
Для получения дополнительной мэдээлэл пасетите
HTTP тохиргоо
Дараах NGINX тохиргооны блок нь HTTP тохиргоог тодорхойлдог, тухайлбал:
- Ямар төрлийн MIME дэмждэг вэ
- Өгөгдмөл хугацаа
- 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 }
Тодорхойлох шаардлагагүй серверийн нэр, учир нь 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 дээр Filters үүнийг хийдэг.
Төлөөлөгчийн шүүлтүүр
Статик тохиргооны хувьд шүүлтүүр нь ирж буй хүсэлтийг хэрхэн боловсруулахыг тодорхойлдог. Энэ тохиолдолд бид тохирох шүүлтүүрийг тохируулна серверийн нэрс өмнөх алхамд. Зарим домэйн болон маршруттай таарч байгаа хүсэлтүүд ирэхэд урсгалыг кластер руу чиглүүлдэг. Энэ нь 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
нэр элч.http_холболтын_менежер нь Envoy Proxy-д суурилуулсан шүүлтүүр юм. Бусад шүүлтүүрүүд орно Redis, 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 хаягийг буцаавал Элч нь кластерт хоёр хост байгаа бөгөөд хоёулаа ачааллын тэнцвэртэй байх ёстой гэсэн үг юм. Хэрэв хостыг үр дүнгээс хасвал Элч түүнийг байхгүй гэж үзэж, одоо байгаа холболтын сангаас траффик татах болно.
Для получения дополнительной мэдээлэл. См.
Алхам 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