Hey Habr! Eyi ni itumọ ifiweranṣẹ naa:
Aṣoju jẹ olupin aṣoju pinpin iṣẹ giga (ti a kọ sinu C ++) ti a ṣe apẹrẹ fun awọn iṣẹ ati awọn ohun elo kọọkan, o tun jẹ ọkọ akero ibaraẹnisọrọ ati “ọkọ ofurufu data gbogbogbo” ti a ṣe apẹrẹ fun awọn ile-iṣẹ faaji “asopọ iṣẹ” nla. Nigbati o ba ṣẹda, awọn solusan si awọn iṣoro ti o dide lakoko idagbasoke awọn olupin bii NGINX, HAProxy, awọn iwọntunwọnsi fifuye hardware ati awọn iwọntunwọnsi fifuye awọsanma ni a gba sinu apamọ. Aṣoju ṣiṣẹ pọ pẹlu gbogbo ohun elo ati abstracts nẹtiwọọki lati pese iṣẹ ṣiṣe ti o wọpọ laibikita iru ẹrọ. Nigbati gbogbo ijabọ iṣẹ ni awọn amayederun kọja nipasẹ akoj Aṣoju, o di irọrun lati wo awọn agbegbe iṣoro nipasẹ akiyesi deede, ṣiṣatunṣe iṣẹ ṣiṣe gbogbogbo, ati ṣafikun iṣẹ ṣiṣe pataki ni ipo kan pato.
Awọn agbara
- Itumọ ilana: aṣoju jẹ ti ara ẹni, olupin iṣẹ giga ti o gba Ramu kekere. O ṣiṣẹ ni apapo pẹlu eyikeyi ede elo tabi ilana.
- http/2 ati atilẹyin grpc: aṣoju ni o ni ogbontarigi http/2 ati atilẹyin grpc fun awọn asopọ ti nwọle ati ti njade. O jẹ aṣoju sihin lati http/1.1 si http/2.
- Iwontunwonsi fifuye ilọsiwaju: aṣoju ṣe atilẹyin awọn ẹya iwọntunwọnsi fifuye ilọsiwaju, pẹlu awọn igbiyanju adaṣe adaṣe, ifopinsi pq, opin oṣuwọn agbaye, ojiji ibeere, iwọntunwọnsi fifuye agbegbe agbegbe, ati bẹbẹ lọ.
- API Iṣakoso Iṣeto: aṣoju n pese API ti o lagbara fun ṣiṣakoso iṣeto ni agbara.
- Ifojusi: Ifojusi jinlẹ ti ijabọ L7, atilẹyin ti a ṣe sinu fun wiwa kaakiri, ati akiyesi mongodb, dynamodb ati ọpọlọpọ awọn ohun elo miiran.
Igbesẹ 1 - Apeere Iṣeto NGINX
Iwe afọwọkọ yii nlo faili ti a ṣe ni pataki nginx.conf, da lori pipe apẹẹrẹ lati
Iṣeto nginx akọkọ
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;
}
}
}
Awọn atunto NGINX ni igbagbogbo ni awọn eroja pataki mẹta:
- Ṣiṣeto olupin NGINX, eto gedu, ati iṣẹ ṣiṣe Gzip. Eyi ni asọye ni agbaye ni gbogbo awọn ọran.
- Ṣiṣeto NGINX lati gba awọn ibeere si agbalejo naa ọkan.apẹẹrẹ.com lori ibudo 8080.
- Eto ibi ibi-afẹde, bii o ṣe le mu ijabọ fun awọn ẹya oriṣiriṣi ti URL naa.
Kii ṣe gbogbo iṣeto ni yoo kan si Aṣoju Aṣoju ati pe o ko nilo lati tunto diẹ ninu awọn eto. Aṣoju Aṣoju ni mẹrin bọtini orisi, eyiti o ṣe atilẹyin awọn amayederun ipilẹ ti NGINX funni. Ekuro ni:
- Awọn olutẹtisi: Wọn ṣalaye bi Aṣoju Aṣoju ṣe gba awọn ibeere ti nwọle. Aṣoju Aṣoju lọwọlọwọ ṣe atilẹyin awọn olutẹtisi orisun TCP nikan. Ni kete ti asopọ kan ba ti fi idi mulẹ, o ti kọja si eto àlẹmọ fun sisẹ.
- Ajọ: Wọn jẹ apakan ti faaji opo gigun ti epo ti o le ṣe ilana data ti nwọle ati ti njade. Iṣẹ ṣiṣe yii pẹlu awọn asẹ bii Gzip, eyiti o rọ data ṣaaju fifiranṣẹ si alabara.
- Awọn olulana: Wọn ṣe atunṣe ijabọ si ibi ti o fẹ, ti ṣalaye bi iṣupọ kan.
- Awọn akojọpọ: Wọn ṣalaye aaye ipari fun ijabọ ati awọn aṣayan iṣeto ni.
A yoo lo awọn paati mẹrin wọnyi lati ṣẹda iṣeto Aṣoju Aṣoju lati baamu iṣeto NGINX kan pato. Idi ti Aṣoju jẹ iṣẹ API ati iṣeto ni agbara. Ni idi eyi, iṣeto ipilẹ yoo lo aimi, awọn aṣayan koodu-lile lati NGINX.
Igbesẹ 2 - Iṣeto NGINX
Apa akọkọ nginx.conf n ṣalaye diẹ ninu awọn inu NGINX ti o gbọdọ tunto.
Awọn isopọ Osise
Iṣeto ni isalẹ pinnu nọmba awọn ilana oṣiṣẹ ati awọn asopọ. Eyi tọkasi bi NGINX yoo ṣe iwọn lati pade ibeere.
worker_processes 2;
events {
worker_connections 2000;
}
Aṣoju Aṣoju n ṣakoso awọn ṣiṣan iṣẹ ati awọn asopọ ni awọn ọna oriṣiriṣi.
Aṣoju ṣẹda okun oṣiṣẹ fun gbogbo okun ohun elo ninu eto naa. Okun oṣiṣẹ kọọkan ṣiṣẹ lupu iṣẹlẹ ti kii ṣe idilọwọ ti o jẹ iduro fun
- Nfetisi olutẹtisi kọọkan (olugbọ)
- Gbigba titun awọn isopọ
- Ṣẹda àlẹmọ ṣeto fun asopọ kan
- Ṣiṣe gbogbo awọn iṣẹ I/O nigba igbesi aye asopọ naa.
Gbogbo sisẹ siwaju ti asopọ ni a mu ni kikun ni okun oṣiṣẹ, pẹlu eyikeyi ihuwasi firanšẹ siwaju.
Fun okun oṣiṣẹ kọọkan ni Aṣoju, asopọ kan wa ninu adagun-odo naa. Nitorinaa awọn adagun-isopọ HTTP/2 nikan ṣe agbekalẹ asopọ kan fun agbalejo ita kọọkan ni akoko kan, pẹlu awọn okun oṣiṣẹ mẹrin, awọn asopọ HTTP/2 mẹrin yoo wa fun agbalejo ita kọọkan ni ipo iduroṣinṣin. Nipa titọju ohun gbogbo lori okun oṣiṣẹ kan, o fẹrẹ jẹ pe gbogbo koodu ni a le kọ ni bulọọki-ọfẹ bi ẹnipe o tẹle-ọkan. Ti o ba pin awọn okun oṣiṣẹ diẹ sii ju iwulo lọ, eyi le ja si iranti asonu, ṣiṣẹda nọmba nla ti awọn asopọ ti ko ṣiṣẹ, ati idinku nọmba asopọ ti o pada sẹhin si adagun-odo.
Fun alaye siwaju sii ibewo
HTTP iṣeto ni
Àkọsílẹ atunto NGINX ti o tẹle n ṣalaye awọn eto HTTP gẹgẹbi:
- Ohun ti mime orisi ni atilẹyin
- Awọn akoko aipe
- Gzip iṣeto ni
O le ṣe akanṣe awọn aaye wọnyi pẹlu awọn asẹ ni Aṣoju Aṣoju, eyiti a yoo jiroro nigbamii.
Igbesẹ 3 - Iṣeto olupin
Ninu bulọọki iṣeto HTTP, iṣeto NGINX ni pato lati tẹtisi lori ibudo 8080 ati dahun si awọn ibeere ti nwọle fun awọn ibugbe ọkan.apẹẹrẹ.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Ninu Aṣoju, Awọn olutẹtisi ṣakoso eyi.
Awọn olutẹtisi Aṣoju
Abala pataki julọ ti bibẹrẹ pẹlu Aṣoju Aṣoju jẹ asọye awọn olutẹtisi. O nilo lati ṣẹda faili iṣeto ni ti o ṣe apejuwe bi o ṣe fẹ ṣiṣe apẹẹrẹ Aṣoju naa.
Awọn snippet ti o wa ni isalẹ yoo ṣẹda olutẹtisi tuntun kan ki o si dè e si ibudo 8080. Iṣeto ni sọ fun aṣoju aṣoju aṣoju ti o yẹ ki o ni asopọ si awọn ibeere ti nwọle.
Aṣoju Aṣoju nlo aami YAML fun iṣeto rẹ. Fun ifihan si akiyesi yii, wo Nibi
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Ko si ye lati setumo orukọ olupin, bi awọn Ajọ aṣoju aṣoju yoo mu eyi.
Igbesẹ 4 - Iṣeto ipo
Nigbati ibeere kan ba de NGINX, idinaduro ipo pinnu bi o ṣe le mu ati ibiti o le ṣe ipa ọna. Ninu ajẹkù ti o tẹle, gbogbo awọn ijabọ si aaye naa ni a gbe lọ si oke (akọsilẹ onitumọ: oke jẹ igbagbogbo olupin ohun elo) iṣupọ ti a npè ni afojusunCluster. Iṣupọ oke n ṣalaye awọn apa ti o yẹ ki o ṣe ilana ibeere naa. A yoo jiroro eyi ni igbesẹ ti nbọ.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Ni Envoy, eyi ni ohun ti Awọn Ajọ ṣe.
Awọn Ajọ Aṣoju
Fun iṣeto ni aimi, awọn asẹ pinnu bi awọn ibeere ti nwọle ṣe ṣe ilana. Ni idi eyi, a ṣeto awọn asẹ ti o baamu awọn orukọ olupin ni išaaju igbese. Nigbati awọn ibeere ti nwọle ba wọle ti o baamu awọn ibugbe ati awọn ipa-ọna kan, awọn ọna gbigbe lọ si iṣupọ naa. Eyi jẹ deede ti iṣeto ni oke 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 jẹ àlẹmọ ti a ṣe sinu Aṣoju Aṣoju. Awọn asẹ miiran pẹlu Redis, Mongo, TCP. O le wa atokọ pipe ni
Fun alaye diẹ sii lori awọn eto imulo iwọntunwọnsi fifuye miiran, ṣabẹwo
Igbesẹ 5 - Aṣoju ati Iṣeto Igbesoke
Ni NGINX, iṣeto ni oke ti n ṣalaye ṣeto ti awọn olupin ibi-afẹde ti yoo ṣe ilana ijabọ naa. Ni ọran yii, a ti yan awọn iṣupọ meji.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Ninu Aṣoju eyi ni iṣakoso nipasẹ awọn iṣupọ.
Awọn iṣupọ Aṣoju
Iwọn deede ti oke ni asọye bi awọn iṣupọ. Ni idi eyi, awọn ọmọ-ogun ti yoo sin ijabọ naa ti ni asọye. Bii o ṣe n wọle si awọn agbalejo, gẹgẹbi akoko isunmọ, jẹ asọye bi iṣeto iṣupọ kan. Eyi ngbanilaaye iṣakoso ti o dara julọ lori granularity ti awọn aaye bii lairi ati iwọntunwọnsi fifuye.
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 }}
]
Nigba lilo wiwa iṣẹ STRICT_DNS Aṣoju yoo tẹsiwaju nigbagbogbo ati asynchronously yanju awọn ibi-afẹde DNS pàtó kan. Àdírẹ́ẹ̀sì IP kọ̀ọ̀kan tí a dá padà láti inú àbájáde DNS ni a ó kà sí olùgbàlejò pàtó nínú ìdìpọ̀ òkè. Eyi tumọ si pe ti ibeere ba da awọn adirẹsi IP meji pada, Aṣoju yoo ro pe awọn ogun meji wa ninu iṣupọ ati pe awọn mejeeji yẹ ki o jẹ iwọntunwọnsi fifuye. Ti o ba ti yọ ogun kuro lati abajade, Aṣoju ro pe ko si tẹlẹ ati pe yoo fa ijabọ lati eyikeyi awọn adagun asopọ asopọ ti o wa tẹlẹ.
Fun alaye diẹ ẹ sii wo
Igbesẹ 6 - Wọle Wiwọle ati Awọn aṣiṣe
Ik iṣeto ni ìforúkọsílẹ. Dipo ti titari awọn aṣiṣe aṣiṣe si disk, Aṣoju Aṣoju gba ọna ti o da lori awọsanma. Gbogbo awọn igbasilẹ ohun elo ni o jade si stdout и stderr.
Nigbati awọn olumulo ba ṣe ibeere, awọn iwe iwọle jẹ iyan ati alaabo nipasẹ aiyipada. Lati mu awọn igbasilẹ wiwọle ṣiṣẹ fun awọn ibeere HTTP, mu iṣeto naa ṣiṣẹ wiwọle_log fun oluṣakoso asopọ HTTP. Ọna naa le jẹ boya ẹrọ bii stdout, tabi faili kan lori disiki, da lori awọn ibeere rẹ.
Iṣeto ni atẹle yoo darí gbogbo awọn iwe iwọle si stdout (Akọsilẹ onitumọ - stdout nilo lati lo aṣoju inu docker. Ti o ba lo laisi docker, lẹhinna rọpo / dev/stdout pẹlu ọna si faili log deede). Daakọ snippet si apakan iṣeto fun oluṣakoso asopọ:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Awọn abajade yẹ ki o dabi eyi:
- 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:
Nipa aiyipada, Aṣoju ni okun ọna kika ti o pẹlu awọn alaye ti ibeere 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
Abajade okun ọna kika yii jẹ:
[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"
Awọn akoonu ti o wu le ti wa ni adani nipa siseto aaye kika. Fun apere:
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"
Laini log tun le ṣejade ni ọna kika JSON nipa siseto aaye naa json_kika. Fun apẹẹrẹ:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Fun alaye diẹ sii lori ilana iforukọsilẹ aṣoju, ṣabẹwo
Wiwọle kii ṣe ọna nikan lati ni rilara fun ṣiṣẹ pẹlu Aṣoju Aṣoju. O ti ni ilọsiwaju wiwa kakiri ati awọn metiriki ti a ṣe sinu. O le wa diẹ sii ni
Igbesẹ 7 - Ifilọlẹ
O ti ṣe ṣílọ sí iṣeto ni bayi lati NGINX si Aṣoju Aṣoju. Igbesẹ ti o kẹhin ni lati ṣe ifilọlẹ apẹẹrẹ Aṣoju Aṣoju lati ṣe idanwo rẹ.
Ṣiṣe bi olumulo
Ni oke ti laini iṣeto NGINX olumulo www; tọkasi pe NGINX nṣiṣẹ bi olumulo ti o ni anfani kekere lati mu aabo dara sii.
Aṣoju Aṣoju gba ọna orisun-awọsanma lati ṣakoso ẹniti o ni ilana kan. Nigba ti a ba nṣiṣẹ Aṣoju Aṣoju nipasẹ apoti kan, a le pato olumulo anfani kekere kan.
Ṣiṣe aṣoju aṣoju
Aṣẹ ti o wa ni isalẹ yoo ṣe ifilọlẹ Aṣoju Aṣoju nipasẹ apoti Docker kan lori agbalejo naa. Aṣẹ yii fun Aṣoju ni agbara lati tẹtisi awọn ibeere ti nwọle lori ibudo 80. Sibẹsibẹ, gẹgẹbi pato ninu iṣeto olutẹtisi, Aṣoju Aṣoju n tẹtisi fun ijabọ ti nwọle lori ibudo 8080. Eyi ngbanilaaye ilana lati ṣiṣẹ bi olumulo pẹlu awọn anfani kekere.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Igbeyewo
Pẹlu aṣoju nṣiṣẹ, awọn idanwo le ṣee ṣe ati ni ilọsiwaju bayi. Aṣẹ cURL ti o tẹle n ṣe ibeere kan pẹlu akọsori agbalejo ti a ṣalaye ninu iṣeto aṣoju.
curl -H "Host: one.example.com" localhost -i
Ibeere HTTP yoo ja si aṣiṣe 503. Eyi jẹ nitori awọn asopọ oke ko ṣiṣẹ ati pe ko si. Nitorinaa, Aṣoju Aṣoju ko ni awọn ibi ibi-afẹde ti o wa fun ibeere naa. Aṣẹ atẹle yoo bẹrẹ lẹsẹsẹ awọn iṣẹ HTTP ti o baamu iṣeto ni asọye fun Aṣoju.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Pẹlu awọn iṣẹ ti o wa, Aṣoju le ṣaṣeyọri ijabọ aṣoju si opin irin ajo rẹ.
curl -H "Host: one.example.com" localhost -i
O yẹ ki o wo esi kan ti o nfihan iru apoti Docker ti mu ibeere naa. Ninu awọn akọọlẹ aṣoju aṣoju, o yẹ ki o tun rii okun iwọle ti a tẹ jade.
Afikun Awọn akọle Idahun HTTP (Idahun HTTP)
Iwọ yoo rii afikun awọn akọle HTTP ni awọn akọle idahun ti ibeere to wulo. Akọsori fihan akoko ti agbalejo oke lo sisẹ ibeere naa. Ti ṣalaye ni awọn iṣẹju-aaya. Eyi wulo ti alabara ba fẹ pinnu akoko iṣẹ dipo airi nẹtiwọọki.
x-envoy-upstream-service-time: 0
server: envoy
Ipari konfigi
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 }
Alaye ni afikun lati ọdọ onitumọ
Awọn ilana fun fifi sori ẹrọ aṣoju aṣoju le ṣee ri lori oju opo wẹẹbu
Ko si atunto iṣẹ eto ni rpm nipasẹ aiyipada.
Ṣafikun atunto iṣẹ eto si /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
O nilo lati ṣẹda /etc/envoy/ directory ki o si fi atunto config.yaml sibẹ.
Iwiregbe telegram kan wa fun aṣoju aṣoju aṣoju:
Aṣoju Aṣoju ko ṣe atilẹyin sisin akoonu aimi. Nitorina tani o le dibo fun ẹya kan:
Awọn olumulo ti o forukọsilẹ nikan le kopa ninu iwadi naa.
Njẹ ifiweranṣẹ yii gba ọ niyanju lati fi sori ẹrọ ati idanwo aṣoju aṣoju?
-
bẹẹni
-
ko si
75 olumulo dibo. 18 olumulo abstained.
orisun: www.habr.com