Изасланик. 1. Представљање

Велики поздрав! Ово је кратак чланак који одговара на питања: "шта је изасланик?", "зашто је потребан?" и "где да почнем?".

Шта је ово

Енвои је Л4-Л7 балансер написан на Ц++, фокусиран на високе перформансе и доступност. С једне стране, ово је на неки начин аналог нгинк-а и хапроки-ја, упоредив по перформансама са њима. С друге стране, више је оријентисан на микросервисну архитектуру и има функционалност ништа лошију од јава и го балансера, као што су зуул или траефик.

Табела поређења хапроки/нгинк/енвои, не тврди да је апсолутна истина, али даје општу слику.

Апацхе
хапрокси
изасланик
траефик

звезде на гитхуб-у
11.2к/огледало
1.1к/огледало
КСНУМКСк
КСНУМКСк

уписано у
C
C
Ц + +
go

АПИ за
не
само утичница/притиснути
датаплане/пулл
повући

активни здравствени преглед
не
да
да
да

Отворено праћење
спољни додатак
не
да
да

ЈВТ
спољни додатак
не
да
не

продужетак
Луа/Ц
Луа/Ц
Луа/Ц++
не

За шта

Ово је млад пројекат, недостаје много ствари, неке у раној алфи. Али изасланик, такође због своје младости, брзо се развија и већ има много занимљивих карактеристика: динамичку конфигурацију, много готових филтера, једноставан интерфејс за писање сопствених филтера.
Области примене следе из овога, али прво постоје 2 антиобрасци:

  • Статички трзај.

Чињеница је да у овом тренутку у изасланик нема подршке за кеширање. Момци из Гугла покушавају ово поправити. Идеја ће бити реализована једном у изасланик све суптилности (зоо заглавља) усклађености са РФЦ-ом, а за специфичне имплементације направити интерфејс. Али за сада није чак ни алфа, архитектура је у дискусији, PR отворен (док сам писао ПР чланак, ПР се замрзнуо, али ова тачка је и даље релевантна).

За сада, користите нгинк за статику.

  • Статичка конфигурација.

Можете га користити, али изасланик Није за то створено. Карактеристике у статичкој конфигурацији неће бити изложене. Има много тренутака:

Када уређујете конфигурацију у иамл-у, погрешићете, прекорићете програмере за опширност и мислити да су нгинк/хапроки конфигурације, иако мање структуриране, сажетије. То је поента. Конфигурација Нгинк-а и Хапроки-а креирана је за ручно уређивање и изасланик за генерисање из кода. Целокупна конфигурација је описана у протобуф, генерисањем из прото датотека је много теже направити грешку.

Цанари, б/г сценарији примене и још много тога се обично примењују само у динамичкој конфигурацији. Не кажем да то не може да се ради статично, сви то радимо. Али за ово морате ставити штаке, у било који од балансера, у изасланик укључујући.

Послови за које је изасланик неопходан:

  • Балансирање саобраћаја у сложеним и динамичким системима. Ово укључује сервисну мрежу, али није нужно једина.
  • Потреба за функционалношћу дистрибуираног праћења, сложеном ауторизацијом или другом функционалношћу која је доступна у изасланик ван кутије или практично имплементиран, али у нгинк/хапроки морате бити окружени луа и сумњивим додацима.

Оба, ако је потребно, пружају високе перформансе.

Како ово ради

Енвои се дистрибуира у бинарним датотекама само као доцкер слика. Слика већ садржи пример статичне конфигурације. Али нас то занима само за разумевање структуре.

енвои.иамл статичка конфигурација

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 минута.

Наставити.

Извор: ввв.хабр.цом

Додај коментар