Елші. 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++
жоқ

Не үшін

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

  • Статикалық кері қайтару.

Мәселе мынада, қазіргі уақытта жіберілген Кэштеу қолдауы жоқ. Google-дағы жігіттер оны түзетуге тырысуда. түзетуОны анда-санда жүзеге асыру идеясы жіберілген RFC сәйкестігінің барлық нәзіктіктері (тақырыптар хайуанаттар бағы) және нақты іске асыру үшін интерфейсті жасаңыз. Бірақ бұл әлі альфа емес; архитектурасы әлі талқылануда. PR ашық (мақала жазып жатқанда PR біріктірілді, бірақ бұл мәселе әлі де өзекті).

Осы уақытта статика үшін nginx пайдаланыңыз.

  • Статикалық конфигурация.

Сіз оны пайдалана аласыз, бірақ жіберілген Ол осы мақсат үшін жасалмаған. Статикалық конфигурацияның мүмкіндіктері толық іске асырылмайды. Көптеген нүктелер бар:

YAML конфигурациясын өңдеген кезде қателіктер жіберіп, әзірлеушілерді тым егжей-тегжейлі деп қарғап, nginx/haproxy конфигурациялары құрылымы азырақ болса да, қысқарақ деп ойлайсыз. Мәселе мынада. Nginx және Haproxy конфигурациялары қолмен өңдеу үшін жасалған, ал жіберілген кодтан генерациялау үшін. Бүкіл конфигурация бөлімінде сипатталған протобуф, оны прото файлдардан жасау қате жіберуді әлдеқайда қиындатады.

Canary сценарийлері, b/g орналастырулары және басқа да көптеген нәрселерді тек динамикалық конфигурацияда дұрыс орындауға болады. Мен оларды статикалық түрде жасауға болмайды деп айтпаймын; бәріміз солай істейміз. Бірақ мұны істеу үшін кез келген теңгерімдегі кейбір уақытша шешімдерге жүгіну керек жіберілген соның ішінде.

Елші міндетті болып табылатын міндеттер:

  • Күрделі және динамикалық жүйелердегі трафикті теңдестіру. Бұған қызмет көрсету торы кіреді, бірақ ол міндетті түрде онымен шектелмейді.
  • Бөлінген бақылау, күрделі авторизация немесе қол жетімді басқа функциялардың қажеттілігі жіберілген Оны қораптан шығару оңай немесе ыңғайлы, ал nginx/haproxy-де сіз өзіңізді lua және күмәнді плагиндермен орауыңыз керек.

Қажет кезде жоғары өнімділікті қамтамасыз ету үшін екеуі де қол жетімді.

Бұл қалай жұмыс істейді

Envoy тек екілік Docker кескіні ретінде таратылады. Кескінде статикалық конфигурация үлгісі бар, бірақ біз оны құрылымды түсіну үшін ғана қызықтырамыз.

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 and go бағдарламасында тек көзден нысандарды толтыру қажет 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

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