Салом! Ин мақолаи кӯтоҳест, ки ба саволҳои "фиристода чист?", "чаро лозим аст?" ва "аз куҷо оғоз кардан?".
Ин чист?
Envoy як мувозинати L4-L7 мебошад, ки дар C++ навишта шудааст, ки ба иҷрои баланд ва дастрасӣ нигаронида шудааст. Аз як тараф, ин ба андозае аналоги nginx ва haproxy аст, ки дар иҷрои онҳо бо онҳо муқоиса карда мешавад. Аз тарафи дигар, он бештар ба меъмории микросервис нигаронида шудааст ва функсияҳо аз java ва go balansers, ба монанди zuul ё traefik бадтар нест.
Ҷадвали муқоисавии haproxy/nginx/envoy, он даъвои ҳақиқати мутлақ нест, балки тасвири умумиро медиҳад.
nginx
гапроксӣ
фиристода
траефик
ситораҳо дар github
11.2к/оина
1.1к/оина
12.4k
27.6k
навишта шудааст
C
C
C ++
go
API
нест
танҳо розетка/пуш
ҳавопаймои маълумотӣ / кашед
Кашидан
санҷиши саломатии фаъол
нест
ҳа
ҳа
ҳа
Пайгирии кушод
плагини беруна
нест
ҳа
ҳа
J.W.T.
плагини беруна
нест
ҳа
нест
Васеъ
Луа/С
Луа/С
Lua/C++
нест
Барои чӣ
Ин як лоиҳаи ҷавон аст, бисёр чизҳо намерасанд, баъзеҳо дар аввали алфа. Аммо фиристода, инчунин аз сабаби ҷавонии худ, босуръат инкишоф меёбад ва аллакай бисёр хусусиятҳои ҷолиб дорад: конфигуратсияи динамикӣ, бисёр филтрҳои тайёр, интерфейси оддӣ барои навиштани филтрҳои шахсии худ.
Соҳаҳои татбиқ аз ин бармеоянд, аммо дар аввал 2 антипаттерн мавҷуданд:
- Бозгашти статикӣ.
Гап дар сари он аст, ки дар айни замон дар фиристода дастгирии кэш нест. Бачаҳои Google ин кӯшиш мекунанд
Ҳоло, nginx-ро барои статика истифода баред.
- Конфигуратсияи статикӣ.
Шумо метавонед онро истифода баред, аммо фиристода Ин барои он офарида нашудааст. Хусусиятҳо дар конфигуратсияи статикӣ ошкор карда намешаванд. Лаҳзаҳои зиёде мавҷуданд:
Ҳангоми таҳрири конфигуратсия дар yaml, шумо хато мекунед, таҳиягаронро барои тафсилот таъна медиҳед ва фикр кунед, ки конфигуратсияҳои nginx/haproxy, гарчанде ки сохтори камтар доранд, мухтасартаранд. Гап дар хамин аст. Конфигуратсияи Nginx ва Haproxy барои таҳрири дастӣ сохта шудааст ва фиристода барои насл аз код. Тамоми конфигуратсия дар
Canary, сенарияҳои ҷойгиркунии b/g ва бисёр чизҳои дигар одатан танҳо дар конфигуратсияи динамикӣ амалӣ карда мешаванд. Ман намегӯям, ки ин корро ба таври статикӣ кардан мумкин нест, ҳамаи мо ин корро мекунем. Аммо барои ин ба шумо лозим аст, ки ба асобағалҳо, дар ҳама гуна мувозинат, дар фиристода аз ҷумла.
Вазифаҳое, ки фиристода барои иҷрои онҳо ҳатмист:
- Мувозинати трафик дар системаҳои мураккаб ва динамикӣ. Ин шабакаи хидматрасониро дар бар мегирад, аммо он ҳатман ягона нест.
- Талабот ба функсияи пайгирии тақсимшуда, иҷозати мураккаб ё дигар функсияҳое, ки дар он дастрасанд фиристода аз қуттӣ ё ба осонӣ амалӣ карда мешавад, аммо дар nginx/haproxy шумо бояд бо плагинҳои lua ва шубҳанок иҳота карда шаванд.
Ҳарду, агар лозим бошад, нишондиҳандаҳои баландро таъмин мекунанд.
Чӣ тавр ба ин кор
Фиристода дар бинарӣ танҳо ҳамчун тасвири докер тақсим карда мешавад. Дар тасвир аллакай намунаи конфигуратсияи статикӣ мавҷуд аст. Аммо мо ба он танҳо барои фаҳмидани сохтор манфиатдорем.
envoy.yaml конфигуратсияи статикӣ
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.google.com
cluster: service_google
http_filters:
- name: envoy.router
clusters:
- name: service_google
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_google
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.google.com
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
sni: www.google.com
Конфигуратсияи динамикӣ
Мо роҳи ҳалли кадом мушкилотро меҷӯем? Шумо наметавонед танҳо конфигуратсияи мувозинати сарборро дар зери бори дубора бор кунед; мушкилоти "хурд" ба миён меоянд:
- Тасдиқи конфигуратсия.
Конфигуратсия метавонад калон бошад, он метавонад хеле калон бошад, агар мо онро якбора аз ҳад зиёд бор кунем, эҳтимолияти хатогӣ дар ҷое зиёд мешавад.
- Пайвастҳои дарозмуддат.
Ҳангоми оғоз кардани шунавандаи нав, шумо бояд дар бораи пайвастҳои дар кӯҳна коркунанда ғамхорӣ кунед; агар тағирот зуд-зуд рух диҳад ва пайвастагиҳои дарозмуддат вуҷуд дошта бошанд, шумо бояд созишро ҷустуҷӯ кунед. Салом, кубернетҳо ба nginx ворид мешаванд.
- Санҷиши саломатии фаъол.
Агар мо санҷишҳои фаъоли саломатӣ дошта бошем, мо бояд пеш аз фиристодани трафик ҳамаи онҳоро дар конфигуратсияи нав дубора тафтиш кунем. Агар ҷараёнҳои болоӣ зиёд бошанд, ин вақтро мегирад. Салом хапрокси.
Ин чӣ гуна ҳал карда мешавад фиристодаБо боркунии конфигуратсия ба таври динамикӣ, мувофиқи модели ҳавз, шумо метавонед онро ба қисмҳои алоҳида тақсим кунед ва қисми тағирнашударо дубора оғоз накунед. Масалан, шунаванда, ки барои аз нав оғоз кардан гарон аст ва кам тағйир меёбад.
Танзимот фиристода (аз файли боло) дорои объектҳои зерин аст:
- шунаванда — шунаванда дар IP/порти мушаххас овезон аст
- мизбони виртуалӣ - мизбони виртуалӣ аз рӯи номи домен
- масир - қоидаи мувозинат
- кластер — як гурухи болооб бо параметрхои мувозинат
- охири нуқта — суроғаи инстанси болоӣ
Ҳар яке аз ин объектҳо ва баъзеи дигар метавонанд ба таври динамикӣ пур карда шаванд; барои ин конфигуратсия суроғаи хидматро аз куҷо қабул кардани конфигуратсияро муайян мекунад. Хидмат метавонад REST ё gRPC бошад, gRPC афзалтар аст.
Хизматҳо мутаносибан номгузорӣ шудаанд: LDS, VHDS, RDS, CDS ва EDS. Шумо метавонед конфигуратсияи статикӣ ва динамикиро якҷоя кунед, бо маҳдудияте, ки манбаи динамикӣ дар як манбаи статикӣ муайян карда намешавад.
Барои аксари вазифаҳо татбиқи се хидмати охирин кифоя аст, ки онҳо ADS (Aggregated Discovery Service) номида мешаванд.
Конфигуратсия шакли зеринро мегирад:
envoy.yaml конфигуратсияи динамикӣ
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: xds_clr
cds_config:
ads: {}
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
rds:
route_config_name: local_route
config_source:
ads: {}
http_filters:
- name: envoy.router
clusters:
- name: xds_clr
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: xds_clr
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: xds
port_value: 6565
Ҳангоми оғоз фиристода бо ин конфигуратсия, он ба ҳавопаймои идоракунӣ пайваст мешавад ва кӯшиш мекунад, ки конфигуратсияи RDS, CDS ва EDS-ро дархост кунад. Чӣ тавр раванди мутақобила ба амал меояд, тавсиф карда мешавад
Кӯтоҳаш, фиристода дархост мефиристад, ки намуди захираи дархостшаванда, версия ва параметрҳои гиреҳро нишон медиҳад. Дар ҷавоб, он захира ва версияро мегирад; агар версияи ҳавопаймои идоракунӣ тағир наёфта бошад, он ҷавоб намедиҳад.
4 варианти муштарак вуҷуд дорад:
- Як ҷараёни gRPC барои ҳама намуди захираҳо, ҳолати пурраи манбаъ фиристода мешавад.
- Ҷараёни алоҳида, ҳолати пурра.
- Як ҷараён, ҳолати афзоянда.
- Ҷараёнҳои ҷудогона, ҳолати афзоянда.
xDS-и афзоянда ба шумо имкон медиҳад, ки трафикро байни ҳавопаймои идоракунӣ ва фиристода, ин барои конфигуратсияҳои калон мувофиқ аст. Аммо ин муомиларо душвор мегардонад; дар дархост рӯйхати захираҳо барои бекоркунӣ ва обуна мавҷуд аст.
Мисоли мо ADS - як ҷараёнро барои RDS, CDS, EDS ва режими афзоянда истифода мебарад. Барои фаъол кардани ҳолати афзоянда, шумо бояд муайян кунед api_type: DELTA_GRPC
Азбаски дархост дорои параметрҳои гиреҳ аст, мо метавонем захираҳои гуногунро ба ҳавопаймои идоракунӣ барои мисолҳои гуногун фиристем фиристода, ин барои сохтани сети хизматрасонй кулай аст.
Гармоиш
Дар бораи он фиристода ҳангоми оғозёбӣ ё ҳангоми гирифтани конфигуратсияи нав аз ҳавопаймои идоракунӣ, раванди гармкунии захираҳо оғоз мешавад. Он ба гармшавии шунаванда ва гармшавии кластер тақсим мешавад. Якум ҳангоми тағирот дар RDS/LDS оғоз мешавад, дуюм ҳангоми CDS/EDS. Ин маънои онро дорад, ки агар танҳо болооб тағйир ёбад, шунаванда дубора эҷод намешавад.
Дар ҷараёни гармкунӣ, захираҳои вобаста аз ҳавопаймои идоракунӣ дар тӯли вақт интизор мешаванд. Агар фаро расидани вақт ба амал ояд, оғозсозӣ муваффақ нахоҳад шуд ва шунавандаи нав гӯш кардани портро оғоз намекунад.
Тартиби оғозёбӣ: EDS, CDS, санҷиши саломатии фаъол, RDS, LDS. Ҳангоми фаъол кардани санҷишҳои саломатӣ, трафик танҳо пас аз як санҷиши бомуваффақияти саломатӣ ба боло меравад.
Агар шунаванда аз нав сохта шуда бошад, кӯҳна ба ҳолати DRAIN мегузарад ва пас аз баста шудани ҳама пайвастҳо ё ба охир расидани мӯҳлат нест карда мешавад. --drain-time-s
, пешфарз 10 дақиқа.
Идома дода шавад.
Манбаъ: will.com