Три виртуелне машине контролне равни изгледају као три шансе да преживите лошу ноћ. Али нису, и управо растојање између та два уверења претвара уредну замисао од три чвора у кластер који престаје да прихвата уписе када једна зграда изгуби струју. VPN веза између локација чини машине доступним једне другима и скрива проблем уместо да га реши. Гласови се броје по члану etcd, и два од тих чланова и даље могу да седе иза једног прекидача, једног UPS-а и једне линије.

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

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

Две ВМ на једном хипервизору, два река на једном напајању, две линије од једног 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

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

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

Повезани чланци