Drie beheervlak-VM's voel soos drie kanse om 'n slegte nag te oorleef. Hulle is nie, en die afstand tussen daardie twee oortuigings is wat 'n netjiese drie-nodus-ontwerp verander in 'n kluster wat ophou skryf aanvaar wanneer een gebou krag verloor. 'n VPN-skakel tussen die terreine maak die masjiene vir mekaar bereikbaar en verberg die probleem eerder as om dit op te los. Stemme word per etcd-lid getel, en twee van daardie lede kan steeds agter een skakelaar, een UPS en een opvoerlyn sit.

Drie beheervlak-nodusse, een foutdomein

Jy hardloop kubectl get nodes, sien drie beheervlak-inskrywings en lys die kluster as hoogs beskikbaar. Daardie telling beskryf skeduleerbare kapasiteit, nie oorlewing nie. In kubeadm wat sonder 'n eksterne etcd gehou word, huisves elke beheervlak-nodus ook 'n lid, so drie nodusse gee jou werklik drie stemmers. Of daardie stemmers onafhanklik faal, is 'n aparte vraag wat die noduslys nie kan antwoord nie.

Twee VM's op een hipervisor, twee rakke op een kragtoevoer, twee opvoerlyne van een ISP: elke paar is 'n enkele domein met twee hostname. Skryf die plasing neer en merk wat elke stemmer deel — hipervisor, PDU, top-of-rack-skakelaar, stoormatrys, NAT-toestel, VPN-konsentrator. Verwyder dan elke gedeelde objek op papier en hertel die stemme wat oorbly. 'n Kluster wat twee stemmers aan een gefaalde gasheer verloor, was heeltyd 'n enkelstemmer-kluster; niemand het dit nog die vraag gevra nie.

Wat 'n tweeterrein-splitsing kan oorleef en nie kan oorleef nie

Met drie stemmers wat twee en een oor twee terreine geplaas is, behou die groter kant kworum wanneer die ander terrein verdwyn, en die enkelstemmer-kant nooit nie. Daardie asimmetrie is rekenkunde, nie instelling nie. Enige meerderheidsgebaseerde etcd-kluster wat oor presies twee onafhanklike terreine versprei is, faal die toets "verloor enige terrein en hou aan commit", want albei kante sou terselfdertyd meer as die helfte van die stemme moes hou.

Die tabel hieronder is die vinnigste manier om te sien watter mislukkings jy werklik gekoop het. Lees elke ry so: as hierdie hele ry vanaand verdwyn, kan die oorlewendes nog 'n skryf commit?

What disappearsVoters leftWrites still commit
Site B, holding voter 32 of 3Yes
Site A, holding voters 1 and 21 of 3No
One hypervisor carrying any two voters1 of 3No
The inter-site VPN only2 of 3 on one sideOnly on the majority side

Hoekom die tonnel nooit 'n stem byvoeg nie

'n VPN is vervoer, nie 'n lid nie. Dit kan 'n afgeleë stemmer bereikbaar maak en dit kan 'n partisie verander in iets wat soos 'n stadige tydsverloop lyk, en dit is die geheel van sy bydrae tot kworum. Wat dit wel byvoeg, is koste, want elke commit moet die skakel kruis en etcd betaal daardie retoer op skryfwerk wat die raft-log raak. 'n Pad wat fladder, verander replikasie in herpogings en verkiesings.

Partisies is waar mense towerkuns verwag, so wees presies daaroor. As die skakel val terwyl die ou leier aan die enkelstemmer-kant sit, kan daardie kant nie commit nie en die leier tree af sodra die verkiesingstydsverloop verstryk, terwyl die tweestemmer-kant 'n plaasvervanger verkies. Die etcd foutmodus-gids beskryf die gedrag duidelik: voortgesette diens aan die meerderheidskant, geen tweede skryfbare kluster aan die geïsoleerde kant.

Besluit watter onderbreking jy koop

Twee plus een is 'n wettige ontwerp wanneer Terrein A die primêre is en jy aanvaar dat om dit te verloor beteken om beheervlak-skryfwerk te verloor totdat iemand optree. Wat dit in 'n gebrek verander, is om daardie besluit impliciet te laat. Sit dit in die runbook: watter terrein jou beheervlak oorleef, en wat 'n operateur doen wanneer die ander terrein om 03:00 donker word.

As die vereiste eerder "enige terrein mag faal" is, moet die plasing in elke terrein 'n meerderheid hou, en drie stemmers oor twee terreine kan dit nie doen nie. Jy voeg óf 'n werklik onafhanklike derde domein by — 'n klein streek by 'n ander verskaffer werk as die pad daarheen stabiel is — óf jy splits in twee klusters met aparte etcd en aanvaar die bedryfskoste van daardie splitsing. Geen getuie-kortpad vermy dit nie: etcd het geen liggewig-arbiterlid nie, so 'n derde stemmer is 'n volle lid met sy eie skyf, geheue en netwerkvereistes. Om 'n blokkie met die etiket getuie op die diagram te teken, skep nie een nie.

Kworum is nie dieselfde as diens nie

etcd-kworum hou die API-bediener in staat om skryfwerk te aanvaar, en dit is al wat dit hou. Lasbalanseerder-gesondheidskontroles, ingress, CNI-bereikbaarheid oor die tonnel, volume-aanhegtingsones en toepassingreplikasie het elk hul eie antwoord nodig. 'n Kluster kan 'n skoon meerderheid hou en steeds niks nuttigs aan gebruikers lewer nie.

Bevestig dan die lidmaatskap wat jy dink jy het, want diagramme dryf weg:

kubectl -n kube-system get pods -l component=etcd -o wide
kubectl get endpoints kube-apiserver -n default
etcdctl member list -w table

Vergelyk die ledelys met die plasingskaart. As twee lede na dieselfde gasheer of dieselfde rak oplos, is die tekening verkeerd eerder as die kluster, en om rondom 'n verkeerde topologie te herformaat koop net 'n duurder weergawe van dieselfde onderbreking.

Voordat jy enige drie-stemmer-ontwerp goedkeur, beantwoord vier vrae: hoeveel stemmers verloor saam krag, wie se terreinverlies laat steeds 'n meerderheid oor, waar sit die leier wanneer die tonnel val, en wat kan die oorlewende terrein nog doen. 'n "Nie seker nie" oor enige van hulle beteken die kluster is nog nie hoogs beskikbaar nie. Dit is drie masjiene wat gelukkig was.

Verwante artikels