Тры віртуальныя машыны кантрольнай плоскасці ўспрымаюцца як тры шанцы перажыць дрэнную ноч. Але гэта не так, і менавіта адлегласць паміж гэтымі двума перакананнямі ператварае акуратны праект з трох вузлоў у кластар, які перастае прымаць запісы, калі адзін будынак губляе электрычнасць. Спасылка VPN паміж пляцоўкамі робіць машыны дасяжнымі адна для адной і хавае праблему замест таго, каб яе выправіць. Галасы лічацца па кожным члене etcd, і два з гэтых членаў могуць па-ранейшаму стаяць за адным камутатарам, адным ДБЖ і адным каналам сувязі.

Тры вузлы кантрольнай плоскасці, адна зона адмовы

Вы запускаеце kubectl get nodes, бачыце тры запісы кантрольнай плоскасці і запісваеце кластар як высокадаступны. Гэты лік апісвае планаваную ёмістасць, а не здольнасць выжыць. У kubeadm без знешняга etcd кожны вузел кантрольнай плоскасці таксама размяшчае член, таму тры вузлы сапраўды даюць вам тры выбаршчыкі. Ці адмаўляюць гэтыя выбаршчыкі незалежна — асобнае пытанне, на якое спіс вузлоў адказаць не можа.

Дзве ВМ на адным гіпервізары, два стэлажы на адным харчаванні, два каналы ад аднаго правайдэра: кожная пара — адна даменная зона, якая носіць два імёны хостаў. Запішыце размяшчэнне і адзначце, што дзеліць кожны выбаршчык — гіпервізар, 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

Параўнайце спіс членаў з чарцяжом размяшчэння. Калі два члены вырашаюцца ў адзін і той жа хост або адзін і той жа стэлаж, памылка ў чарцяжы, а не ў кластары, і змяненне памераў вакол памылковай тапалогіі купляе толькі даражэйшую версію таго ж збою.

Перш чым зацвердзіць любы праект з трыма выбаршчыкамі, адкажыце на чатыры пытанні: колькі выбаршчыкаў губляюць электрычнасць разам, чыя страта пляцоўкі ўсё яшчэ пакідае большасць, дзе сядзіць лідэр, калі тунель падае, і што ўсё яшчэ можа зрабіць пляцоўка, якая выжыла. «Не ўпэўнены» па любым з іх азначае, што кластар яшчэ не высокадаступны. Гэта тры машыны, якім пашанцавала.

Падобныя артыкулы