Три виртуелни машини на контролната рамнина изгледаат како три шанси да преживеете лоша ноќ. Но не се, и токму растојанието меѓу тие две верувања го претвора уредниот дизајн со три јазли во кластер што престанува да прифаќа записи кога една зграда ја губи струјата. VPN врската меѓу локациите ги прави машините достапни една за друга и го крие проблемот наместо да го реши. Гласовите се бројат по член на etcd, и два од тие членови сѐ уште можат да седат зад еден прекинувач, еден UPS и една линија.

Три јазли на контролната рамнина, еден домен на дефект

Извршувате kubectl get nodes, гледате три записи на контролната рамнина и го заведувате кластерот како високо достапен. Тој број опишува плански капацитет, а не преживување. Во kubeadm без надворешен etcd, секој јазол на контролната рамнина исто така хостира член, така што три јазли навистина ви даваат три гласачи. Дали тие гласачи откажуваат независно е одделно прашање на кое списокот на јазли не може да одговори.

Две VM на еден хипервизор, два река на едно напојување, две линии од еден ISP: секој пар е еден домен со две имиња на домаќини. Запишете го распоредот и означете што дели секој гласач — хипервизор, PDU, прекинувач на врвот на рекетот, низа за складирање, NAT уред, VPN концентратор. Потоа на хартија отстранете го секој заеднички објект и повторно избројте ги преостанатите гласови. Кластер што губи два гласачи поради еден откажан домаќин цело време бил кластер со еден гласач; никој сѐ уште не му го поставил тоа прашање.

Што може и што не може да преживее поделбата на две локации

Кога три гласачи се распоредени по два и еден на две локации, поголемата страна го задржува кворумот кога другата локација исчезнува, а страната со еден гласач никогаш. Таа асиметрија е аритметика, не подесување. Секој etcd кластер заснован на мнозинство распореден точно на две независни локации не го поминува тестот „изгуби која било локација и продолжи да потврдуваш“, зашто двете страни истовремено би морале да држат повеќе од половина гласови.

Табелата подолу е најбрзиот начин да видите какви дефекти навистина сте купиле. Прочитајте го секој ред вака: ако вечерва исчезне целиот овој ред, можат ли преживеаните сѐ уште да потврдат запис?

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

Зошто тунелот никогаш не додава глас

VPN е транспорт, не член. Може да направи далечен гласач достапен и може да ја претвори поделбата во нешто што личи на бавен тајмаут, и тоа е целиот негов придонес кон кворумот. Она што го додава е цена, зашто секоја потврда мора да ја премине врската и etcd го плаќа тоа одење и враќање при записи што го допираат raft дневникот. Пат што трепери ја претвора репликацијата во повторни обиди и избори.

Поделбите се местото каде луѓето очекуваат магија, затоа бидете прецизни за нив. Ако врската падне додека стариот лидер седи на страната со еден гласач, таа страна не може да потврди и лидерот се повлекува штом истече тајмаутот за избори, додека страната со два гласачи избира замена. Водичот на etcd за режимите на дефект едноставно го опишува однесувањето: продолжена услуга на страната на мнозинството, никаков втор кластер што може да се пишува на изолираната страна.

Одлучете каков прекин купувате

Две плус еден е легитимен дизајн кога локацијата A е примарна и прифаќате дека нејзиното губење значи губење на записите на контролната рамнина додека некој не дејствува. Она што го прави дефект е тоа што таа одлука се остава имплицитна. Запишете ја во runbook: од која локација преживува вашата контролна рамнина и што прави операторот кога другата локација се гаси во 03:00.

Ако барањето е наместо тоа „која било локација може да откаже“, распоредот мора да држи мнозинство во секоја локација, а три гласачи на две локации не можат тоа. Или додавате навистина независен трет домен — мал регион кај друг провајдер функционира ако патот до таму е стабилен — или се делите на два кластери со одделен etcd и го прифаќате оперативниот трошок на таа поделба. Никаква кратенка со сведок не го избегнува ова: etcd нема лесен арбитер член, затоа третиот гласач е полноправен член со своите барања за диск, меморија и мрежа. Цртање кутија со етикета сведок на дијаграмот не создава сведок.

Кворумот не е исто што и услуга

etcd кворумот го држи API серверот способен да прифаќа записи, и тоа е сѐ што држи. Здравствените проверки на балансерот на оптоварување, ingress, достапноста на CNI низ тунелот, зоните за прикачување томови и репликацијата на апликациите секое бара свој одговор. Кластерот може да држи чисто мнозинство и сепак да не им понуди ништо корисно на корисниците.

Потоа потврдете го членството за кое мислите дека го имате, зашто дијаграмите дрифтуваат:

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

Споредете го списокот на членови со цртежот на распоредот. Ако два члена се решаваат на истиот домаќин или истиот рек, цртежот е погрешен, а не кластерот, и менувањето големина околу погрешна топологија купува само поскапа верзија на истиот прекин.

Пред да одобрите каков било дизајн со три гласачи, одговорете на четири прашања: колку гласачи губат струја заедно, чие губење на локација сѐ уште остава мнозинство, каде седи лидерот кога тунелот паѓа и што сѐ уште може да направи преживеаната локација. „Не сум сигурен“ на кое било од нив значи дека кластерот сѐ уште не е високо достапен. Тоа се три машини што имале среќа.

Поврзани статии