Aloha, Habr! Ke lawe nei au i kou noonoo i ka unuhi o ka pou:
ʻO Envoy kahi kikowaena hoʻolaha hoʻolaha kiʻekiʻe (i kākau ʻia ma C ++) i hoʻolālā ʻia no nā lawelawe pilikino a me nā noi, ʻo ia hoʻi kahi kaʻa kamaʻilio a me ka "universal data plane" i hoʻolālā ʻia no ka microservice nui "service mesh" architectures. I ka hoʻokumu ʻana iā ia, ua noʻonoʻo ʻia nā hoʻonā i nā pilikia i kū mai i ka wā o ka hoʻomohala ʻana o nā kikowaena e like me NGINX, HAProxy, nā mea hoʻokele ukana a me nā mea kaulike o ke ao. Hana pū ʻo Envoy me kēlā me kēia noi a hoʻokaʻawale i ka pūnaewele e hāʻawi i nā hana maʻamau me ka nānā ʻole i ke kahua. Ke holo nei nā lawelawe lawelawe a pau i loko o ka Envoy mesh, lilo ia i mea maʻalahi ke ʻike i nā wahi pilikia me ka nānā mau ʻana, hoʻokani i ka hana holoʻokoʻa, a hoʻohui i nā hana koʻikoʻi ma kahi kikoʻī.
Nā Kūlana
- ʻO ka hoʻolālā o waho: ʻo ka ʻelele kahi kikowaena hana kiʻekiʻe e lawe i kahi liʻiliʻi o ka RAM. Hana pū ia me kekahi ʻōlelo noiʻi a i ʻole ka hoʻolālā.
- Kākoʻo http/2 a me grpc: loaʻa i ka ʻelele ka papa mua http/2 a me ke kākoʻo grpc no nā pilina komo a puka i waho. ʻO kēia kahi mea hoʻololi akaka mai http/1.1 a i http/2.
- Advanced Load Balancing: Kākoʻo ka ʻelele i nā hiʻohiʻona hoʻohālikelike ukana holomua e pili ana i ka hoʻihoʻi hou ʻana, ka haki ʻana i ke kaulahao, ka palena palena honua, ke noi ʻana i ke aniani, ke kaupaona ʻana o ka ukana kūloko, etc.
- Configuration Management API: Hāʻawi ka ʻelele i kahi API ikaika no ka hoʻokele ikaika ʻana i kāu hoʻonohonoho.
- ʻIke ʻia: ʻike hohonu o ka holo ʻana o L7, kākoʻo maoli no ka hoʻolaha ʻana a me ka nānā ʻana o mongodb, dynamodb a me nā noi ʻē aʻe he nui.
KaʻAnuʻu 1 - Hoʻohālike NGINX Config
Hoʻohana kēia palapala i kahi faila i hana ʻia nginx.conf, ma muli o ka laʻana piha mai
nginx kumu 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;
}
}
}
ʻEkolu mau mea koʻikoʻi nā hoʻonohonoho NGINX:
- Ke hoʻonohonoho nei i ka server NGINX, ka hoʻolālā log a me ka hana Gzip. Ua wehewehe ʻia kēia ma ke ao holoʻokoʻa i nā hihia āpau.
- Ka hoʻonohonoho ʻana iā NGINX e ʻae i nā noi i ka mea hoʻokipa one.example.com ma ke awa 8080.
- Hoʻonohonoho i ka wahi i manaʻo ʻia, pehea e mālama ai i nā kaʻa no nā ʻāpana like ʻole o ka URL.
ʻAʻole pili nā hoʻonohonoho āpau iā Envoy Proxy, a ʻaʻole pono ʻoe e hoʻonohonoho i kekahi mau hoʻonohonoho. Ua loaʻa iā Envoy Proxy ʻehā ʻano kī, e kākoʻo ana i ka ʻōnaehana kumu i hāʻawi ʻia e NGINX. ʻO ke kumu:
- Nā mea hoʻolohe: Hoʻoholo lākou pehea e ʻae ai ʻo Envoy Proxy i nā noi komo. Kākoʻo ʻo Envoy Proxy i kēia manawa i nā mea hoʻolohe ma ka TCP. Ke hoʻokumuʻia kahi pilina, e hāʻawiʻia i kahi hui o nā kānana no ka hana.
- Nā kānana: He ʻāpana lākou o ka hoʻolālā pipeline e hiki ke hoʻoponopono i ka ʻikepili komo a i waho. Aia kēia hana i nā kānana e like me Gzip, ka mea e hoʻopaʻa i ka ʻikepili ma mua o ka hoʻouna ʻana i ka mea kūʻai.
- Nā Alaula: Hoʻouna lākou i ke kaʻa i ka wahi i makemake ʻia, i wehewehe ʻia he pūʻulu.
- Huina: Ho'ākāka lākou i ka hopena no nā kaʻa a me nā ʻāpana hoʻonohonoho.
E hoʻohana mākou i kēia mau ʻāpana ʻehā e hana i kahi hoʻonohonoho Envoy Proxy e hoʻohālikelike i kahi hoʻonohonoho NGINX kikoʻī. ʻO ka pahuhopu o Envoy e hana pū me nā API a me ka hoʻonohonoho hoʻoikaika. I kēia hihia, e hoʻohana ka hoʻonohonoho kumu i nā hoʻonohonoho static, paʻakikī paʻakikī mai NGINX.
KaʻAnuʻu 2 - NGINX Configuration
Mahele mua nginx.conf wehewehe i kekahi NGINX internals pono e hoʻonohonoho ʻia.
Nā Pili Hana Hana
Hoʻoholo ka hoʻonohonoho ma lalo nei i ka helu o nā kaʻina hana a me nā pilina. Hōʻike kēia i ka nui o ka NGINX e hoʻokō i ka noi.
worker_processes 2;
events {
worker_connections 2000;
}
Mālama ʻo Envoy Proxy i nā kahe hana a me nā pilina ma nā ʻano like ʻole.
Hoʻokumu ʻo Envoy i kahi kaula hana no kēlā me kēia lola lako i loko o ka ʻōnaehana. Hoʻokō kēlā me kēia pae paʻahana i kahi loop hanana hoʻopaʻa ʻole nona ke kuleana
- Hoʻolohe i kēlā me kēia mea hoʻolohe
- E ʻae ana i nā pilina hou
- Ke hana ʻana i nā kānana no kahi pilina
- E hana i nā hana I/O a pau i ke ola o ka pilina.
Hoʻopili piha ʻia nā hana pili ʻē aʻe a pau ma ka pae hana, me kekahi ʻano hana hoʻouna.
No kēlā me kēia pae hana ma Envoy, aia kahi pūnāwai pili. No laila, hoʻokumu wale nā punawai pili HTTP/2 i hoʻokahi pilina no kēlā me kēia pūʻali o waho i ka manawa, inā ʻehā mau kaula hana, aia ʻehā mau pilina HTTP/2 no kēlā me kēia host waho i kahi kūlana paʻa. Ma ka mālama ʻana i nā mea a pau i loko o ka pae hana hoʻokahi, aneane hiki ke kākau ʻia nā code āpau me ka ʻole o ka pale ʻana, me he mea lā he kaula hoʻokahi. Inā hoʻokaʻawale ʻia nā kaula limahana ma mua o ka mea e pono ai, hiki i kēia ke alakaʻi i ka hoʻomanaʻo ʻana, hana i ka nui o nā pili palaualelo, a hoʻemi i ka nui o nā manawa e hoʻihoʻi ʻia ai nā pilina i ka loko.
No ka 'ike hou aku e kipa
Hoʻonohonoho HTTP
ʻO ka poloka hoʻonohonoho NGINX e wehewehe nei i nā hoʻonohonoho HTTP e like me:
- He aha nā ʻano mime i kākoʻo ʻia
- Manawa manawa paʻamau
- Hoʻonohonoho Gzip
Hiki iā ʻoe ke hana i kēia mau ʻano me ka hoʻohana ʻana i nā kānana ma Envoy Proxy, a mākou e kūkākūkā ai ma hope.
KaʻAnuʻu 3 - Hoʻonohonoho kikowaena
Ma ka poloka hoʻonohonoho HTTP, kuhikuhi ka hoʻonohonoho NGINX e hoʻolohe ma ke awa 8080 a pane i nā noi komo no nā kāʻei kua. one.example.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
I loko o Envoy, ua hoʻomaluʻia e nā Listeners.
ʻElele hoʻolohe
ʻO ka mea nui loa o ka hoʻomaka ʻana me Envoy Proxy ʻo ka wehewehe ʻana i kāu poʻe hoʻolohe. Pono ʻoe e hana i kahi faila hoʻonohonoho e wehewehe ana i ke ʻano āu e makemake ai e holo i ka Envoy instance.
Na ka snippet ma lalo nei e hana i kahi mea hoʻolohe hou a hoʻopaʻa iā ia i ke awa 8080. Hōʻike ka hoʻonohonoho iā Envoy Proxy i nā awa e pono ai ke hoʻopaʻa ʻia no nā noi komo.
Hoʻohana ʻo Envoy Proxy i ka YAML notation no kāna hoʻonohonoho. No ka hoʻolauna ʻana i kēia notation, e nānā maanei
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
ʻAʻole pono e wehewehe server_name, ʻoiai nā kānana Envoy Proxy e mālama i kēia.
KaʻAnuʻu 4 - Hoʻonohonoho wahi
Ke hele mai kahi noi i NGINX, hoʻoholo ka poloka wahi i ka hana a me kahi e hele ai i ke kaʻa. Ma ka ʻāpana aʻe, hoʻoili ʻia nā kaʻa a pau i ka pūnaewele i kahi upstream (ka unuhi ʻōlelo: ʻo ka upstream ka mea maʻamau he kikowaena noi) hui i kapa ʻia. targetCluster. ʻO ka puʻupuʻu upstream ka wehewehe ʻana i nā nodes pono e hoʻokō i ka noi. E kūkākūkā mākou i kēia ma ka pae aʻe.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Ma Envoy, hana nā kānana i kēia.
Nā kānana ʻelele
No ka hoʻonohonoho paʻa, hoʻoholo nā kānana i ka hana ʻana i nā noi e hiki mai ana. I kēia hihia, hoʻonoho mākou i nā kānana i kūpono server_name i ka hana mua. Ke hōʻea mai nā noi e pili ana i kekahi mau kāʻei kapu a me nā alahele, hele ʻia ke kaʻa i ka hui. ʻO kēia ka mea like me kahi hoʻonohonoho NGINX i lalo.
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
inoa ʻelele.http_connection_manager he kānana i kūkulu ʻia ma Envoy Proxy. Loaʻa nā kānana ʻē aʻe Ho'ōla, Mongo, TCP. Hiki iā ʻoe ke loaʻa ka papa inoa piha ma
No ka ʻike hou aku e pili ana i nā kulekele hoʻoili ukana ʻē aʻe, e kipa
KaʻAnuʻu Hana 5 - Proxy a me Upstream Configuration
Ma NGINX, ho'ākāka ka hoʻonohonoho ʻana i luna i kahi hoʻonohonoho o nā kikowaena kikoʻī e hoʻoponopono i nā kaʻa. I kēia hihia, ua hoʻokaʻawale ʻia nā hui ʻelua.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Ma Envoy, mālama ʻia kēia e nā pūʻulu.
Hui Elele
Ua wehewehe ʻia ka mea like i luna ma ke ʻano he pūʻulu. I kēia hihia, ua ʻike ʻia nā mea hoʻokipa e lawelawe i ke kaʻa. ʻO ke ala e hiki ai i nā pūʻali koa, e like me ka manawa hoʻopau, ua wehewehe ʻia he hoʻonohonoho cluster. Hāʻawi kēia i ka mana ʻoi aku ka nui ma luna o nā ʻano e like me ka latency a me ka load balancing.
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 }}
]
Ke hoʻohana nei i ka ʻike lawelawe STRICT_DNS E hoʻomau a hoʻoholo ʻo Envoy i nā pahuhopu DNS i kuhikuhi ʻia. ʻO kēlā me kēia helu IP i hoʻihoʻi ʻia mai ka hopena DNS e manaʻo ʻia he pūʻali kikoʻī ma ka puʻupuʻu upstream. ʻO ia ke ʻano inā hoʻihoʻi mai kahi noi i ʻelua mau IP address, e manaʻo ʻo Envoy aia ʻelua mau pūʻali i loko o ka pūʻulu, a pono e hoʻouka ʻia ʻelua. Inā hoʻoneʻe ʻia kahi mea hoʻokipa mai ka hopena, manaʻo ʻo Envoy ʻaʻole ia e noho hou a e huki i nā kaʻa mai nā loko pili pili.
No ka ʻike hou aku e ʻike
KaʻAnuʻu Hana 6 - Log Access a me nā hewa
ʻO ka hoʻonohonoho hope loa ka hoʻopaʻa inoa. Ma kahi o ka pana ʻana i nā lāʻau hewa i ka disk, lawe ʻo Envoy Proxy i kahi ala e pili ana i ke ao. Hoʻopuka ʻia nā moʻolelo noi a pau i stdout и stderr.
Ke hana nā mea hoʻohana i kahi noi, he koho a hoʻopaʻa ʻia nā lāʻau komo. No ka hiki ke komo i nā lāʻau no nā noi HTTP, e hoʻā i ka hoʻonohonoho access_log no ka luna pili HTTP. Hiki ke ala ke ala e like me stdout, a i ʻole he faila ma ka disk, ma muli o kāu mau koi.
ʻO ka hoʻonohonoho ma lalo nei e hoʻohuli i nā moʻolelo komo āpau i stdout (ka moʻolelo a ka unuhi - pono ʻo stdout e hoʻohana i ka ʻelele i loko o ka pahu. E kope i ka snippet i ka ʻāpana hoʻonohonoho no ka luna hoʻohui:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Pono nā hopena e like me kēia:
- 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:
Ma ka maʻamau, loaʻa iā Envoy kahi string format e pili ana i nā kikoʻī o ka noi 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
ʻO ka hopena o kēia string format:
[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"
Hiki ke hoʻopilikino ʻia ka maʻiʻo hoʻopuka ma ka hoʻonohonoho ʻana i ke kahua format. ʻo kahi laʻana:
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"
Hiki ke hoʻopuka ʻia ka laina log ma ke ʻano JSON ma ka hoʻonohonoho ʻana i ke kahua json_format. ^ E Ha yM. Ma ke ʻano he:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
No ka 'ike hou aku e pili ana i ka Envoy Registration Methodology, e kipa
ʻAʻole ʻo ka logging wale ke ala e loaʻa ai ka ʻike i ka hana ʻana me Envoy Proxy. Loaʻa iā ia nā mākaʻikaʻi kiʻekiʻe a me nā mana metric i kūkulu ʻia i loko. Hiki iā ʻoe ke ʻike hou aku ma
KaʻAnuʻu 7 - Hoʻomaka
Ua neʻe ʻoe i kāu hoʻonohonoho ʻana mai NGINX i Envoy Proxy. ʻO ka hana hope e hoʻomaka i kahi Envoy Proxy e hoʻāʻo ai.
Holo e like me ka mea hoʻohana
Ma ka piko o ka laina hoʻonohonoho NGINX mea hoʻohana www www; kuhikuhi e holo NGINX ma ke ʻano he mea hoʻohana haʻahaʻa haʻahaʻa e hoʻomaikaʻi i ka palekana.
Lawe ʻo Envoy Proxy i kahi ala e pili ana i ke ao no ka mālama ʻana i ka mea nona kahi kaʻina hana. Ke holo mākou i ka Envoy Proxy ma kahi pahu, hiki iā mākou ke kuhikuhi i kahi mea hoʻohana haʻahaʻa haʻahaʻa.
Ke hoʻomaka nei ʻo Envoy Proxy
E holo ke kauoha ma lalo nei i ka Envoy Proxy ma o kahi pahu Docker ma ka host. Hāʻawi kēia kauoha iā Envoy i ka hiki ke hoʻolohe i nā noi e hiki mai ana ma ke awa 80. Eia naʻe, e like me ka mea i hōʻike ʻia ma ka hoʻonohonoho hoʻolohe, hoʻolohe ʻo Envoy Proxy no ka hele ʻana mai ma ke awa 8080. ʻAe kēia i ke kaʻina hana e holo ma ke ʻano he mea hoʻohana haʻahaʻa.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Hoʻoponopono
Me ka holo ʻana o ka proxy, hiki ke hana a hana ʻia nā hoʻokolohua. Hoʻopuka kēia kauoha cURL i kahi noi me ka poʻomanaʻo host i wehewehe ʻia ma ka hoʻonohonoho koho.
curl -H "Host: one.example.com" localhost -i
ʻO ka noi HTTP e hopena i kahi hewa 503. ʻO kēia no ka mea ʻaʻole e holo ana nā pilina o luna a ʻaʻole i loaʻa. No laila, ʻaʻohe wahi i loaʻa iā Envoy Proxy no ka noi. E hoʻomaka ke kauoha aʻe i kahi ʻano o nā lawelawe HTTP e kūlike i ka hoʻonohonoho i wehewehe ʻia no Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Me nā lawelawe i loaʻa, hiki i ka Envoy ke kūleʻa i ka hele ʻana i ka huakaʻi i kāna huakaʻi.
curl -H "Host: one.example.com" localhost -i
Pono ʻoe e ʻike i kahi pane e hōʻike ana i ka pahu Docker i hana i ka noi. I loko o ka Envoy Proxy logs pono ʻoe e ʻike i kahi puka string access.
Nā poʻomanaʻo pane HTTP hou
E ʻike ʻoe i nā poʻomanaʻo HTTP hou ma nā pane pane o ka noi maoli. Hōʻike ke poʻo i ka manawa i hoʻohana ai ka mea hoʻokipa i luna i ka hoʻoponopono ʻana i ka noi. Hōʻike ʻia i nā milliseconds. Pono kēia inā makemake ka mea kūʻai aku e hoʻoholo i ka manawa lawelawe i hoʻohālikelike ʻia me ka latency pūnaewele.
x-envoy-upstream-service-time: 0
server: envoy
Hoʻopili hope
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 }
Nā ʻike hou mai ka unuhi ʻōlelo
Hiki ke loaʻa nā ʻōlelo kuhikuhi no ka hoʻokomo ʻana iā Envoy Proxy ma ka pūnaewele
Ma ka maʻamau, ʻaʻohe rpm kahi hoʻonohonoho lawelawe systemd.
Hoʻohui i ka config service 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
Pono ʻoe e hana i kahi papa kuhikuhi /etc/envoy/ a kau i ka config.yaml config ma laila.
Aia kahi kamaʻilio telegram me ka hoʻohana ʻana i ka elele proxy:
ʻAʻole kākoʻo ʻo Envoy Proxy i ka lawelawe ʻana i nā ʻike static. No laila, ʻo wai ka mea hiki ke koho i ka hiʻohiʻona:
Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi.
Ua paipai anei kēia pou iā ʻoe e hoʻokomo a hoʻāʻo i ka proxy ʻelele?
-
ʻo ia
-
aole
75 mea hoʻohana i koho. Ua hōʻole nā mea hoʻohana 18.
Source: www.habr.com