Het 'n Kubernetes-kluster oor twee terreine drie etcd-stemmers nodig?
Drie beheervlak-nodusse oor twee VPN-terreine verloor steeds kworum wanneer die groter terrein donker word. Tel die werklike etcd-stemmers en kies watter verlies jy oorleef.
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 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 |
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.