Елші. 1. Кіріспе

Сәлем! Бұл «елші деген не?», «ол не үшін қажет?» деген сұрақтарға жауап беретін шағын мақала. және «қайдан бастау керек?».

Бұл не

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++
жоқ

Не үшін

Бұл жас жоба, көп нәрсе жетіспейді, кейбіреулері ерте альфада. Бірақ жіберілген, сондай-ақ өзінің жастығына байланысты, қарқынды дамып келеді және қазірдің өзінде көптеген қызықты мүмкіндіктерге ие: динамикалық конфигурация, көптеген дайын сүзгілер, өз сүзгілеріңізді жазуға арналған қарапайым интерфейс.
Қолдану аймақтары осыдан туындайды, бірақ алдымен 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 және онда 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

пікір қалдыру