Сәлем! Бұл шағын мақала: «Елші дегеніміз не?», «Ол маған не үшін қажет?» және «Неден бастау керек?» деген сұрақтарға жауап береді.
Бұл не
Envoy — жоғары өнімділік пен қолжетімділікке бағытталған, C++ тілінде жазылған L4-L7 жүктеме балансы. Бір жағынан, бұл nginx және haproxy-ге біршама ұқсас, өнімділік бойынша салыстыруға болады. Екінші жағынан, ол микросервис архитектурасына көбірек бағытталған және zuul немесе traefik сияқты Java және Go жүктеме теңестіргіштерімен салыстырылатын функционалдылықты ұсынады.
Haproxy/nginx/envoy салыстыру кестесі абсолютті шындық деп мәлімдемейді, бірақ ол жалпы суретті береді.
nginx
гапрокси
жіберілген
трейфик
GitHub-дағы жұлдыздар
11.2к/айна
1.1к/айна
12.4k
27.6k
жазылған
C
C
C ++
go
API
жоқ
тек розетка/итеру
деректер жазықтығы/тарту
Тарт
белсенді денсаулықты тексеру
жоқ
иә
иә
иә
Ашық бақылау
сыртқы плагин
жоқ
иә
иә
J.W.T.
сыртқы плагин
жоқ
иә
жоқ
кеңейту
Луа/С
Луа/С
Lua/C++
жоқ
Не үшін
Бұл жас жоба, көп нәрсе жетіспейді, олардың кейбіреулері альфаның басында. Бірақ жіберілген, ішінара жастығына байланысты, қарқынды дамып келеді және қазірдің өзінде көптеген қызықты мүмкіндіктерге ие: динамикалық конфигурация, көптеген дайын сүзгілер, өз сүзгілеріңізді жазуға арналған қарапайым интерфейс.
Қолдану аймақтары осыдан туындайды, бірақ біріншіден, екі қарсы үлгі:
- Статикалық кері қайтару.
Мәселе мынада, қазіргі уақытта жіберілген Кэштеу қолдауы жоқ. Google-дағы жігіттер оны түзетуге тырысуда. Оны анда-санда жүзеге асыру идеясы жіберілген RFC сәйкестігінің барлық нәзіктіктері (тақырыптар хайуанаттар бағы) және нақты іске асыру үшін интерфейсті жасаңыз. Бірақ бұл әлі альфа емес; архитектурасы әлі талқылануда. ашық (мақала жазып жатқанда PR біріктірілді, бірақ бұл мәселе әлі де өзекті).
Осы уақытта статика үшін nginx пайдаланыңыз.
- Статикалық конфигурация.
Сіз оны пайдалана аласыз, бірақ жіберілген Ол осы мақсат үшін жасалмаған. Статикалық конфигурацияның мүмкіндіктері толық іске асырылмайды. Көптеген нүктелер бар:
YAML конфигурациясын өңдеген кезде қателіктер жіберіп, әзірлеушілерді тым егжей-тегжейлі деп қарғап, nginx/haproxy конфигурациялары құрылымы азырақ болса да, қысқарақ деп ойлайсыз. Мәселе мынада. Nginx және Haproxy конфигурациялары қолмен өңдеу үшін жасалған, ал жіберілген кодтан генерациялау үшін. Бүкіл конфигурация бөлімінде сипатталған , оны прото файлдардан жасау қате жіберуді әлдеқайда қиындатады.
Canary сценарийлері, b/g орналастырулары және басқа да көптеген нәрселерді тек динамикалық конфигурацияда дұрыс орындауға болады. Мен оларды статикалық түрде жасауға болмайды деп айтпаймын; бәріміз солай істейміз. Бірақ мұны істеу үшін кез келген теңгерімдегі кейбір уақытша шешімдерге жүгіну керек жіберілген соның ішінде.
Елші міндетті болып табылатын міндеттер:
- Күрделі және динамикалық жүйелердегі трафикті теңдестіру. Бұған қызмет көрсету торы кіреді, бірақ ол міндетті түрде онымен шектелмейді.
- Бөлінген бақылау, күрделі авторизация немесе қол жетімді басқа функциялардың қажеттілігі жіберілген Оны қораптан шығару оңай немесе ыңғайлы, ал nginx/haproxy-де сіз өзіңізді lua және күмәнді плагиндермен орауыңыз керек.
Қажет кезде жоғары өнімділікті қамтамасыз ету үшін екеуі де қол жетімді.
Бұл қалай жұмыс істейді
Envoy тек екілік Docker кескіні ретінде таратылады. Кескінде статикалық конфигурация үлгісі бар, бірақ біз оны құрылымды түсіну үшін ғана қызықтырамыз.
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) деп аталады. and go бағдарламасында тек көзден нысандарды толтыру қажет gRPC деректер жазықтығының дайын іске асырылуы бар.
Конфигурация келесі пішінді алады:
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 минут.
Жалғасы бар.
Ақпарат көзі: www.habr.com
