Велики поздрав! Ово је кратак чланак који одговара на питања: "шта је изасланик?", "зашто је потребан?" и "где да почнем?".
Шта је ово
Енвои је Л4-Л7 балансер написан на Ц++, фокусиран на високе перформансе и доступност. С једне стране, ово је на неки начин аналог нгинк-а и хапроки-ја, упоредив по перформансама са њима. С друге стране, више је оријентисан на микросервисну архитектуру и има функционалност ништа лошију од јава и го балансера, као што су зуул или траефик.
Табела поређења хапроки/нгинк/енвои, не тврди да је апсолутна истина, али даје општу слику.
Апацхе
хапрокси
изасланик
траефик
звезде на гитхуб-у
11.2к/огледало
1.1к/огледало
КСНУМКСк
КСНУМКСк
уписано у
C
C
Ц + +
go
АПИ за
не
само утичница/притиснути
датаплане/пулл
повући
активни здравствени преглед
не
да
да
да
Отворено праћење
спољни додатак
не
да
да
ЈВТ
спољни додатак
не
да
не
продужетак
Луа/Ц
Луа/Ц
Луа/Ц++
не
За шта
Ово је млад пројекат, недостаје много ствари, неке у раној алфи. Али изасланик, такође због своје младости, брзо се развија и већ има много занимљивих карактеристика: динамичку конфигурацију, много готових филтера, једноставан интерфејс за писање сопствених филтера.
Области примене следе из овога, али прво постоје 2 антиобрасци:
- Статички трзај.
Чињеница је да у овом тренутку у изасланик нема подршке за кеширање. Момци из Гугла покушавају ово
За сада, користите нгинк за статику.
- Статичка конфигурација.
Можете га користити, али изасланик Није за то створено. Карактеристике у статичкој конфигурацији неће бити изложене. Има много тренутака:
Када уређујете конфигурацију у иамл-у, погрешићете, прекорићете програмере за опширност и мислити да су нгинк/хапроки конфигурације, иако мање структуриране, сажетије. То је поента. Конфигурација Нгинк-а и Хапроки-а креирана је за ручно уређивање и изасланик за генерисање из кода. Целокупна конфигурација је описана у
Цанари, б/г сценарији примене и још много тога се обично примењују само у динамичкој конфигурацији. Не кажем да то не може да се ради статично, сви то радимо. Али за ово морате ставити штаке, у било који од балансера, у изасланик укључујући.
Послови за које је изасланик неопходан:
- Балансирање саобраћаја у сложеним и динамичким системима. Ово укључује сервисну мрежу, али није нужно једина.
- Потреба за функционалношћу дистрибуираног праћења, сложеном ауторизацијом или другом функционалношћу која је доступна у изасланик ван кутије или практично имплементиран, али у нгинк/хапроки морате бити окружени луа и сумњивим додацима.
Оба, ако је потребно, пружају високе перформансе.
Како ово ради
Енвои се дистрибуира у бинарним датотекама само као доцкер слика. Слика већ садржи пример статичне конфигурације. Али нас то занима само за разумевање структуре.
енвои.иамл статичка конфигурација
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
Динамичка конфигурација
За који проблем тражимо решење? Не можете само поново учитати конфигурацију балансера оптерећења под оптерећењем; појавиће се „мали“ проблеми:
- Провера конфигурације.
Конфигурација може бити велика, може бити веома велика, ако га преоптерећујемо одједном, повећавају се шансе да негде дође до грешке.
- Дуговечне везе.
Када иницијализујете новог слушаоца, морате да водите рачуна о везама које раде на старом; ако се промене дешавају често и постоје дуговечне везе, мораћете да тражите компромис. Здраво, кубернетес улаз на нгинк.
- Активне здравствене провере.
Ако имамо активне здравствене провере, морамо их све још једном проверити у новој конфигурацији пре слања саобраћаја. Ако има много узводних токова, за ово треба времена. Здраво хапроки.
Како је ово решено у изасланикДинамичким учитавањем конфигурације, према моделу базена, можете је поделити на засебне делове и не поново иницијализовати део који се није променио. На пример, слушалац, који је скуп за реиницијализацију и ретко се мења.
Конфигурација изасланик (из датотеке изнад) има следеће ентитете:
- слушалац — слушалац виси на одређеном ИП-у/порту
- виртуал хост - виртуелни хост по имену домена
- рута - правило балансирања
- група — група узводних са балансним параметрима
- крајња тачка — упстреам адреса инстанце
Сваки од ових ентитета плус неки други могу се попунити динамички; за то конфигурација одређује адресу сервиса одакле ће бити примљена конфигурација. Услуга може бити РЕСТ или гРПЦ, гРПЦ је пожељнији.
Сервиси су именовани редом: ЛДС, ВХДС, РДС, ЦДС и ЕДС. Можете комбиновати статичку и динамичку конфигурацију, уз ограничење да се динамички ресурс не може навести у статичком.
За већину задатака довољно је имплементирати последња три сервиса, они се зову АДС (Аггрегатед Дисцовери Сервице), за
Конфигурација има следећи облик:
енвои.иамл динамичка конфигурација
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
Приликом покретања изасланик са овом конфигурацијом, он ће се повезати са контролном равнином и покушати да затражи РДС, ЦДС и ЕДС конфигурацију. Описано је како се одвија процес интеракције
Укратко, изасланик шаље захтев који указује на тип ресурса који се захтева, верзију и параметре чвора. Као одговор, добија ресурс и верзију; ако се верзија на контролној равни није променила, не одговара.
Постоје 4 опције интеракције:
- Један гРПЦ ток за све типове ресурса, шаље се пун статус ресурса.
- Одвојени токови, потпуно стање.
- Један ток, инкрементално стање.
- Одвојени токови, инкрементално стање.
Инкрементални кДС вам омогућава да смањите саобраћај између контролне равни и изасланик, ово је релевантно за велике конфигурације. Али то компликује интеракцију; захтев садржи листу ресурса за одјаву и претплату.
Наш пример користи АДС - један ток за РДС, ЦДС, ЕДС и неинкрементални режим. Да бисте омогућили инкрементални режим, потребно је да наведете api_type: DELTA_GRPC
Пошто захтев садржи параметре чвора, можемо послати различите ресурсе у контролну раван за различите инстанце изасланик, ово је погодно за изградњу сервисне мреже.
Загрејати
На изасланик при покретању или када примате нову конфигурацију из контролне равни, покреће се процес загревања ресурса. Дели се на загревање слушалаца и загревање кластера. Први се покреће када дође до промена у РДС/ЛДС, други када ЦДС/ЕДС. То значи да ако се промене само узводни, слушалац неће бити поново креиран.
Током процеса загревања, зависни ресурси се очекују од контролне равни током временског ограничења. Ако дође до истека времена, иницијализација неће бити успешна и нови слушалац неће почети да слуша на порту.
Редослед иницијализације: ЕДС, ЦДС, активни здравствени преглед, РДС, ЛДС. Када су активне провере здравља омогућене, саобраћај ће ићи узводно само након једне успешне здравствене провере.
Ако је слушалац поново креиран, стари прелази у стање ДРАИН и биће обрисан након што се све везе затворе или истекне временско ограничење --drain-time-s
, подразумевано 10 минута.
Наставити.
Извор: ввв.хабр.цом