салам! Бул “элчи деген эмне?”, “эмне үчүн керек?” деген суроолорго жооп берген чакан макала. жана "кайдан баштоо керек?".
Бул эмне
Элчи - бул C++ тилинде жазылган, жогорку өндүрүмдүүлүккө жана жеткиликтүүлүккө багытталган L4-L7 баланстоочусу. Бир жагынан алганда, бул кандайдыр бир жол менен nginx жана haproxy аналогу, алар менен салыштырууга болот. Башка жагынан алганда, ал микросервис архитектурасына көбүрөөк багытталган жана zuul же traefik сыяктуу java жана go балансерлеринен кем эмес функционалдуулукка ээ.
Haproxy/nginx/envoy салыштыруу таблицасы, ал абсолюттук чындык деп ырастабайт, бирок жалпы сүрөттү берет.
жөргөмүш
гапрокси
жөнөтүлдү
траефик
githubдагы жылдыздар
11.2к/күзгү
1.1к/күзгү
12.4k
27.6k
жазылган
C
C
C ++
go
API
жок
розетка гана/түртүү
маалымат тактасы/тартуу
тартуу
активдүү ден соолук текшерүү
жок
ооба
ооба
ооба
Ачык чалгындоо
тышкы плагин
жок
ооба
ооба
J.W.T.
тышкы плагин
жок
ооба
жок
узартуу
Lua/C
Lua/C
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
Динамикалык конфигурация
Биз кандай көйгөйдү чечүү жолун издеп жатабыз? Жүктөлүп жатканда жүк балансынын конфигурациясын жөн эле кайра жүктөй албайсыз; "майда" көйгөйлөр пайда болот:
- Конфигурацияны текшерүү.
Конфигурация чоң болушу мүмкүн, ал абдан чоң болушу мүмкүн, эгерде биз муну бир эле учурда ашыкча жүктөсөк, кандайдыр бир жерде ката болуу ыктымалдыгы жогорулайт.
- Узак мөөнөттүү байланыштар.
Жаңы угуучуну инициализациялоодо, сиз эскисинде иштеп жаткан туташууларга кам көрүшүңүз керек; эгер өзгөрүүлөр тез-тез болуп турса жана узакка созулган байланыштар болсо, компромисс издөөгө туура келет. Салам, kubernetes 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 агымы, ресурстун толук абалы жөнөтүлөт.
- Өзүнчө агымдар, толук абалы.
- Бир агым, кошумча абал.
- Бөлүнгөн агымдар, кошумча абал.
Incremental xDS сиз башкаруучу учак менен трафикти азайтууга мүмкүндүк берет жөнөтүлдү, бул чоң конфигурацияларга тиешелүү. Бирок бул өз ара аракеттенүүнү кыйындатат; суроо-талап жазылууну токтотуу жана жазылуу үчүн ресурстардын тизмесин камтыйт.
Биздин мисалда ADS колдонулат - RDS, CDS, EDS жана кошумча эмес режим үчүн бир агым. кошумча режимди иштетүү үчүн, сиз көрсөтүү керек api_type: DELTA_GRPC
Сурам түйүн параметрлерин камтыгандыктан, биз ар кандай инстанциялар үчүн башкаруу тегиздигине ар кандай ресурстарды жөнөтө алабыз жөнөтүлдү, бул тейлөө тармагын куруу үчүн ыңгайлуу.
Кызытуу
боюнча жөнөтүлдү ишке киргизүүдө же башкаруучу учактан жаңы конфигурацияны алууда, ресурсту жылытуу процесси ишке киргизилет. Ал угуучуну жылытуу жана кластердик жылытуу болуп бөлүнөт. Биринчиси RDS/LDSде өзгөрүүлөр болгондо, экинчиси CDS/EDS болгондо ишке киргизилет. Бул жогорку агым гана өзгөрсө, угуучу кайра жаралбайт дегенди билдирет.
Жылытуу процессинде, тайм-аут учурунда контролдук учактан көз каранды ресурстар күтүлөт. Эгер күтүү аяктаса, инициализация ийгиликтүү болбойт жана жаңы угуучу порттон уга албайт.
Инициализация тартиби: EDS, CDS, активдүү ден соолукту текшерүү, RDS, LDS. Активдүү ден соолук текшерүүлөрү иштетилгенде, жол кыймылы бир жолу ийгиликтүү текшерүүдөн кийин гана өйдө көздөй кетет.
Эгер угуучу кайра түзүлсө, эскиси DRAIN абалына өтөт жана бардык туташуулар жабылгандан кийин же таймаут аяктагандан кийин жок кылынат --drain-time-s
, демейки 10 мүнөт.
Уландысы бар.
Source: www.habr.com