Ali potrebuje Kubernetes gruča na dveh lokacijah tri volivce etcd?
Tri vozlišča krmilne ravnine na dveh lokacijah VPN še vedno izgubijo kvorum, ko večja lokacija ugasne. Preštejte prave volivce etcd in izberite izgubo, ki jo preživite.
Tri VM krmilne ravnine so videti kot tri možnosti za preživetje slabe noči. Niso, in prav razdalja med tema dvema prepričanjema spremeni urejen dizajn s tremi vozlišči v gručo, ki preneha sprejemati pisanja, ko ena zgradba izgubi napajanje. Povezava VPN med lokacijama naredi stroje dosegljive drug drugemu in težavo skriva, namesto da bi jo rešila. Glasovi se štejejo na člana etcd, in dva od teh članov lahko še vedno sedita za enim stikalom, enim UPS in eno povezavo.
Tri vozlišča krmilne ravnine, ena domena okvare
Zaženete kubectl get nodes, vidite tri vnose krmilne ravnine in gručo zabeležite kot visoko razpoložljivo. Ta številka opisuje načrtovano zmogljivost, ne preživetja. V kubeadm brez zunanjega etcd vsako vozlišče krmilne ravnine gosti tudi člana, zato tri vozlišča res dajo tri volivce. Ali ti volivci odpovedo neodvisno, je ločeno vprašanje, na katero seznam vozlišč ne more odgovoriti.
Dve VM na enem hipervizorju, dva regala na enem napajanju, dve povezavi od enega ponudnika: vsak par je ena domena z dvema imenoma gostitelja. Zapišite postavitev in označite, kaj si deli vsak volivec — hipervizor, PDU, stikalo na vrhu regala, diskovno polje, naprava NAT, koncentrator VPN. Nato na papirju odstranite vsak skupni objekt in znova preštejte preostale glasove. Gruča, ki izgubi dva volivca zaradi enega odpovedanega gostitelja, je bila ves čas gruča z enim volivcem; nihče ji še ni postavil tega vprašanja.
Kaj lahko in česa ne more preživeti razdelitev na dve lokaciji
Ko so trije volivci razporejeni dva in en na dve lokaciji, večja stran ob izginotju druge lokacije obdrži kvorum, stran z enim volivcem pa nikoli. Ta asimetrija je aritmetika, ne nastavljanje. Vsaka gruča etcd, ki temelji na večini in je razporejena natanko na dve neodvisni lokaciji, ne opravi preizkusa »izgubi katero koli lokacijo in nadaljuj s potrjevanjem«, ker bi morali obe strani hkrati imeti več kot polovico glasov.
Spodnja tabela je najhitrejši način, da vidite, katere okvare ste dejansko kupili. Vsako vrstico berite tako: če nocoj izgine cela ta vrstica, ali lahko preživeli še vedno potrdijo pisanje?
| What disappears | Voters left | Writes still commit |
|---|---|---|
| Site B, holding voter 3 | 2 of 3 | Yes |
| Site A, holding voters 1 and 2 | 1 of 3 | No |
| One hypervisor carrying any two voters | 1 of 3 | No |
| The inter-site VPN only | 2 of 3 on one side | Only on the majority side |
Zakaj tunel nikoli ne doda glasu
VPN je prenos, ne član. Lahko naredi oddaljenega volivca dosegljivega in lahko razdelitev spremeni v nekaj, kar je videti kot počasen časovni limit, in to je ves njegov prispevek h kvorumu. Kar doda, so stroški, ker mora vsaka potrditev prečkati povezavo in etcd plača to pot tja in nazaj pri pisanjih, ki se dotikajo dnevnika raft. Pot, ki utripa, spremeni replikacijo v ponovne poskuse in volitve.
Razdelitve so kraj, kjer ljudje pričakujejo magijo, zato bodite o njih natančni. Če povezava pade, medtem ko stari vodja sedi na strani z enim volivcem, ta stran ne more potrditi in vodja odstopi, ko poteče časovni limit volitev, medtem ko stran z dvema volivcema izvoli zamenjavo. Vodnik etcd o načinih okvare preprosto opisuje vedenje: nadaljnja storitev na strani večine, nobena druga zapisljiva gruča na izolirani strani.
Odločite, katero prekinitev kupite
Dva plus ena je zakonita zasnova, ko je lokacija A primarna in sprejmete, da njena izguba pomeni izgubo pisav krmilne ravnine, dokler nekdo ne ukrepa. V pomanjkljivost jo spremeni to, da to odločitev pustite implicitno. Zapišite jo v runbook: s katere lokacije vaša krmilna ravnina preživi in kaj operator naredi, ko druga lokacija ugasne ob 03:00.
Če je zahteva namesto tega »katera koli lokacija lahko odpove«, mora postavitev imeti večino na vsaki lokaciji, in trije volivci na dveh lokacijah tega ne zmorejo. Bodisi dodate resnično neodvisno tretjo domeno — majhna regija pri drugem ponudniku deluje, če je pot do nje stabilna — bodisi se razdelite v dve gruči z ločenim etcd in sprejmete obratovalne stroške te razdelitve. Nobena bližnjica s pričo se temu ne izogne: etcd nima lahke člana razsodnika, zato je tretji volivec polnopravni član z lastnimi zahtevami glede diska, pomnilnika in omrežja. Narisati v diagram polje z oznako priča ne ustvari priče.
Kvorum ni isto kot storitev
Kvorum etcd ohranja strežnik API sposoben sprejemati pisanja in to je vse, kar ohranja. Preverjanja stanja razporejevalnika obremenitve, ingress, dosegljivost CNI skozi tunel, cone pripenjanja nosilcev in replikacija aplikacij vsaka potrebuje svoj odgovor. Gruča ima lahko čisto večino in vseeno uporabnikom ne ponuja nič koristnega.
Nato potrdite članstvo, za katero mislite, da ga imate, ker diagrami se premikajo:
kubectl -n kube-system get pods -l component=etcd -o wide
kubectl get endpoints kube-apiserver -n default
etcdctl member list -w table
Primerjajte seznam članov z načrtom postavitve. Če se dva člana razrešita na istega gostitelja ali isti regal, je napačen načrt in ne gruča, in spreminjanje velikosti okoli napačne topologije kupi le dražjo različico iste prekinitve.
Preden odobrite katero koli zasnovo s tremi volivci, odgovorite na štiri vprašanja: koliko volivcev skupaj izgubi napajanje, katera izguba lokacije še vedno pusti večino, kje sedi vodja, ko tunel pade, in kaj lahko še naredi preživela lokacija. »Nisem prepričan« pri katerem koli od njih pomeni, da gruča še ni visoko razpoložljiva. To so trije stroji, ki so imeli srečo.