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
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
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
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
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