Treba li Kubernetes klaster na dvije lokacije tri etcd glasača?
Tri čvora kontrolne ravni na dvije VPN lokacije i dalje gube kvorum kada veća lokacija padne. Prebrojite stvarne etcd glasače i odaberite gubitak koji preživljavate.
Tri VM-a kontrolne ravni izgledaju kao tri šanse da preživite lošu noć. Nisu, a razmak između ta dva uvjerenja pretvara uredan dizajn s tri čvora u klaster koji prestaje prihvatati upise kada jedna zgrada izgubi struju. VPN veza između lokacija čini mašine međusobno dostupnim i skriva problem umjesto da ga rješava. Glasovi se broje po etcd članu, a dva od tih članova i dalje mogu stajati iza jednog prekidača, jednog UPS-a i jednog uplinka.
Tri čvora kontrolne ravni, jedna domena kvara
Pokrenete kubectl get nodes, vidite tri unosa kontrolne ravni i upišete klaster kao visoko dostupan. Taj broj opisuje rasporedivi kapacitet, a ne preživljavanje. U kubeadm-u bez vanjskog etcd-a, svaki čvor kontrolne ravni također hosta člana, pa tri čvora zaista daju tri glasača. Da li ti glasači otkazuju nezavisno, zasebno je pitanje na koje lista čvorova ne može odgovoriti.
Dva VM-a na jednom hipervizoru, dva stalka na jednom napajanju, dva uplinka od jednog ISP-a: svaki par je jedna domena s dva imena hosta. Zapišite raspored i označite šta svaki glasač dijeli — hipervizor, PDU, prekidač na vrhu stalka, diskovni niz, NAT uređaj, VPN koncentrator. Zatim uklonite svaki zajednički objekat na papiru i ponovo prebrojite glasove koji ostanu. Klaster koji izgubi dva glasača zbog jednog neuspjelog hosta cijelo je vrijeme bio klaster s jednim glasačem; niko mu to pitanje nikada nije postavio.
Šta podjela na dvije lokacije može preživjeti, a šta ne
Kada su tri glasača raspoređena dva i jedan na dvije lokacije, veća strana zadržava kvorum kada druga lokacija nestane, a strana s jednim glasačem nikada. Ta asimetrija je aritmetika, ne podešavanje. Svaki etcd klaster zasnovan na većini, raspoređen na tačno dvije nezavisne lokacije, pada test "izgubi bilo koju lokaciju i nastavi upisivati", jer bi obje strane istovremeno morale držati više od polovine glasova.
Tabela ispod najbrži je način da vidite koje ste kvarove zaista kupili. Svaki red čitajte ovako: ako cijeli ovaj red nestane večeras, mogu li preživjeli još uvijek upisati?
| 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 |
Zašto tunel nikada ne dodaje glas
VPN je transport, ne član. Može učiniti udaljenog glasača dostupnim i može pretvoriti particiju u nešto što izgleda kao spori tajmaut, i to je cijeli njegov doprinos kvorumu. Ono što dodaje jest trošak, jer svaki upis mora prijeći vezu i etcd plaća taj povratni put na upisima koji diraju raft log. Put koji leprša pretvara replikaciju u ponovne pokušaje i izbore.
Particije su mjesto gdje ljudi očekuju magiju, zato budite precizni u vezi s njima. Ako veza padne dok stari lider sjedi na strani s jednim glasačem, ta strana ne može upisati i lider se povlači kada istekne tajmaut izbora, dok strana s dva glasača bira zamjenu. etcd vodič kroz režime kvara jasno opisuje ponašanje: nastavljeno služenje na strani većine, nikakav drugi klaster dostupan za upis na izolovanoj strani.
Odlučite koji prekid kupujete
Dva plus jedan legitiman je dizajn kada je lokacija A primarna i prihvatate da njeno gubljenje znači gubitak upisa kontrolne ravni dok neko ne reaguje. Ono što to pretvara u nedostatak jest ostavljanje te odluke implicitnom. Zapišite to u runbook: s koje lokacije vaša kontrolna ravan preživljava i šta operater radi kada druga lokacija padne u 03:00.
Ako je zahtjev umjesto toga "bilo koja lokacija može otkazati", raspored mora držati većinu na svakoj lokaciji, a tri glasača na dvije lokacije to ne mogu. Ili dodajete istinski nezavisnu treću domenu — mala regija kod drugog provajdera radi ako je put do nje stabilan — ili se dijeli na dva klastera s odvojenim etcd-om i prihvatate operativni trošak te podjele. Nijedan prečica sa svjedokom to ne izbjegava: etcd nema laganog člana arbitra, pa je treći glasač pun član sa svojim zahtjevima za disk, memoriju i mrežu. Crtanje kutije s oznakom svjedok na dijagramu ne stvara je.
Kvorum nije isto što i usluga
etcd kvorum održava API server sposobnim prihvatati upise i to je sve što održava. Zdravstvene provjere balansera opterećenja, ingress, dostupnost CNI kroz tunel, zone priključenja volumena i replikacija aplikacija svaki traže vlastiti odgovor. Klaster može držati čistu većinu i ipak ne pružati ništa korisno korisnicima.
Zatim potvrdite članstvo za koje mislite da ga imate, jer dijagrami odlutaju:
kubectl -n kube-system get pods -l component=etcd -o wide
kubectl get endpoints kube-apiserver -n default
etcdctl member list -w table
Uporedite listu članova s crtežom rasporeda. Ako se dva člana razrješavaju na isti host ili isti stalak, crtež je pogrešan, a ne klaster, i mijenjanje veličine oko pogrešne topologije kupuje samo skuplju verziju istog prekida.
Prije odobravanja bilo kojeg dizajna s tri glasača, odgovorite na četiri pitanja: koliko glasača zajedno gubi napajanje, čiji gubitak lokacije još ostavlja većinu, gdje sjedi lider kada tunel padne i šta preživjela lokacija još može učiniti. "Nisam siguran" na bilo koje od njih znači da klaster još nije visoko dostupan. To su tri mašine koje su imale sreće.