במאמר הזה מוסבר איך להגדיר את מדיניות הזמינות הגבוהה למכונות וירטואליות (VM) שפועלות באמצעות VM Runtime ב-GDC.
כשמפעילים את VM Runtime ב-GDC, נוצר באשכול אובייקט VMHighAvailabilityPolicy בשם default. האובייקט הזה מציין את אסטרטגיית השחזור שמוגדרת כברירת מחדל במקרה של כשל בצומת של אשכול שמריץ מכונה וירטואלית. אלו אסטרטגיות השחזור האפשריות שמוגדרות כברירת מחדל:
- קביעת מועד חדש: קביעת מועד חדש ל-VM בצומת אחר באשכול.
- התעלמות: לא מתבצעת פעולה.
בתחילה, אסטרטגיית השחזור שמוגדרת כברירת מחדל היא Reschedule.
אסטרטגיית שחזור ברירת המחדל של Reschedule מתאימה למצב הבא:
ב-cluster יש לפחות שני צמתי עובדים.
הקצאת הדיסקים של המכונה הווירטואלית מתבצעת באמצעות סוג אחסון שמבוסס על קובץ רשת. כלומר, סוג האחסון מבוסס על מערכת קבצים ברשת שמתאמת נעילות של קבצים ב-POSIX בין לקוחות שונים. Network File System (NFS) היא דוגמה לסוג אחסון שמבוסס על קבצים ברשת.
אם המכונות הווירטואליות שלכם משתמשות באחסון מקומי או במערכת אחסון מבוססת-בלוקים, מומלץ להגדיר את אסטרטגיית השחזור שמוגדרת כברירת מחדל ל-Ignore. אנחנו ממליצים על כך מהסיבות הבאות:
אם המכונות הווירטואליות משתמשות באחסון מקומי, ולאחד מהצמתים יש כשל, אין דרך לשחזר את הנתונים המאוחסנים ולהעביר אותם לצומת חדש.
אם המכונות הווירטואליות שלכם משתמשות במערכת אחסון מבוססת-בלוקים, יכול להיות שלא יהיו מספיק ערבויות לניתוק האחסון. הדבר עלול להוביל לגישה בו-זמנית לדיסק ולשיבוש נתונים במהלך תזמון של מכונה וירטואלית.
בדיקת האובייקט VMHighAvailabilityPolicy
מוודאים שיש אובייקט VMHighAvailabilityPolicy:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy --namespace vm-system
מחליפים את USER_CLUSTER_KUBECONFIG בנתיב של קובץ ה-kubeconfig של אשכול המשתמשים.
בפלט מוצג אובייקט VMHighAvailabilityPolicy בשם default. בפלט אפשר לראות גם את הערך הנוכחי של defaultRecoveryStrategy. לדוגמה, בפלט הבא אפשר לראות שהערך הנוכחי של defaultRecoveryStrategy הוא Reschedule:
vm-system default 5m55s Reschedule 15s 1m30s
כדי לקבל תצוגה מפורטת של אובייקט VMHighAvailabilityPolicy:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy \
--namespace vm-system --output yaml
פלט לדוגמה:
apiVersion: vm.cluster.gke.io/v1alpha1
kind: VMHighAvailabilityPolicy
metadata:
...
labels:
app.kubernetes.io/component: kubevirt
app.kubernetes.io/managed-by: virt-operator
kubevirt.io: virt-api
name: default
namespace: vm-system
..
spec:
defaultRecoveryStrategy: Reschedule
nodeHeartbeatInterval: 15s
nodeMonitorGracePeriod: 1m30s
שינוי אסטרטגיית השחזור שמוגדרת כברירת מחדל
במצבים מסוימים, מומלץ לשנות את אסטרטגיית השחזור שמוגדרת כברירת מחדל. לדוגמה, אם המכונות הווירטואליות שלכם משתמשות באחסון מקומי או במערכת קבצים שלא מבוססת על קבצים ברשת, מומלץ לשנות את הערך של defaultRecoveryStrategy ל-Ignore.
כדי לשנות את הערך של defaultRecoveryStrategy, פותחים את האובייקט VMHighAvailabilityPolicy לעריכה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit VMHighAvailabilityPolicy \
default --namespace vm-system
בתוכנת עריכת הטקסט, משנים את הערך של defaultRecoveryStrategy לערך לבחירתכם: Reschedule או Ignore. סוגרים את עורך הטקסט.
שינוי של אסטרטגיית השחזור שמוגדרת כברירת מחדל למכונה וירטואלית
שיטת השחזור שמוגדרת כברירת מחדל חלה על כל ה-VM-ים שפועלים באשכול. עם זאת, יכול להיות שתצטרכו לעקוף את אסטרטגיית השחזור שמוגדרת כברירת מחדל למכונות וירטואליות ספציפיות.
לדוגמה, נניח שרוב המכונות הווירטואליות שלכם הוקצו עם סוג אחסון מבוסס-קובץ ברשת, אבל כמה מכונות וירטואליות הוקצו עם סוג אחסון מבוסס-בלוק. לכל מכונה וירטואלית שמשתמשת באחסון מבוסס-בלוקים, מומלץ לשנות את אסטרטגיית השחזור שמוגדרת כברירת מחדל ולהגדיר את אסטרטגיית השחזור של המכונה הווירטואלית הספציפית לערך Ignore.
כדי לשנות את אסטרטגיית השחזור שמוגדרת כברירת מחדל למכונה וירטואלית, מוסיפים הערה vm.cluster.gke.io/vm-ha-recovery-strategy לאובייקט VirtualMachineInstance (VMI) ולאובייקט GVM.
לדוגמה, הפקודות הבאות מגדירות את אסטרטגיית השחזור ל-Ignore עבור VM בשם my-vm:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate vmi my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate gvm my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite
אם רוצים להסיר את ההערות בהמשך, מוסיפים מקף בסוף שם ההערה. לדוגמה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate vmi my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy- kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate gvm my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy-
הגדרה מתקדמת
בנוסף להגדרת אסטרטגיית השחזור שמוגדרת כברירת מחדל, אפשר להגדיר את האפשרויות הבאות:
הזמן בין פעימות הלב של הצומת: הזמן בין פעימות הלב שנשלחות על ידי כל צומת באשכול
תקופת החסד של ניטור הצמתים: פרק הזמן המקסימלי שבו צומת יכול להיכשל בשליחת אות פעימת לב לפני שהוא ייחשב כלא תקין
ברוב המקרים, ערכי ברירת המחדל של מרווח פעימות הלב ותקופת החסד מתאימים. עם זאת, יכול להיות שתבחרו לשנות את הערכים האלה אם תרצו לשפר את האיזון בין מהירות השחזור לבין התקורה. מרווח קצר יותר בין פעימות הלב יקצר את זמן ההתאוששות, אבל גם יגדיל את התקורה. במקרה של אשכול גדול, כדאי להאריך את מרווח הזמן בין פעימות הלב, כי פעימות לב תכופות מהרבה צמתים עלולות ליצור עומס בלתי נסבל על שרת ה-API של Kubernetes.
כדי למנוע מצבים שבהם פספוס אחד של אות פעימת הלב גורם לכך שצומת ייחשב כלא תקין, צריך להקפיד שפרק הזמן בין פעימות הלב יהיה קצר יותר מתקופת החסד.
מריצים את הפקודה kubectl edit כדי לפתוח את האובייקט VMHighAvailabilityPolicy לעריכה. מגדירים את הערכים של nodeHeartbeatInterval ושל nodeMonitorGracePeriod לפי הבחירה שלכם.
spec: defaultRecoveryStrategy: Reschedule nodeHeartbeatInterval: 15s nodeMonitorGracePeriod: 1m30s