Ці патрэбны кластару Kubernetes на двух пляцоўках тры выбаршчыкі etcd?
Тры вузлы кантрольнай плоскасці на двух пляцоўках VPN усё яшчэ губляюць кворум, калі большая пляцоўка знікае. Падлічыце сапраўдных выбаршчыкаў etcd і абярыце страту, якую перажывяце.
Тры віртуальныя машыны кантрольнай плоскасці ўспрымаюцца як тры шанцы перажыць дрэнную ноч. Але гэта не так, і менавіта адлегласць паміж гэтымі двума перакананнямі ператварае акуратны праект з трох вузлоў у кластар, які перастае прымаць запісы, калі адзін будынак губляе электрычнасць. Спасылка VPN паміж пляцоўкамі робіць машыны дасяжнымі адна для адной і хавае праблему замест таго, каб яе выправіць. Галасы лічацца па кожным члене etcd, і два з гэтых членаў могуць па-ранейшаму стаяць за адным камутатарам, адным ДБЖ і адным каналам сувязі.
Тры вузлы кантрольнай плоскасці, адна зона адмовы
Вы запускаеце kubectl get nodes, бачыце тры запісы кантрольнай плоскасці і запісваеце кластар як высокадаступны. Гэты лік апісвае планаваную ёмістасць, а не здольнасць выжыць. У kubeadm без знешняга etcd кожны вузел кантрольнай плоскасці таксама размяшчае член, таму тры вузлы сапраўды даюць вам тры выбаршчыкі. Ці адмаўляюць гэтыя выбаршчыкі незалежна — асобнае пытанне, на якое спіс вузлоў адказаць не можа.
Дзве ВМ на адным гіпервізары, два стэлажы на адным харчаванні, два каналы ад аднаго правайдэра: кожная пара — адна даменная зона, якая носіць два імёны хостаў. Запішыце размяшчэнне і адзначце, што дзеліць кожны выбаршчык — гіпервізар, PDU, камутатар верхняга ўзроўню, дыскавы масіў, прылада NAT, канцэнтратар VPN. Затым прыбярыце кожны агульны аб'ект на паперы і пералічыце галасы, якія засталіся. Кластар, які губляе двух выбаршчыкаў праз адзін збойны хост, увесь час быў аднавыбаршчыцкім; проста ніхто яму гэтага пытання не задаваў.
Што двухпляцоўкавы падзел можа перажыць, а што не
Калі тры выбаршчыкі размяшчаюцца як два і адзін на дзвюх пляцоўках, большая частка захоўвае кворум, калі іншая пляцоўка знікае, а частка з адным выбаршчыкам — ніколі. Гэтая асіметрыя — арыфметыка, а не наладка. Любы кластар etcd на аснове большасці, размеркаваны роўна па дзвюх незалежных пляцоўках, не праходзіць праверку «страці любую пляцоўку і працягвай фіксаваць», бо абодва бакі мусілі б адначасова трымаць больш за палову галасоў.
Табліца ніжэй — самы хуткі спосаб убачыць, якія збоі вы насамрэч набылі. Чытайце кожны радок так: калі гэты цэлы радок знікне сёння ўначы, ці змогуць тыя, хто выжыў, усё яшчэ зафіксаваць запіс?
| 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 |
Чаму тунель ніколі не дадае голас
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
Параўнайце спіс членаў з чарцяжом размяшчэння. Калі два члены вырашаюцца ў адзін і той жа хост або адзін і той жа стэлаж, памылка ў чарцяжы, а не ў кластары, і змяненне памераў вакол памылковай тапалогіі купляе толькі даражэйшую версію таго ж збою.
Перш чым зацвердзіць любы праект з трыма выбаршчыкамі, адкажыце на чатыры пытанні: колькі выбаршчыкаў губляюць электрычнасць разам, чыя страта пляцоўкі ўсё яшчэ пакідае большасць, дзе сядзіць лідэр, калі тунель падае, і што ўсё яшчэ можа зрабіць пляцоўка, якая выжыла. «Не ўпэўнены» па любым з іх азначае, што кластар яшчэ не высокадаступны. Гэта тры машыны, якім пашанцавала.