שלוש מכונות וירטואליות של מישור הבקרה נראות כמו שלוש הזדמנויות לשרוד לילה רע. הן לא, והמרחק בין שתי האמונות האלה הוא מה שהופך עיצוב מסודר של שלושה צמתים לאשכול שמפסיק לקבל כתיבות כשבניין אחד מאבד חשמל. קישור VPN בין האתרים הופך את המכונות לנגישות זו לזו ומסתיר את הבעיה במקום לתקן אותה. קולות נספרים לפי חבר etcd, ושניים מהחברים האלה עדיין יכולים לשבת מאחורי מתג אחד, UPS אחד וקו אחד.

שלושה צמתים של מישור הבקרה, תחום כשל אחד

אתם מריצים 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

השוו את רשימת החברים לשרטוט הפריסה. אם שני חברים מתפרשים לאותו מארח או לאותו ארון, השרטוט הוא השגוי ולא האשכול, ושינוי גודל סביב טופולוגיה שגויה קונה רק גרסה יקרה יותר של אותה הפסקה.

לפני אישור כל עיצוב של שלושה מצביעים, ענו על ארבע שאלות: כמה מצביעים מאבדים חשמל יחד, אובדן של איזה אתר עדיין משאיר רוב, היכן יושב המנהיג כשהמנהרה נופלת, ומה האתר השורד עדיין יכול לעשות. "לא בטוח" בכל אחת מהן פירושו שהאשכול עדיין לא זמין ביותר. אלה שלוש מכונות שהיה להן מזל.

מאמרים קשורים