תזמון מכונות וירטואליות שמשתמשות ב-VM Runtime ב-GDC

המסמך הזה מיועד לבעלי אפליקציות ולאדמינים של פלטפורמות שמריצים את Google Distributed Cloud. במאמר הזה מוסבר איך להשתמש בהגדרות של תזמון, כמו זיקה (affinity) ודחייה (anti-affinity), למכונות וירטואליות שמשתמשות ב-VM Runtime ב-GDC.

לפני שמתחילים

כדי להשלים את המסמך הזה, תצטרכו גישה למקורות המידע הבאים:

סקירה כללית של הגדרות לוחות זמנים

הגדרות התזמון הן ערכים אופציונליים ב-VM Runtime ב-GDC. אם לא מציינים הגדרות תזמון, ברירת המחדל של מכונת ה-VM היא התנהגות התזמון של Kubernetes.

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

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

  • nodeSelector: מציין תוויות של צמתים שצומת המארח של מכונה וירטואלית חייב לכלול. ‫VM Runtime on GDC מתזמן את המכונה הווירטואלית רק בצמתים שיש להם תווית שצוינה.
  • קרבה: מציין את כללי הקרבה של המכונה הווירטואלית. הוא כולל קרבה של צומת וקרבה או אנטי-קרבה בין מכונות וירטואליות. מגדירים דרישה גמישה או מחייבת לתזמן:
    • preferredDuringSchedulingIgnoredDuringExecution: זו דרישה גמישה. מתזמן המשימות מנסה לפעול בהתאם לבקשה. אם הוא לא מצליח, יכול להיות שהמכונה הווירטואלית תתוזמן בצומת לא מועדף.
    • requiredDuringSchedulingIgnoredDuringExecution: היא דרישה מחייבת. מתזמן הפגישות ינסה להיענות לבקשה שלכם. אם אין צמתים זמינים שתואמים לדרישה, המכונה הווירטואלית לא מתוזמנת.
  • Tolerations: מאפשרת לתזמן את המכונה הווירטואלית בצמתים עם כתמים תואמים.

אתם יכולים להגדיר כל אחת מההגדרות האלה של תזמון כדי לתמוך בעומסי העבודה של המחשוב ובצרכים שלכם לגבי תזמון. בנוסף להגדרות התזמון, התזמון של מכונות ה-VM תלוי במשאבים הזמינים.

‫VM Runtime ב-GDC משתמש באותה לוגיקה של תזמון מכונות וירטואליות ובאותו מבנה של מניפסט כמו Kubernetes כדי להקצות Pods לצמתים. מידע נוסף על הגדרות התזמון האלה זמין בקישורים הבאים:

הצבת מכונות וירטואליות בצומת ספציפי

אם יש לכם צמתים עם הגדרות חומרה ספציפיות, אתם יכולים לתזמן מכונות וירטואליות כך שהן יפעלו רק בצמתים האלה. לדוגמה, יכול להיות ש-VM מסוים יזדקק לערכת שבבים מסוימת של CPU או לתמיכה ב-GPU. אתם יכולים להשתמש ב-nodeSelector בסיסי או בכללי קירבה גמישים יותר כדי לתזמן את הפעלת המכונות הווירטואליות בצמתים האלה.

nodeSelector

קובץ המניפסט VirtualMachine הבא משתמש ב-nodeSelector כדי להגדיר דרישה קשיחה לתזמון. אם אין צומת זמין שעומד בהגדרות התזמון, אי אפשר לתזמן את המכונה הווירטואלית.

  1. יוצרים קובץ VirtualMachine manifest, כמו my-scheduled-vm.yaml,בכלי העריכה הרצוי:

    nano my-scheduled-vm.yaml
    
  2. מעתיקים ומדביקים את מניפסט ה-YAML הבא:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        nodeSelector:
          kubernetes.io/hostname: NODE_NAME
    

    מחליפים את הערכים הבאים:

    • VM_NAME: השם של ה-VM.
    • NODE_NAME: הצמתים שרוצים לתזמן את המכונה הווירטואלית עליהם.

    דיסק האתחול בשם VM_NAME-boot-dv צריך להיות קיים. מידע נוסף זמין במאמר יצירת דיסק אתחול של מכונה וירטואלית.

  3. שומרים את מניפסט המכונה הווירטואלית וסוגרים את העורך.

  4. יוצרים את המכונה הווירטואלית ואת הגדרת התזמון באמצעות kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

תחום עניין משותף

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

  1. יוצרים מניפסט VirtualMachine, כמו my-scheduled-vm.yaml, בעורך לבחירתכם:

    nano my-scheduled-vm.yaml
    
  2. מעתיקים ומדביקים את מניפסט ה-YAML הבא:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                    - NODE_NAME
    

    מחליפים את הערכים הבאים:

    • VM_NAME: השם של ה-VM.
    • NODE_NAME: הצמתים שרוצים לתזמן את המכונה הווירטואלית עליהם.

    דיסק האתחול בשם VM_NAME-boot-dv צריך להיות קיים. מידע נוסף זמין במאמר יצירת דיסק אתחול של מכונה וירטואלית.

  3. שומרים את מניפסט המכונה הווירטואלית וסוגרים את העורך.

  4. יוצרים את המכונה הווירטואלית ואת הגדרת התזמון באמצעות kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

איך מונעים הצבה של מכונות וירטואליות בצומת ספציפי

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

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

  1. יוצרים מניפסט VirtualMachine, כמו my-scheduled-vm.yaml, בעורך לבחירתכם:

    nano my-scheduled-vm.yaml
    
  2. מעתיקים ומדביקים את מניפסט ה-YAML הבא:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VVM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              preference:
                matchExpressions:
                - key: kubernetes.io/hostname
                  operator: NotIn
                  values:
                  - NODE_NAME
    

    מחליפים את הערכים הבאים:

    • VM_NAME: השם של ה-VM.
    • NODE_NAME: הצומת שבו רוצים לתזמן את המכונה הווירטואלית.

    דיסק האתחול בשם VM_NAME-boot-dv צריך כבר להתקיים. מידע נוסף זמין במאמר יצירת דיסק אתחול של מכונה וירטואלית.

  3. שומרים את מניפסט המכונה הווירטואלית וסוגרים את העורך.

  4. יוצרים את המכונה הווירטואלית ואת הגדרת התזמון באמצעות kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

הפרדה בין מכונות וירטואליות

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

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

  1. יוצרים מניפסט VirtualMachine, כמו my-scheduled-vm.yaml, בעורך לבחירתכם:

    nano my-scheduled-vm.yaml
    
  2. מעתיקים ומדביקים את מניפסט ה-YAML הבא:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      labels:
        KEY:VALUE
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchLabels:
                    KEY:VALUE
    

    מחליפים את הערכים הבאים:

    • VM_NAME: השם של ה-VM.
    • KEY:VALUE: התווית key:value שרוצים להחיל על מכונות וירטואליות שרוצים לתזמן על פני צמתים שונים. מידע נוסף זמין במאמר תוויות וסלקטורים.

    דיסק האתחול בשם VM_NAME-boot-dv צריך כבר להתקיים. מידע נוסף זמין במאמר יצירת דיסק אתחול של מכונה וירטואלית.

  3. שומרים את מניפסט המכונה הווירטואלית וסוגרים את העורך.

  4. יוצרים את המכונה הווירטואלית ואת הגדרת התזמון באמצעות kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

שמירה של מכונות וירטואליות ביחד

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

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

  1. יוצרים מניפסט VirtualMachine, כמו my-scheduled-vm.yaml, בעורך לבחירתכם:

    nano my-scheduled-vm.yaml
    
  2. מעתיקים ומדביקים את מניפסט ה-YAML הבא:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      labels:
        KEY:VALUE
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          podAffinity:
            preferredDuringSchedulingIgnoredDuringExecution
            - podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchLabels:
                    KEY:VALUE
              weight: 100
    

    מחליפים את הערכים הבאים:

    • VM_NAME: השם של ה-VM.
    • KEY:VALUE: צמד התוויות key:value שרוצים להחיל על מכונות ה-VM שרוצים לתזמן בין צמתים שונים. מידע נוסף זמין במאמר תוויות ובוררים.

    דיסק האתחול בשם VM_NAME-boot-dv צריך כבר להתקיים. מידע נוסף זמין במאמר יצירת דיסק אתחול של מכונה וירטואלית.

  3. שומרים את מניפסט המכונה הווירטואלית וסוגרים את העורך.

  4. יוצרים את המכונה הווירטואלית ואת הגדרת התזמון באמצעות kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

תזמון מכונות וירטואליות בצמתים עם כתמים

‫Taints הם מאפיין תזמון שמאפשר לצמתים לאפשר רק למכונות וירטואליות עם tolerations ספציפיים להיות מתוזמנות להפעלה בהם. אפשר להחיל taint על צומת, ואז להגדיר toleration במניפסט VirtualMachine כדי לאפשר למכונה וירטואלית לפעול בצומת. מידע נוסף זמין במאמר Taints and tolerations.

  1. יוצרים מניפסט VirtualMachine, כמו my-scheduled-vm.yaml, בעורך לבחירתכם:

    nano my-scheduled-vm.yaml
    
  2. מעתיקים ומדביקים את מניפסט ה-YAML הבא:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        tolerations:
        - key: KEY_NAME
          operator: "Equal"
          value: KEY_VALUE
          effect: "NoSchedule"
    

    מחליפים את הערכים הבאים:

    • VM_NAME: השם של ה-VM.
    • KEY_NAME: שם המפתח של הטולרנטיות שתואם לדחייה (taint) בצומת.
    • KEY_VALUE: הערך של המפתח של הסבילות שמתאים לכתם בצומת.

    דיסק האתחול בשם VM_NAME-boot-dv צריך כבר להתקיים. מידע נוסף זמין במאמר יצירת דיסק אתחול של מכונה וירטואלית.

  3. שומרים את מניפסט המכונה הווירטואלית וסוגרים את העורך.

  4. יוצרים את המכונה הווירטואלית ואת הגדרת התזמון באמצעות kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

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