фиристода. 1. Муқаддима

Салом! Ин мақолаи кӯтоҳест, ки ба саволҳои "фиристода чист?", "чаро лозим аст?" ва "аз куҷо оғоз кардан?".

Ин чист?

Envoy як мувозинати L4-L7 мебошад, ки дар C++ навишта шудааст, ки ба иҷрои баланд ва дастрасӣ нигаронида шудааст. Аз як тараф, ин ба андозае аналоги nginx ва haproxy аст, ки дар иҷрои онҳо бо онҳо муқоиса карда мешавад. Аз тарафи дигар, он бештар ба меъмории микросервис нигаронида шудааст ва функсияҳо аз java ва go balansers, ба монанди zuul ё traefik бадтар нест.

Ҷадвали муқоисавии haproxy/nginx/envoy, он даъвои ҳақиқати мутлақ нест, балки тасвири умумиро медиҳад.

nginx
гапроксӣ
фиристода
траефик

ситораҳо дар github
11.2к/оина
1.1к/оина
12.4k
27.6k

навишта шудааст
C
C
C ++
go

API
нест
танҳо розетка/пуш
ҳавопаймои маълумотӣ / кашед
Кашидан

санҷиши саломатии фаъол
нест
ҳа
ҳа
ҳа

Пайгирии кушод
плагини беруна
нест
ҳа
ҳа

J.W.T.
плагини беруна
нест
ҳа
нест

Васеъ
Луа/С
Луа/С
Lua/C++
нест

Барои чӣ

Ин як лоиҳаи ҷавон аст, бисёр чизҳо намерасанд, баъзеҳо дар аввали алфа. Аммо фиристода, инчунин аз сабаби ҷавонии худ, босуръат инкишоф меёбад ва аллакай бисёр хусусиятҳои ҷолиб дорад: конфигуратсияи динамикӣ, бисёр филтрҳои тайёр, интерфейси оддӣ барои навиштани филтрҳои шахсии худ.
Соҳаҳои татбиқ аз ин бармеоянд, аммо дар аввал 2 антипаттерн мавҷуданд:

  • Бозгашти статикӣ.

Гап дар сари он аст, ки дар айни замон дар фиристода дастгирии кэш нест. Бачаҳои Google ин кӯшиш мекунанд барои ислоҳ кардан. Идея як бор ба амал бароварда мешавад фиристода ҳама нозукиҳои (сарлавҳаҳои зоопарк) мутобиқати RFC ва барои татбиқи мушаххас интерфейси худро эҷод мекунанд. Аммо ҳоло он ҳатто алфа нест, меъморӣ мавриди баррасӣ қарор дорад, PR кушода (вақте ки ман мақолаи PR-ро менавиштам, 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

Конфигуратсияи динамикӣ

Мо роҳи ҳалли кадом мушкилотро меҷӯем? Шумо наметавонед танҳо конфигуратсияи мувозинати сарборро дар зери бори дубора бор кунед; мушкилоти "хурд" ба миён меоянд:

  • Тасдиқи конфигуратсия.

Конфигуратсия метавонад калон бошад, он метавонад хеле калон бошад, агар мо онро якбора аз ҳад зиёд бор кунем, эҳтимолияти хатогӣ дар ҷое зиёд мешавад.

  • Пайвастҳои дарозмуддат.

Ҳангоми оғоз кардани шунавандаи нав, шумо бояд дар бораи пайвастҳои дар кӯҳна коркунанда ғамхорӣ кунед; агар тағирот зуд-зуд рух диҳад ва пайвастагиҳои дарозмуддат вуҷуд дошта бошанд, шумо бояд созишро ҷустуҷӯ кунед. Салом, кубернетҳо ба nginx ворид мешаванд.

  • Санҷиши саломатии фаъол.

Агар мо санҷишҳои фаъоли саломатӣ дошта бошем, мо бояд пеш аз фиристодани трафик ҳамаи онҳоро дар конфигуратсияи нав дубора тафтиш кунем. Агар ҷараёнҳои болоӣ зиёд бошанд, ин вақтро мегирад. Салом хапрокси.

Ин чӣ гуна ҳал карда мешавад фиристодаБо боркунии конфигуратсия ба таври динамикӣ, мувофиқи модели ҳавз, шумо метавонед онро ба қисмҳои алоҳида тақсим кунед ва қисми тағирнашударо дубора оғоз накунед. Масалан, шунаванда, ки барои аз нав оғоз кардан гарон аст ва кам тағйир меёбад.

Танзимот фиристода (аз файли боло) дорои объектҳои зерин аст:

  • шунаванда — шунаванда дар IP/порти мушаххас овезон аст
  • мизбони виртуалӣ - мизбони виртуалӣ аз рӯи номи домен
  • масир - қоидаи мувозинат
  • кластер — як гурухи болооб бо параметрхои мувозинат
  • охири нуқта — суроғаи инстанси болоӣ

Ҳар яке аз ин объектҳо ва баъзеи дигар метавонанд ба таври динамикӣ пур карда шаванд; барои ин конфигуратсия суроғаи хидматро аз куҷо қабул кардани конфигуратсияро муайян мекунад. Хидмат метавонад REST ё gRPC бошад, gRPC афзалтар аст.

Хизматҳо мутаносибан номгузорӣ шудаанд: LDS, VHDS, RDS, CDS ва EDS. Шумо метавонед конфигуратсияи статикӣ ва динамикиро якҷоя кунед, бо маҳдудияте, ки манбаи динамикӣ дар як манбаи статикӣ муайян карда намешавад.

Барои аксари вазифаҳо татбиқи се хидмати охирин кифоя аст, ки онҳо ADS (Aggregated Discovery Service) номида мешаванд. java ва ба он ҷо равед, татбиқи тайёри dataplane 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 дақиқа.

Идома дода шавад.

Манбаъ: will.com

Илова Эзоҳ