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

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

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

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

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

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

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

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

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

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

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

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

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

nodeSelector

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

  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:
        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_NAME-boot-dv חייב להיות קיים. מידע נוסף זמין במאמר יצירת דיסק אתחול של מכונה וירטואלית.

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

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

    kubectl apply -f my-scheduled-vm.yaml
    

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

‫Taints הם מאפיין תזמון שמאפשר לצמתים לאפשר תזמון של מכונות וירטואליות להפעלה בהם רק אם יש להן tolerations שצוינו. אפשר להחיל taint על צומת, ואז להגדיר ב-manifest של VirtualMachine toleration כדי לאפשר למכונה הווירטואלית לפעול בצומת. מידע נוסף זמין במאמר בנושא 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: שם המפתח של הטולרנטיות שתואם לדחייה בצומת.
    • KEY_VALUE: הערך של המפתח של הטולרנטיות שמתאים לדחייה (taint) בצומת.

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

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

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

    kubectl apply -f my-scheduled-vm.yaml
    

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