Mjumbe. 1. Utangulizi

Salamu! Hii ni nakala fupi inayojibu maswali: "mjumbe ni nini?", "Kwa nini inahitajika?" na "wapi kuanza?".

Nini hii

Mjumbe ni kusawazisha L4-L7 iliyoandikwa kwa C++, inayolenga utendakazi wa hali ya juu na upatikanaji. Kwa upande mmoja, hii ni kwa namna fulani analog ya nginx na haproxy, kulinganishwa katika utendaji wao. Kwa upande mwingine, imeelekezwa zaidi kuelekea usanifu wa huduma ndogo na haina utendakazi mbaya zaidi kuliko visawazishi vya java na go, kama vile zuul au traefik.

Jedwali la kulinganisha la haproxy/nginx/mjumbe, halidai kuwa ukweli kabisa, lakini linatoa picha ya jumla.

nginx
haproxy
mjumbe
traefik

nyota kwenye github
11.2k/kioo
1.1k/kioo
12.4k
27.6k

iliyoandikwa ndani
C
C
C + +
go

API
hakuna
tundu pekee/sukuma
dataplane/vuta
kuvuta

ukaguzi wa afya unaofanya kazi
hakuna
ndiyo
ndiyo
ndiyo

Ufuatiliaji wazi
programu-jalizi ya nje
hakuna
ndiyo
ndiyo

J.W.T.
programu-jalizi ya nje
hakuna
ndiyo
hakuna

ugani
Lua/C
Lua/C
Lua/C++
hakuna

Kwa nini

Huu ni mradi mchanga, kuna vitu vingi vinakosekana, vingine katika alfa ya mapema. Lakini mjumbe, pia kutokana na ujana wake, inaendelea kwa kasi na tayari ina vipengele vingi vya kuvutia: usanidi wa nguvu, filters nyingi zilizopangwa tayari, interface rahisi ya kuandika filters zako mwenyewe.
Maeneo ya maombi yanafuata kutoka kwa hili, lakini kwanza kuna antipatterns 2:

  • Kurudi tuli.

Ukweli ni kwamba kwa sasa katika mjumbe hakuna usaidizi wa kache. Vijana wa Google wanajaribu hii fix. Wazo hilo litatekelezwa mara moja mjumbe hila zote (vichwa vya bustani ya wanyama) vya kufuata RFC, na kwa utekelezaji mahususi tengeneza kiolesura. Lakini kwa sasa sio hata alpha, usanifu unajadiliwa, PR wazi (nilipokuwa nikiandika nakala ya PR, PR iliganda, lakini hatua hii bado inafaa).

Kwa sasa, tumia nginx kwa statics.

  • Usanidi wa tuli.

Unaweza kuitumia, lakini mjumbe Hiyo sio iliundwa kwa ajili yake. Vipengele katika usanidi tuli havitafichuliwa. Kuna nyakati nyingi:

Wakati wa kuhariri usanidi katika yaml, utakosea, karipia wasanidi programu kwa kitenzi na ufikirie kuwa usanidi wa nginx/haproksi, ingawa haujapangwa vizuri, ni fupi zaidi. Hiyo ndiyo hatua. Usanidi wa Nginx na Haproxy iliundwa kwa uhariri kwa mkono, na mjumbe kwa kizazi kutoka kwa nambari. Usanidi mzima umeelezewa katika protobuf, kuitengeneza kutoka kwa faili za proto ni ngumu zaidi kufanya makosa.

Canary, b/g matukio ya uwekaji na mengine mengi kwa kawaida hutekelezwa tu katika usanidi unaobadilika. Sisemi kwamba hii haiwezi kufanywa kwa takwimu, sote tunafanya. Lakini kwa hili unahitaji kuweka juu ya magongo, katika yoyote ya mizani, katika mjumbe pamoja na.

Kazi ambazo Mjumbe ni wa lazima:

  • Usawazishaji wa trafiki katika mifumo ngumu na inayobadilika. Hii ni pamoja na matundu ya huduma, lakini sio lazima pekee.
  • Haja ya utendakazi wa ufuatiliaji uliosambazwa, uidhinishaji changamano au utendakazi mwingine unaopatikana ndani mjumbe nje ya kisanduku au kutekelezwa kwa urahisi, lakini katika nginx/haproksi unahitaji kuzungukwa na lua na programu-jalizi zenye shaka.

Wote wawili, ikiwa ni lazima, hutoa utendaji wa juu.

Jinsi gani kazi hii

Mjumbe husambazwa katika jozi tu kama picha ya kituo. Picha tayari ina mfano wa usanidi tuli. Lakini tunavutiwa nayo tu kwa kuelewa muundo.

usanidi tuli wa 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

Usanidi wa nguvu

Tunatafuta suluhu la tatizo gani? Huwezi tu kupakia upya usanidi wa kusawazisha mzigo chini ya mzigo; matatizo "ndogo" yatatokea:

  • Uthibitishaji wa usanidi.

Usanidi unaweza kuwa mkubwa, unaweza kuwa mkubwa sana, ikiwa tutaipakia yote mara moja, uwezekano wa kosa mahali fulani huongezeka.

  • Viunganisho vya muda mrefu.

Unapoanzisha msikilizaji mpya, unahitaji kutunza miunganisho inayoendesha ile ya zamani; ikiwa mabadiliko yanatokea mara kwa mara na kuna miunganisho ya muda mrefu, itabidi utafute maelewano. Hujambo, kubernetes ingress kwenye nginx.

  • Vipimo vya afya vilivyo hai.

Ikiwa tuna ukaguzi wa afya unaoendelea, tunahitaji kuziangalia mara mbili zote katika usanidi mpya kabla ya kutuma trafiki. Ikiwa kuna mito mingi ya juu, hii inachukua muda. Habari Haproxy.

Hii inatatuliwa vipi katika mjumbeKwa kupakia usanidi kwa nguvu, kulingana na mfano wa bwawa, unaweza kuigawanya katika sehemu tofauti na sio kuanzisha tena sehemu ambayo haijabadilika. Kwa mfano, msikilizaji, ambayo ni ghali kuanzisha upya na mara chache hubadilika.

Usanidi mjumbe (kutoka kwa faili iliyo hapo juu) ina vyombo vifuatavyo:

  • msikilizaji β€” msikilizaji akining'inia kwenye ip/bandari maalum
  • mwenyeji wa kawaida - mwenyeji wa kawaida kwa jina la kikoa
  • njia - kanuni ya kusawazisha
  • nguzo - kundi la mito ya juu yenye vigezo vya kusawazisha
  • Mwisho - anwani ya mfano wa juu

Kila moja ya huluki hizi pamoja na zingine zinaweza kujazwa kwa nguvu; kwa hili, usanidi unabainisha anwani ya huduma kutoka ambapo usanidi utapokelewa. Huduma inaweza kuwa REST au gRPC, gRPC inafaa zaidi.

Huduma zinaitwa kwa mtiririko huo: LDS, VHDS, RDS, CDS na EDS. Unaweza kuchanganya usanidi tuli na unaobadilika, na kizuizi kwamba rasilimali inayobadilika haiwezi kubainishwa katika tuli.

Kwa kazi nyingi, inatosha kutekeleza huduma tatu za mwisho, zinaitwa ADS (Huduma ya Ugunduzi wa Jumla), kwa Java na nenda kuna utekelezaji tayari wa dataplane ya gRPC ambayo unahitaji tu kujaza vitu kutoka kwa chanzo chako.

Mpangilio unachukua fomu ifuatayo:

usanidi wa nguvu wa 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

Wakati wa kukimbia mjumbe kwa usanidi huu, itaunganishwa kwenye ndege-dhibiti na kujaribu kuomba usanidi wa RDS, CDS na EDS. Jinsi mchakato wa mwingiliano hutokea umeelezwa hapa.

Kwa kifupi, mjumbe hutuma ombi linaloonyesha aina ya rasilimali inayoombwa, toleo na vigezo vya nodi. Kwa kujibu, inapokea rasilimali na toleo; ikiwa toleo kwenye ndege ya kudhibiti halijabadilika, haijibu.
Kuna chaguzi 4 za mwingiliano:

  • Mtiririko mmoja wa gRPC kwa kila aina ya rasilimali, hali kamili ya rasilimali inatumwa.
  • Mito tofauti, hali kamili.
  • Mtiririko mmoja, hali ya ongezeko.
  • Mitiririko tofauti, hali ya ongezeko.

Ongezeko la xDS hukuruhusu kupunguza trafiki kati ya ndege ya kudhibiti na mjumbe, hii ni muhimu kwa usanidi mkubwa. Lakini inatatiza mwingiliano; ombi lina orodha ya rasilimali za kujiondoa na kujisajili.

Mfano wetu unatumia ADS - mtiririko mmoja wa RDS, CDS, EDS na hali isiyo ya nyongeza. Ili kuwezesha hali ya ongezeko, unahitaji kubainisha api_type: DELTA_GRPC

Kwa kuwa ombi lina vigezo vya nodi, tunaweza kutuma rasilimali tofauti kwa ndege ya kudhibiti kwa matukio tofauti mjumbe, hii ni rahisi kwa kujenga mesh ya huduma.

Jitayarishe

Cha mjumbe wakati wa kuanza au wakati wa kupokea usanidi mpya kutoka kwa ndege-dhibiti, mchakato wa uboreshaji wa rasilimali unazinduliwa. Imegawanywa katika warmup ya wasikilizaji na warmup ya nguzo. Ya kwanza inazinduliwa wakati kuna mabadiliko katika RDS/LDS, ya pili wakati CDS/EDS. Hii ina maana kwamba ikiwa tu mipasho ya juu itabadilika, msikilizaji hajaundwa upya.

Wakati wa mchakato wa kuongeza joto, rasilimali tegemezi zinatarajiwa kutoka kwa ndege ya kudhibiti wakati wa kuisha. Ikiwa muda umeisha, uanzishaji hautafaulu na msikilizaji mpya hataanza kusikiliza kwenye mlango.
Agizo la uanzishaji: EDS, CDS, ukaguzi wa afya unaoendelea, RDS, LDS. Huku ukaguzi wa afya ukiwa umewezeshwa, trafiki itaenda juu tu baada ya ukaguzi mmoja wa afya uliofaulu.

Ikiwa kisikilizaji kiliundwa upya, ile ya zamani itaingia katika hali ya DRAIN na itafutwa baada ya miunganisho yote kufungwa au muda wa kuisha kuisha. --drain-time-s, dakika 10 chaguomsingi.

Ili kuendelea.

Chanzo: mapenzi.com

Kuongeza maoni