ניהול מכונות וירטואליות בשרתים מחוברים של Distributed Cloud

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

כדי ללמוד איך מכונות וירטואליות משמשות כרכיב חיוני בפלטפורמה המחוברת של Distributed Cloud, אפשר לעיין במאמר הרחבת GKE Enterprise לניהול מכונות וירטואליות בפריסה מקומית.

קלאסטרים מחוברים של Distributed Cloud תומכים בוווב-הוקים של מכונות וירטואליות. כך אפשר לאמת בקשות משתמשים שמופנות לשרת Kubernetes API המקומי ב-Distributed Cloud. בקשות שנדחו יוצרות מידע מפורט על סיבת הדחייה.

הגדרת Symcloud Storage

השרתים של Google Distributed Cloud במודל מחובר משתמשים ב-Rakuten Symcloud Storage כפתרון אחסון. ‫Symcloud Storage הוא פתרון של צד שלישי שפועל כשכבת הפשטה של אחסון מקומי בכל צומת שמחובר ל-Distributed Cloud, ומאפשר לעומסי עבודה שפועלים בצמתים אחרים שמחוברים ל-Distributed Cloud לגשת לאחסון המקומי.

שירות Symcloud Storage נפרס מ-Google Cloud Marketplace והוא כפוף לתנאים שמפורטים שם. ‫Google מספקת תמיכה מוגבלת בשימוש ב-Symcloud Storage עם Distributed Cloud במודל מחובר, ועשויה לפנות לספק הצד השלישי לקבלת עזרה. עדכוני התוכנה של Symcloud Storage כלולים בעדכוני התוכנה המקושרים של Distributed Cloud.

כדי להפעיל את Symcloud Storage למכונות וירטואליות, צריך להגדיר את האשכול המחובר של Google Distributed Cloud באופן הבא:

  1. יוצרים את מרחב השמות robinio באמצעות הפקודה הבאה:

    kubectl create ns robinio
    
  2. מקבלים את קובץ הרישיון של Symcloud Storage ומחילים אותו על האשכול באמצעות הפקודה הבאה:

    kubectl apply LICENSE_FILE
    
  3. מריצים את הפקודה הבאה כדי לוודא ש-Symcloud Storage פועל:

    kubectl apply LICENSE_FILE
    

    הפקודה מחזירה פלט שדומה לזה:

     Name:         robin
     Namespace:
     Labels:       app.kubernetes.io/instance=robin
                   app.kubernetes.io/managed-by=robin.io
                   app.kubernetes.io/name=robin
     Annotations:  <none>
     API Version:  manage.robin.io/v1
     Kind:         RobinCluster
     Metadata:
       
     Spec:
       
     Status:
       
       Phase:             Ready
       
    
  4. יוצרים את סוג האחסון robin-block-immediate על ידי החלת ההגדרה הבאה על האשכול:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: robin-block-immediate
    parameters:
      faultdomain: host
      replication: "3"
      blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    
  5. יוצרים את המחלקה robin-snapshotclass של snapshot של נפח על ידי החלת ההגדרה הבאה על האשכול:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: robin-snapshotclass
      labels:
        app.kubernetes.io/instance: robin
        app.kubernetes.io/managed-by: robin.io
        app.kubernetes.io/name: robin
      annotations:
        snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete
    

הפעלת VM Runtime ב-GDC במודל מחובר של Distributed Cloud

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

כדי להפעיל את VM Runtime במערכת המשנה של מכונה וירטואלית ב-GDC, צריך לבצע את השלבים הבאים:

  1. משנים את המשאב המותאם אישית VMRuntime עם התוכן הבא ומחילים אותו על האשכול:

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      annotations:
        baremetal.cluster.gke.io/vmrumtime-force-disable: "false"
        vm.cluster.gke.io/enable-vm-backup: "true"
    spec:
      enabled: true
      storage:
        defaultStorageClass: robin-block-immediate
    haPolicy:
      defaultRecoveryStrategy: Reschedule
      nodeHeartbeatInterval: 15s
      nodeMonitorGracePeriod: 55s

    בדרך כלל התהליך נמשך כמה דקות.

  2. כדי לוודא שVMRuntime המשאב המותאם אישית הוחל על האשכול, משתמשים בפקודה הבאה:

    kubectl get vmruntime
    

    הפקודה מחזירה פלט שדומה לדוגמה הבאה:

    NAME        AGE   ENABLED   READY   PREFLIGHTCHECK
    vmruntime   5m   true      true    true
    
  3. משנים את storageprofile עבור סוג האחסון robin-block-immediate עם התוכן הבא ומחילים אותו על האשכול:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: robin-block-immediate
    spec:
      claimPropertySets:
        accessModes:
          ReadWriteMany
      volumeMode: Block

התקנה של כלי הניהול virtctl

כדי לנהל מכונות וירטואליות באשכול מחובר של Distributed Cloud, צריך את כלי הלקוח virtctl. כדי להתקין את הכלי, מבצעים את השלבים הבאים:

  1. מתקינים את כלי הלקוח virtctl כפלאגין של kubectl:

    export VERSION=v0.59.0-anthos1.28-gke.8
    gcloud storage cp gs://anthos-baremetal-release/virtctl/${VERSION}/linux-amd64/virtctl/usr/local/bin/virtctl
    cd /usr/local/bin
    sudo ln -s virtctl kubectl-virt
    sudo chmod a+x virtctl
    cd -
  2. מוודאים שהפלאגין virt מותקן:

    kubectl plugin list

    אם הפלאגין הותקן בהצלחה, הפלט של הפקודה יכלול את kubectl-virt כאחד מהפלאגינים.

יצירת קטגוריה של Cloud Storage לתמונות של מכונות וירטואליות

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

  1. כדי ליצור קטגוריה, פועלים לפי השלבים במאמר יצירת קטגוריות.

  2. מגדירים חשבון שירות ומפתח לגישה לקטגוריה באמצעות הפקודות הבאות:

    export PROJECT_ID=$(gcloud config get-value project)
    gcloud iam service-accounts create image-access
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:image-access@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role="roles/storage.objectViewer" \
    gcloud iam service-accounts keys create ./image-access-gcr.json \
      --iam-account="image-access@${PROJECT_ID}.iam.gserviceaccount.com"
  3. יוצרים Secret באשכול כדי לגשת לקטגוריה. אם הדלי גלוי לכולם, אפשר לדלג על השלב הזה. הסוד הזה צריך להיות באותו מרחב שמות כמו הדיסקים של המכונה הווירטואלית. צריך ליצור סוד בכל מרחב שמות מושפע.

    kubectl create secret generic gcs-image-sa --from-file=creds-gcp.json=./image-access-gcr.json -n NAMESPACE

    מחליפים את CLUSTER_ID בשם של מרחב השמות של היעד.

  4. מאחסנים את התמונות בדלי.

יצירת דיסק של מכונה וירטואלית מקובץ אימג' של מכונה וירטואלית

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

יצירת דיסק מקובץ אימג' שמאוחסן ב-Cloud Storage

יוצרים דיסק של מכונה וירטואלית ממכונה וירטואלית שמאוחסנת בקטגוריה של Cloud Storage, על ידי החלת ההגדרה הבאה על האשכול:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   source:
     gcs:
       url: gs://{PROJECT_ID}-vm-images/IMAGE_FILE
       secretRef: gcs-image-sa
   size: DISK_SIZE
   storageClassName: robin-block-immediate

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

  • DISK_NAME: השם של הדיסק של המכונה הווירטואלית.
  • NAMESPACE: מרחב השמות של היעד.
  • IMAGE_FILE: השם של קובץ תמונת המכונה הווירטואלית.
  • DISK_SIZE: גודל הדיסק הרצוי. הערך הזה צריך להיות גדול יותר מהערך virtual-size של קובץ התמונה של המכונה הווירטואלית. אפשר למצוא את הערך הזה באמצעות הפקודה qemu-img info DISK_SIZE.

אם לא מציינים ערך storageClassName, המערכת משתמשת בערך ברירת המחדל שצוין במשאב VMRuntime.

יצירת דיסק מקובץ תמונה של דיסק קיים

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

  1. יוצרים את דיסק היעד על ידי החלת ההגדרה הבאה על האשכול:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: IMAGE_DISK_NAME
      namespace: NAMESPACE
    spec:
      source:
        virtualMachineDisk:
          name: EXISTING_DISK_NAME
      size: DISK_SIZE
      storageClassName: robin-block-immediate

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

    • IMAGE_DISK_NAME: השם של הדיסק של המכונה הווירטואלית.
    • NAMESPACE: מרחב השמות של היעד.
    • EXISTING_DISK_NAME: השם של הדיסק הקיים של המכונה הווירטואלית.
    • DISK_SIZE: גודל הדיסק הרצוי. הגודל הזה צריך להיות שווה לגודל של הדיסק הקיים או של קובץ התמונה, או גדול ממנו.

    כדי לגלות את הגודל של דיסק קיים או של קובץ תמונה, אפשר להשתמש בכלי qemu-img באופן הבא:

    qemu-img info EXISTING_DISK_NAME

    אם לא מציינים ערך storageClassName, המערכת משתמשת בערך ברירת המחדל שצוין במשאב VMRuntime.

  2. יוצרים דיסק חדש מקובץ התמונה הקיים על ידי החלת ההגדרה הבאה על האשכול:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
      namespace: NAMESPACE
    spec:
      source:
        virtualMachineDisk:
          name: IMAGE_DISK_NAME
      size: DISK_SIZE
      storageClassName: robin-block-immediate

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

    • IMAGE_DISK_NAME: השם של דיסק המכונה הווירטואלית שיצרתם בשלב הקודם.
    • NAMESPACE: מרחב השמות של היעד.
    • DISK_SIZE: גודל הדיסק הרצוי. הגודל צריך להיות זהה לגודל של דיסק המכונה הווירטואלית שיצרתם בשלב הקודם.
  3. משנים את הגודל של דיסק היעד לגודל הרצוי באמצעות הפקודה הבאה:

    kubectl edit gdisk DISK_NAME -n NAMESPACE

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

    • DISK_NAME: השם של דיסק המכונה הווירטואלית שיצרתם בשלב הקודם.
    • NAMESPACE: מרחב השמות של היעד.
  4. משנים את הערך spec.size בהגדרת הדיסק ומחילים אותו על האשכול.

יצירת דיסק ריק

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

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   size: DISK_SIZE
   storageClassName: robin-block-immediate

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

  • DISK_NAME: השם של הדיסק של המכונה הווירטואלית.
  • NAMESPACE: מרחב השמות של היעד.
  • DISK_SIZE: גודל הדיסק הרצוי בגיביבייט. הערך הזה צריך להיות גדול יותר מהערך virtual-size של קובץ התמונה של המכונה הווירטואלית. אפשר למצוא את הערך הזה באמצעות הפקודה qemu-img info DISK_SIZE.

אם לא מציינים ערך storageClassName, המערכת משתמשת בערך ברירת המחדל שצוין במשאב VMRuntime.

הגדרת רשתות וירטואליות

פועלים לפי השלבים שבקטע Networking כדי להגדיר את הרשת הווירטואלית למכונות הווירטואליות.

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

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

יצירת מכונה וירטואלית מקובץ אימג' של דיסק שאפשר לאתחל ממנו

כדי ליצור מכונה וירטואלית מקובץ אימג' של דיסק שאפשר לאתחל ממנו, צריך להחיל את ההגדרה הבאה על האשכול:

 kind: VirtualMachine
 metadata:
   name: my-virtual-machine
   namespace: my-vm-namespace
 spec:
   osType: Linux/Windows
   guestEnvironment: {} // comment out this line to enable guest environment for access management
   autoRestartOnConfigurationChange: true 
   compute:
     cpu:
       vcpus: 6
     memory:
       capacity: 8Gi
   interfaces:
      - name: eth0
        networkName: network-410
        ipAddresses:
        - 10.223.237.10/25
   disks:
     - virtualMachineDiskName: my-boot-disk
       boot: true
     - virtualMachineDiskName: my-data-disk

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

  • DISK_NAME: השם של הדיסק של המכונה הווירטואלית.
  • NAMESPACE: מרחב השמות של היעד.

יצירת מכונה וירטואלית מקובץ אימג' של דיסק אופטי ISO

כדי ליצור מכונה וירטואלית מקובץ אימג' של דיסק אופטי ISO, צריך לבצע את השלבים במאמר בנושא יצירת מכונה וירטואלית של Windows מקובץ אימג' ISO ב-Google Distributed Cloud.

יצירת מכונה וירטואלית עם תמיכה ב-GPU

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

גישה למכונה וירטואלית

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

קבלת פרטי כניסה לגישה

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

  1. כדי להפעיל את סביבת האורח של Linux במכונה הווירטואלית של היעד, צריך להחיל את ההגדרה הבאה על האשכול:

    kind: VirtualMachine
    metadata:
     name: my-virtual-machine
     namespace: my-vm-namespace
    spec:
     osType: Linux
     guestEnvironment: {}
     autoRestartOnConfigurationChange: true 
  2. מריצים את הפקודה הבאה כדי ליצור קובץ id_rsa.pub שמכיל זוג מפתחות SSH:

    ssh-keygen -t rsa
  3. יוצרים משאב VirtualMachineAccessRequest על ידי החלת ההגדרה הבאה על האשכול:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachineAccessRequest
    metadata:
     name: RESOURCE_NAME
     namespace: NAMESPACE
    spec:
      vm: VM_NAME
      user: USER_NAME
      ssh:
        key: RSA_KEY
        ttl: 2h

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

  • RESOURCE_NAME: שם תיאורי של משאב בקשת הגישה למכונה הווירטואלית.
  • NAMESPACE: מרחב השמות של היעד.
  • VM_NAME: השם של המכונה הווירטואלית של היעד.
  • USER_NAME: השם של המשתמש שמקבל גישה.
  • RSA_KEY: התוכן של קובץ id_rsa.pub שיצרתם בשלב הקודם.
  1. כדי לבדוק את הסטטוס של בקשת הגישה, מריצים את הפקודה הבאה:

    kubectl get vmar
    

    אם הפקודה מחזירה סטטוס Configured, ממשיכים לשלב הבא.

  2. ניגשים למכונה הווירטואלית באמצעות SSH או Remote Desktop:

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

הפעלה, הפעלה מחדש או עצירה של מכונה וירטואלית

משתמשים בפקודות הבאות כדי להפעיל, להפעיל מחדש או לעצור מכונה וירטואלית:

  • הפעלת מכונה וירטואלית: kubectl virt start vmVM_NAME-nNAMESPACE
  • הפעלה מחדש של מכונה וירטואלית: kubectl virt restart vmVM_NAME-nNAMESPACE
  • הפסקת מכונה וירטואלית: kubectl virt stop vmVM_NAME-nNAMESPACE

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

  • VM_NAME: השם של המכונה הווירטואלית של היעד.
  • NAMESPACE: מרחב השמות של היעד.

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