Tus sawv cev. 1. Taw qhia

Nyob zoo! Nov yog ib tsab xov xwm luv luv uas teb cov lus nug: "Dab tsi yog tus sawv cev?", "Vim li cas nws xav tau?" thiab "qhov twg pib?".

Nws yog dab tsi

Envoy yog L4-L7 balancer sau hauv C ++, tsom rau kev ua haujlwm siab thiab muaj. Ntawm qhov tod tes, qhov no yog qee txoj hauv kev analogue ntawm nginx thiab haproxy, piv rau kev ua tau zoo rau lawv. Ntawm qhov tod tes, nws tau taw qhia ntau dua rau microservice architecture thiab muaj kev ua haujlwm tsis zoo dua li java thiab mus balancers, xws li zuul lossis traefik.

Lub rooj sib piv ntawm haproxy / nginx / tus neeg sawv cev, nws tsis lees tias yog qhov tseeb tiag, tab sis muab cov duab dav dav.

nginx
haproxy
tus sawv cev
traefik kev

hnub qub ntawm github
11.2k / daim iav
1.1k / daim iav
12.4k
27.6k

sau rau hauv
C
C
C ++
go

API
tsis muaj
qhov (socket) nkaus xwb/push
dataplane/rub
rub

active kev kuaj mob
tsis muaj
yog
yog
yog

Qhib tracing
lwm plugin
tsis muaj
yog
yog

J.W.T.
lwm plugin
tsis muaj
yog
tsis muaj

extension
Lus/C
Lus/C
Lua/C++
tsis muaj

Vim li cas

Qhov no yog ib txoj haujlwm hluas, muaj ntau yam uas ploj lawm, qee qhov hauv alpha thaum ntxov. Tab sis tus sawv cev, kuj yog vim nws cov tub ntxhais hluas, tab tom txhim kho sai thiab twb muaj ntau yam nthuav dav: dynamic configuration, ntau cov ntxaij lim dej npaj txhij, ib qho yooj yim interface rau kev sau koj tus kheej cov ntxaij lim dej.
Cov cheeb tsam ntawm daim ntawv thov ua raws li qhov no, tab sis ua ntej muaj 2 antipatterns:

  • Static recoil.

Qhov tseeb yog hais tias nyob rau hauv lub caij ntuj no tus sawv cev tsis muaj kev txhawb nqa caching. Cov neeg Google tab tom sim qhov no txhim kho. Lub tswv yim yuav raug muab coj los siv ib zaug tus sawv cev tag nrho cov subtleties (zoo headers) ntawm RFC ua raws, thiab rau kev siv tshwj xeeb ua ib qho interface. Tab sis tam sim no nws tsis yog alpha, lub tsev tsim nyob rau hauv kev sib tham, PR qhib (thaum kuv tab tom sau tsab xov xwm PR, PR froze, tab sis qhov no tseem cuam tshuam).

Tam sim no, siv nginx rau statics.

  • Static configuration.

Koj tuaj yeem siv nws, tab sis tus sawv cev Qhov ntawd tsis yog qhov nws tau tsim rau. Cov yam ntxwv hauv kev teeb tsa zoo li qub yuav tsis raug nthuav tawm. Muaj ntau lub sijhawm:

Thaum kho cov teeb tsa hauv yaml, koj yuav raug yuam kev, cem cov neeg tsim tawm rau kev hais lus thiab xav tias nginx / haproxy configs, txawm tias tsis tshua muaj qauv, yog qhov tseeb. Qhov ntawd yog lub ntsiab lus. Kev teeb tsa ntawm Nginx thiab Haproxy tau tsim los kho los ntawm tes, thiab tus sawv cev rau tiam los ntawm code. Tag nrho configuration yog piav nyob rau hauv ua protobuf, tsim nws los ntawm cov ntaub ntawv proto yog qhov nyuaj dua los ua yuam kev.

Canary, b / g xa tawm scenarios thiab ntau ntxiv yog ib txwm siv tsuas yog hauv kev teeb tsa dynamic. Kuv tsis tau hais tias qhov no ua tsis tau raws li kev cai, peb txhua tus ua. Tab sis rau qhov no koj yuav tsum tau muab tso rau crutches, nyob rau hauv ib qho ntawm cov balancers, nyob rau hauv tus sawv cev suav nrog.

Cov hauj lwm uas Envoy yog indispensable:

  • Traffic ntsuas nyob rau hauv complex thiab dynamic systems. Qhov no suav nrog kev pabcuam mesh, tab sis nws tsis tas yuav yog ib qho xwb.
  • Qhov xav tau kev faib tracing functionality, complex tso cai los yog lwm yam functionality uas muaj nyob rau hauv tus sawv cev tawm ntawm lub thawv los yog yooj yim siv, tab sis hauv nginx / haproxy koj yuav tsum tau nyob ib puag ncig los ntawm lua thiab dubious plugins.

Ob leeg, yog tias tsim nyog, muab kev ua haujlwm siab.

Yuav ua li cas li no ua hauj lwm

Envoy raug faib rau hauv binaries nkaus xwb raws li daim duab docker. Daim duab twb muaj piv txwv ntawm kev teeb tsa zoo li qub. Tab sis peb txaus siab rau nws tsuas yog kom nkag siab txog cov qauv.

envoy.yaml static configuration

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 configuration

Peb tab tom nrhiav kev daws teeb meem dab tsi? Koj tuaj yeem tsis tsuas yog rov ua haujlwm load balancer configuration nyob rau hauv load; "me" teeb meem yuav tshwm sim:

  • Configuration validation.

Lub config tuaj yeem loj, nws tuaj yeem loj heev, yog tias peb overload nws tag nrho ib zaug, qhov kev pheej hmoo ntawm qhov yuam kev nce.

  • Kev sib txuas mus ntev.

Thaum pib tus neeg mloog tshiab, koj yuav tsum tau saib xyuas cov kev sib txuas ua haujlwm ntawm qhov qub; yog tias kev hloov pauv tshwm sim ntau zaus thiab muaj kev sib txuas mus ntev, koj yuav tau nrhiav kev sib haum xeeb. Nyob zoo, kubernetes ingress ntawm nginx.

  • Kev tshuaj xyuas kev noj qab haus huv.

Yog tias peb muaj kev kuaj xyuas kev noj qab haus huv, peb yuav tsum tau kuaj xyuas lawv ob zaug hauv qhov kev teeb tsa tshiab ua ntej xa tsheb khiav. Yog tias muaj dej ntws ntau, qhov no yuav siv sijhawm. Nyob zoo haproxy.

Qhov no daws tau li cas hauv tus sawv cevLos ntawm kev thauj cov config dynamically, raws li tus qauv pas dej ua ke, koj tuaj yeem faib nws mus rau hauv cov khoom sib cais thiab tsis rov pib dua qhov uas tsis tau hloov. Piv txwv li, ib tug mloog, uas yog kim reinitialize thiab tsis tshua muaj kev hloov.

Configuration tus sawv cev (los ntawm cov ntaub ntawv saum toj no) muaj cov chaw hauv qab no:

  • cov mloog - tus neeg mloog dai ntawm ib qho tshwj xeeb ip / chaw nres nkoj
  • virtual host - virtual host los ntawm lub npe sau
  • txoj kev - kev ntsuas ntsuas
  • pawg - ib pawg ntawm cov dej ntws nrog qhov ntsuas ntsuas
  • xaus - qhov chaw nyob sab saud

Txhua lub koom haum no ntxiv rau qee qhov lwm tus tuaj yeem sau rau hauv dynamically; rau qhov no, kev teeb tsa qhia qhov chaw nyob ntawm qhov kev pabcuam los ntawm qhov chaw teeb tsa yuav tau txais. Cov kev pabcuam tuaj yeem yog REST lossis gRPC, gRPC yog qhov zoo dua.

Cov kev pabcuam muaj npe raws li: LDS, VHDS, RDS, CDS thiab EDS. Koj tuaj yeem sib txuas cov kev teeb tsa zoo li qub thiab dynamic, nrog rau qhov txwv tsis pub muaj peev xwm tsis tuaj yeem teev nyob rau hauv ib qho zoo li qub.

Rau feem ntau cov haujlwm, nws txaus los siv peb qhov kev pabcuam kawg, lawv hu ua ADS (Aggregated Discovery Service), rau java thiab mus muaj kev npaj ua tiav ntawm gRPC dataplane uas koj tsuas yog xav tau sau cov khoom los ntawm koj qhov chaw.

Lub configuration yuav siv cov hauv qab no:

envoy.yaml dynamic configuration

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

Thaum pib tus sawv cev nrog rau qhov kev teeb tsa no, nws yuav txuas mus rau lub dav hlau tswj thiab sim thov RDS, CDS thiab EDS teeb tsa. Cov txheej txheem kev sib cuam tshuam tshwm sim li cas tau piav qhia no.

Hauv luv luv, tus sawv cev xa ib daim ntawv thov uas qhia txog hom kev pab tau thov, lub version thiab qhov tsis muaj ntawm node. Hauv kev teb, nws tau txais cov peev txheej thiab ib qho version; yog tias lub version ntawm lub dav hlau tswj tsis tau hloov, nws tsis teb.
Muaj 4 txoj kev sib txuas lus:

  • Ib qho gRPC kwj rau txhua hom kev pabcuam, tag nrho cov xwm txheej ntawm cov peev txheej raug xa mus.
  • Cais cov kwj deg, tag nrho cov xwm txheej.
  • Ib tug kwj, incremental xeev.
  • Cais cov kwj deg, incremental xeev.

Incremental xDS tso cai rau koj los txo cov tsheb khiav ntawm kev tswj-dav hlau thiab tus sawv cev, qhov no muaj feem xyuam rau loj configurations. Tab sis nws nyuaj rau kev sib cuam tshuam; qhov kev thov muaj cov npe ntawm cov peev txheej rau unsubscribing thiab subscribing.

Peb qhov piv txwv siv ADS - ib qho kwj rau RDS, CDS, EDS thiab hom uas tsis yog nce ntxiv. Txhawm rau pab txhawb hom incremental, koj yuav tsum qhia meej api_type: DELTA_GRPC

Txij li thaum qhov kev thov muaj cov node tsis, peb tuaj yeem xa cov peev txheej sib txawv rau lub dav hlau tswj rau ntau zaus tus sawv cev, qhov no yog qhov yooj yim rau kev tsim cov kev pabcuam mesh.

Ua kom sov

rau tus sawv cev thaum pib lossis thaum tau txais kev teeb tsa tshiab los ntawm kev tswj-dav dav hlau, cov txheej txheem kev tsim khoom tau pib. Nws muab faib ua cov neeg mloog warmup thiab pawg warmup. Thawj yog pib thaum muaj kev hloov pauv hauv RDS/LDS, qhov thib ob thaum CDS/EDS. Qhov no txhais tau hais tias yog tsuas yog hloov pauv, tus mloog yuav tsis rov tsim dua.

Thaum lub sij hawm sov so, cov kev pab cuam yuav tsum tau los ntawm kev tswj-dav hlau thaum lub sij hawm tawm. Yog tias lub sijhawm dhau los, kev pib yuav tsis ua tiav thiab tus neeg mloog tshiab yuav tsis pib mloog ntawm qhov chaw nres nkoj.
Initialization Order: EDS, CDS, Active Health Check, RDS, LDS. Nrog rau kev kuaj xyuas kev noj qab haus huv tau qhib, kev khiav tsheb yuav nce mus tom qab ib qho kev kuaj mob ua tiav.

Yog tias tus mloog tau tsim dua tshiab, qhov qub nkag mus rau hauv lub xeev DRAIN thiab yuav raug muab tshem tawm tom qab txhua qhov kev sib txuas raug kaw lossis lub sijhawm tas sijhawm --drain-time-s, default 10 feeb.

Kom txuas ntxiv.

Tau qhov twg los: www.hab.com

Ntxiv ib saib