Tri VM riadiacej roviny pôsobia ako tri šance prežiť zlú noc. Nie sú, a práve vzdialenosť medzi týmito dvoma presvedčeniami mení úhľadný návrh s tromi uzlami na klaster, ktorý prestane prijímať zápisy, keď jedna budova stratí napájanie. VPN spojenie medzi lokalitami sprístupní stroje navzájom a problém skôr skrýva, než rieši. Hlasy sa počítajú za každého člena etcd a dvaja z týchto členov môžu stále sedieť za jedným prepínačom, jedným UPS a jedným uplinkom.

Tri uzly riadiacej roviny, jedna doména zlyhania

Spustíte kubectl get nodes, uvidíte tri záznamy riadiacej roviny a klaster zapíšete ako vysoko dostupný. Tento počet opisuje plánovateľnú kapacitu, nie prežitie. V kubeadm bez externého etcd hostuje každý uzol riadiacej roviny aj člena, takže tri uzly vám naozaj dajú troch voličov. Či títo voliči zlyhávajú nezávisle, je samostatná otázka, na ktorú zoznam uzlov nedokáže odpovedať.

Dve VM na jednom hypervízore, dva racky na jednom napájaní, dva uplinky od jedného ISP: každá dvojica je jedna doména s dvoma menami hostiteľa. Zapíšte rozloženie a označte, čo každý volič zdieľa — hypervízor, PDU, prepínač na vrchole racku, diskové pole, zariadenie NAT, koncentrátor VPN. Potom na papieri odstráňte každý zdieľaný objekt a znova spočítajte zostávajúce hlasy. Klaster, ktorý stratí dvoch voličov pre jedného zlyhaného hostiteľa, bol celý čas klastrom s jedným voličom; nikto mu tú otázku ešte nepoložil.

Čo rozdelenie na dve lokality prežije a čo nie

Keď sú traja voliči rozložení dva a jeden na dvoch lokalitách, väčšia strana si pri zmiznutí druhej lokality udrží kvórum a strana s jedným voličom nikdy. Táto asymetria je aritmetika, nie ladenie. Každý etcd klaster založený na väčšine rozmiestnený presne na dve nezávislé lokality neprejde testom „stratí ktorúkoľvek lokalitu a pokračuj v potvrdzovaní“, pretože obe strany by museli súčasne držať viac než polovicu hlasov.

Tabuľka nižšie je najrýchlejší spôsob, ako zistiť, aké poruchy ste si vlastne kúpili. Každý riadok čítajte takto: ak dnes v noci zmizne celý tento riadok, môžu preživší ešte potvrdiť zápis?

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

Prečo tunel nikdy nepridá hlas

VPN je doprava, nie člen. Môže sprístupniť vzdialeného voliča a môže z rozdelenia urobiť niečo, čo vyzerá ako pomalý timeout, a to je celý jeho príspevok ku kvóru. To, čo pridáva, je cena, pretože každé potvrdenie musí prejsť spojením a etcd platí túto cestu tam a späť pri zápisoch, ktoré sa dotýkajú raft logu. Cesta, ktorá bliká, mení replikáciu na opakované pokusy a voľby.

Rozdelenia sú miestom, kde ľudia čakajú kúzlo, preto o nich buďte presní. Ak spojenie spadne, kým starý líder sedí na strane s jedným voličom, táto strana nemôže potvrdiť a líder sa vzdá, keď vyprší časový limit volieb, zatiaľ čo strana s dvoma voličmi zvolí náhradu. Sprievodca etcd režimami zlyhania opisuje správanie jasne: pokračujúca služba na strane väčšiny, žiadny druhý zapisovateľný klaster na izolovanej strane.

Rozhodnite, ktorý výpadok kupujete

Dva plus jeden je legitímny návrh, keď je lokalita A primárna a prijmete, že jej strata znamená stratu zápisov riadiacej roviny, kým niekto nezasiahne. Tým, čo z toho robí vadu, je ponechanie tohto rozhodnutia implicitné. Zapíšte ho do runbooku: z ktorej lokality vaša riadiaca rovina prežije a čo operátor robí, keď druhá lokalita o 03:00 zhasne.

Ak je požiadavka namiesto toho „ktorákoľvek lokalita môže zlyhať“, rozloženie musí držať väčšinu v každej lokalite, a traja voliči na dvoch lokalitách to nedokážu. Buď pridáte skutočne nezávislú tretiu doménu — malý región u iného poskytovateľa funguje, ak je cesta k nemu stabilná — alebo sa rozdelíte na dva klastre s oddeleným etcd a prijmete prevádzkovú cenu tohto rozdelenia. Žiadna skratka so svedkom tomu neunikne: etcd nemá ľahkého člena arbitra, takže tretí volič je plný člen s vlastnými nárokmi na disk, pamäť a sieť. Nakreslenie rámčeka s označením svedok do diagramu žiadneho nevytvorí.

Kvórum nie je to isté ako služba

Kvórum etcd udržiava API server schopný prijímať zápisy a to je všetko, čo udržiava. Kontroly stavu load balancera, ingress, dostupnosť CNI cez tunel, zóny pripojenia zväzkov a replikácia aplikácií každá potrebuje vlastnú odpoveď. Klaster môže držať čistú väčšinu a napriek tomu používateľom neponúkať nič užitočné.

Potom potvrďte členstvo, o ktorom si myslíte, že ho máte, pretože diagramy sa posúvajú:

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

Porovnajte zoznam členov s nákresom rozloženia. Ak sa dvaja členovia prekladajú na toho istého hostiteľa alebo ten istý rack, nesprávny je nákres a nie klaster, a zmena veľkosti okolo chybnej topológie kupuje iba drahšiu verziu toho istého výpadku.

Pred schválením akéhokoľvek návrhu s tromi voličmi odpovedzte na štyri otázky: koľko voličov stratí napájanie spoločne, ktorá strata lokality ešte ponechá väčšinu, kde sedí líder, keď tunel spadne, a čo ešte dokáže preživšia lokalita. „Nie som si istý“ pri ktorejkolvek z nich znamená, že klaster ešte nie je vysoko dostupný. Sú to tri stroje, ktoré mali šťastie.

Súvisiace články