Элчи. 1. Киришүү

салам! Бул “элчи деген эмне?”, “эмне үчүн керек?” деген суроолорго жооп берген чакан макала. жана "кайдан баштоо керек?".

Бул эмне

Элчи - бул 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 жигиттери буга аракет кылып жатышат бекитүү. Идея бир жолу ишке ашат жөнөтүлдү RFC ылайыктуулугунун бардык кылдат жактары (зоопарктын баштары) жана конкреттүү ишке ашыруулар үчүн интерфейс түзөт. Бирок азыр ал альфа эмес, архитектура талкууланып жатат, PR ачык (мен пиар макала жазып жатканда, пиар катып калды, бирок бул пункт дагы деле актуалдуу).

Азырынча статика үчүн 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) деп аталат. Java жана ал жерде 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 агымы, ресурстун толук абалы жөнөтүлөт.
  • Өзүнчө агымдар, толук абалы.
  • Бир агым, кошумча абал.
  • Бөлүнгөн агымдар, кошумча абал.

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

Комментарий кошуу