הקצאת אשכול מסד נתונים לצומת באמצעות תזמון

בחירת גרסה של מאמר העזרה:

ב-AlloyDB Omni Kubernetes operator, תזמון הוא תהליך של התאמת פודים חדשים של מסד נתונים לצמתים, כדי לאזן את חלוקת הצמתים באשכול ולעזור באופטימיזציה של הביצועים. התאמה בין פודים וצמתים מתבצעת על סמך כמה קריטריונים ומשאבים זמינים, כמו CPU וזיכרון.

מידע נוסף על תזמון זמין במאמר תזמון, קדימות ופינוי במאמרי העזרה של Kubernetes.

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

מידע על הגדרת taints בצמתים זמין במאמר Taints and Tolerations במסמכי Kubernetes.

ציון של tolerations

כדי לתזמן את ה-Pods של AlloyDB Omni לצמתים שאין בהם Pods של אפליקציות אחרות, או כדי להתאים כתם ספציפי שמוגדר בצמתים האלה, צריך להחיל על הצמתים סבילות אחת או יותר באופן הבא:

  1. משנים את המניפסט של אשכול AlloyDB Omni Kubernetes operator כדי לכלול קטע tolerations בקטע schedulingConfig של אחד מהקטעים הבאים:
    • primarySpec למכונות ראשיות
    • spec read pool instances
         tolerations:
          - key: "TAINT_KEY"
            operator: "OPERATOR_VALUE"
            value: "VALUE"
            effect: "TAINT_EFFECT"
       

    מחליפים את מה שכתוב בשדות הבאים:

    • TAINT_KEY: השם הייחודי הקיים של מפתח הדחייה, כמו שם המארח של הצומת או ערך אחר שמוסק באופן מקומי שהטולרנטיות חלה עליו. מפתח ההכתמה כבר מוגדר בצומת. שדה ריק והערך OPERATOR_VALUE שמוגדר ל-exists מציינים שהטולרנטיות צריכה להתאים לכל הערכים ולכל המפתחות.
    • OPERATOR_VALUE: מייצג את הקשר של מפתח לקבוצת ערכים. מגדירים את הפרמטר לאחת מהאפשרויות הבאות:
      • exists: Kubernetes מתאים לכל ערך אם ההכתמה מוגדרת, ללא קשר לערך ההכתמה.
      • equal: Kubernetes לא מתזמן Pod לצומת אם הערכים שונים. האופרטור דורש את ערך הדחייה true.
    • VALUE: ערך ה-taint שהטולרנס תואם לו. אם האופרטור הוא Exists, הערך ריק. אחרת, הערך הוא מחרוזת רגילה. לדוגמה, true.
    • TAINT_EFFECT: מציין את השפעת הכתם שתואמת. שדה ריק מציין שצריך להתאים את כל ההשפעות של ההרעלה. מגדירים את הפרמטר לאחת מהאפשרויות הבאות:
      • NoSchedule: מערכת Kubernetes לא מתזמנת קבוצות Pod חדשות בצומת המזוהם.
      • PreferNoSchedule: מערכת Kubernetes לא תציב Pod חדשים בצומת המזוהם, אלא אם הדבר הכרחי.
      • NoExecute: Kubernetes מסלק קבוצות Pod קיימות שלא יכולות להתמודד עם הכתם.
  2. מחילים מחדש את המניפסט.

הגדרת זיקה לצומת

מתזמן Kubernetes משתמש בזיקה של צומת כקבוצת כללים כדי לקבוע איפה למקם Pod. המאפיין Node affinity הוא גרסה גמישה יותר של node selectors.

כדי לציין אילו צמתים צריך לתזמן להרצת מסד הנתונים, פועלים לפי השלבים הבאים:

  1. משנים את המניפסט של אשכול מסד הנתונים כך שיכלול את הקטע nodeaffinity אחרי הקטע tolerations בקטע schedulingConfig של primarySpec עבור מופעים ראשיים או של spec עבור מופעים של מאגר לקריאה:
          nodeaffinity:
             NODE_AFFINITY_TYPE:
             - weight: WAIT_VALUE
               preference:
                 matchExpressions:
                 - key: LABEL_KEY
                   operator: OPERATOR_VALUE
                   values:
                   - LABEL_KEY_VALUE
        

    מחליפים את מה שכתוב בשדות הבאים:

    • NODE_AFFINITY_TYPE: מגדירים את הפרמטר לאחת מהאפשרויות הבאות:
      • requiredDuringSchedulingIgnoredDuringExecution: Kubernetes מתזמן את ה-Pod בדיוק על סמך הכללים המוגדרים.
      • preferredDuringSchedulingIgnoredDuringExecution: מתזמן Kubernetes מנסה למצוא צומת שעומד בכלל המוגדר לתזמון. עם זאת, אם אין צומת כזה, Kubernetes מתזמן לצומת אחר באשכול.
    • WAIT_VALUE: מציין את משקל ההעדפה של הצמתים שצוינו. ערכים גבוהים יותר מציינים העדפה חזקה יותר. הערכים החוקיים הם 1 עד 100.
    • LABEL_KEY: התווית של הצומת עבור המפתח שמשמש כאינדיקטור מיקום ומאפשר חלוקה שווה של ה-Pod באשכול. לדוגמה, disktype=ssd.
    • OPERATOR_VALUE: מייצג את הקשר של מפתח לקבוצת ערכים. מגדירים את הפרמטר לאחת מהאפשרויות הבאות:
      • In: מערך הערכים לא יכול להיות ריק.
      • NotIn: מערך הערכים לא יכול להיות ריק.
      • Exists: מערך הערכים חייב להיות ריק.
      • DoesNotExist: מערך הערכים חייב להיות ריק.
      • Gt: מערך הערכים חייב להכיל רכיב יחיד, שמתפרש כמספר שלם.
      • Lt: מערך הערכים חייב להכיל רכיב יחיד, שמתפרש כמספר שלם.
    • LABEL_KEY_VALUE: הערך של מפתח התווית. מגדירים את הפרמטר למערך של ערכי מחרוזת באופן הבא:
      • אם האופרטור הוא In או NotIn, מערך הערכים לא יכול להיות ריק.
      • אם האופרטור הוא Exists או DoesNotExist, מערך הערכים חייב להיות ריק.
      • אם האופרטור הוא Gt או Lt, מערך הערכים חייב להכיל רכיב יחיד, שמפורש כמספר שלם.
  2. מחילים מחדש את המניפסט.

הגדרת אילוצים של פיזור טופולוגי

השדה topologySpreadConstraints, שנמצא ב-API של Kubernetes Pod,‏ spec וכתוצאה מכך ב-schedulingConfig של מניפסטים של קלאסטר מסדי נתונים של AlloyDB Omni, קובע איך יחולקו ה-Pods בין דומיינים שונים של טופולוגיה, כמו אזורים, צמתים או אזורים בקלאסטר. כך אפשר לקדם זמינות גבוהה וניצול מאוזן של משאבים, כי לא מאפשרים ליותר מדי פודים של אשכול מסדי נתונים של AlloyDB Omni להגיע לנקודת כשל יחידה.

כדי לציין איך אשכול מסד הנתונים של AlloyDB Omni מתפרס על פני טופולוגיית האשכול, כוללים את הקטע topologySpreadConstraints ב-schedulingConfig של primarySpec עבור מופעים ראשיים או spec עבור מופעים של מאגר לקריאה:

schedulingconfig:
      # Other scheduling configs like tolerations, nodeaffinity
      topologySpreadConstraints:
        - maxSkew: MAXSKEW_VALUE
          topologyKey: "TOPOLOGY_KEY"
          whenUnsatisfiable: WHEN_UNSATISFIABLE_VALUE
          # labelSelector: <object> # optional
          # minDomains: <integer> # optional
          # matchLabelKeys: <list> # optional
          # nodeAffinityPolicy: [Honor|Ignore] # optional
          # nodeTaintsPolicy: [Honor|Ignore] # optional

מחליפים את מה שכתוב בשדות הבאים:

  • MAXSKEW_VALUE: מגדיר את ההבדל המקסימלי המותר במספר ה-Pods התואמים בין שני דומיינים של טופולוגיה. הפרמטר הזה חייב להיות גדול מ-0.
  • TOPOLOGY_KEY: המפתח של תוויות הצמתים שמגדיר דומיין טופולוגי, לדוגמה, topology.kubernetes.io/zone לאזורים. מתזמן המשימות מנסה לאזן בין ה-Pods בדומיינים האלה.
  • WHEN_UNSATISFIABLE_VALUE: מציין איך מתזמן העבודה מטפל ב-Pod אם הוא לא עומד בדרישות של אילוץ הפיזור. מגדירים את הפרמטר לאחת מהאפשרויות הבאות:
    • DoNotSchedule: המתזמן לא מתזמן את ה-Pod לצומת אם אילוץ הפיזור לא מתקיים. זה ערך ברירת המחדל.
    • ScheduleAnyway: המתזמן עדיין מתזמן את ה-Pod, אבל הוא נותן עדיפות לצמתים שממזערים את ההטיה.

מידע נוסף על אילוצים של פיזור טופולוגיית Pod זמין במסמכי העזרה הרשמיים של Kubernetes.

דוגמה

בדוגמה הבאה מוצג תזמון של Pods במופעים של מאגרים ראשיים ומאגרי קריאה של AlloyDB Omni Kubernetes operator. הגדרת תזמון כזו עוזרת לוודא שהמופע הראשי של אשכול מסד הנתונים מתוזמן בצמתים המתאימים, וגם מאפשרת גמישות מסוימת בבחירת הצמתים. הגמישות הזו יכולה להיות שימושית לאיזון העומס, לאופטימיזציה של השימוש במשאבים או להקפדה על תפקידים ומאפיינים ספציפיים של צמתים.

    schedulingconfig:
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      nodeaffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
            - key: another-node-label-key
              operator: In
              values:
              - another-node-label-value
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: "topology.kubernetes.io/zone"
          whenUnsatisfiable: DoNotSchedule

הדוגמה של הטולרנטיות מאפשרת לתזמן את ה-Pod בצמתים שמסומנים כצמתים של מישור הבקרה, בגלל הפרטים הבאים:

  • המפתח node-role.kubernetes.io/control-plane taint מציין שהצומת הוא צומת של מישור הבקרה.
  • האופרטור Exists אומר שהטולרנטיות תתאים לכל דחייה (taint) עם מפתח ה-taint שצוין, בלי קשר לערך.
  • האפקט NoSchedule אומר שלא תתבצע תזמון של Pod בצומת של מישור הבקרה, אלא אם יש לו התאמה לסבילות.

סוג ההעדפה של הצומת מציין שהכללים שמוגדרים להעדפה של הצומת הם מועדפים אבל לא נדרשים במהלך התזמון.preferredDuringSchedulingIgnoredDuringExecution אם הצמתים המועדפים לא זמינים, יכול להיות שה-Pod עדיין יתוזמן בצמתים אחרים. ערך המשקל 1 מציין העדפה חלשה. קריטריוני הבחירה של הצומת מוגדרים בקטע preference. בקטע matchExpressions מופיע מערך של ביטויים שמשמשים להתאמת צמתים. המפתח another-node-label-key מייצג את המפתח של תווית הצומת שצריך להתאים. האופרטור In מציין שהצומת חייב לכלול את המפתח עם אחד מהערכים שצוינו. למפתח another-node-label-key צריך להיות הערך another-node-label-value.

כלל ההעדפה למיקום צומת בדוגמה מציין העדפה לתזמון של ה-Pod בצמתים עם התווית another-node-label-key והערך another-node-label-value. ההעדפה חלשה ולכן היא לא דרישה מחייבת.

ההגדרה topologySpreadConstraints בדוגמה הזו מפזרת את ה-Pods באזורים שונים של Kubernetes. הערך maxSkew של 1 מציין שיכול להיות לכל היותר עוד Pod אחד בכל אזור נתון בהשוואה למספר המינימלי של Pods בכל אזור אחר. ההגדרה whenUnsatisfiable עם הערך DoNotSchedule מציינת שאם אי אפשר לעמוד במגבלה הזו, ה-Pod יישאר לא מתוזמן.

בדוגמה הזו משולבים הרכיבים הבאים:

  • הגדרות Toleration שמאפשרות לתזמן את ה-Pod בצמתים של מישור הבקרה על ידי Toleration של ה-Taint‏ NoSchedule.
  • העדפה של צומת עם תווית ספציפית, אבל לא דרישה מחייבת. לכן, יש גמישות בתזמון.
  • מגבלות על התפלגות טופולוגית שמבטיחות חלוקה מאוזנת של ה-Pods בין אזורי הזמינות, משפרות את העמידות ומייעלות את השימוש במשאבים.

המאמרים הבאים