יצירה וניהול של דיסקים וירטואליים ב-Google Distributed Cloud

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

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

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

יצירת מכונת VM עם דיסק מצורף

כשיוצרים מכונה וירטואלית, אפשר לצרף דיסק אתחול או דיסק נתונים קיים, ליצור דיסק מתמונה (כולל דיסק האתחול) או ליצור דיסק ריק.

דיסק ריק

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

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

    nano my-vm.yaml
    
  2. מעתיקים ומדביקים את הגדרת ה-YAML הבאה:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

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

    • DISK_NAME: השם של הדיסק הריק שאתם יוצרים ומצרפים למכונה הווירטואלית.

    • VM_NAME: השם של המכונה הווירטואלית שאתם יוצרים.

      בדוגמה הזו נוצר דיסק ריק בגודל 10Gi (10 גיביבייט) בשם DISK_NAME. בקטע spec.disks של המכונה הווירטואלית, צריך גם לצרף דיסק אתחול, למשל מתמונה כמו שמוצג בקטע הבא.

  3. שומרים את קובץ המניפסט וסוגרים אותו בעורך.

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

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    מחליפים את הערך של KUBECONFIG בנתיב לקובץ kubeconfig של האשכול.

מתוך תמונה

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

מקורות תמונות נתמכים

‫VM Runtime ב-GDC מאפשר מגוון פורמטים של תמונות ותומך בשלושה סוגים של מקורות תמונות שאפשר לציין במפרט VirtualMachineDisk. כל אחת מהדוגמאות הבאות יוצרת דיסק של 20 גיביבייט ממקור תמונה נתמך אחר.

  • Hypertext Transfer Protocol (פרוטוקול העברת היפרטקסט)

    בדוגמה הבאה של VirtualMachineDisk מוצג המבנה הבסיסי של מקור תמונות ב-HTTP. בשדה url צריך להזין כתובת URL מסוג HTTP או HTTPS.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        http:
          url: https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
      size: 20GiB
      storageClassName: local-shared
    
  • Cloud Storage

    בדוגמה הבאה מוצג אופן יצירת דיסק מקובץ אימג' בקטגוריה של Cloud Storage. אם פרטי הכניסה שמוגדרים כברירת מחדל באפליקציה במחשב לא מספיקים כדי לגשת לכתובת ה-URL של Cloud Storage, צריך לספק פרטי כניסה. בדוגמה הבאה, my-gcs הוא סוד שמכיל מפתח של חשבון שירות שמקודד ב-Base64.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        gcs:
          url: gs://kubevirt-ci-vm-images/rhel8.2/rhel8_2_cloud.qcow2
          secretRef: my-gcs
      size: 20GiB
      storageClassName: local-shared
    

    אם השתמשתם במפתחות של חשבונות שירות שהורדתם כדי ליצור את האשכול, תוכלו להשתמש במפתח של חשבון השירות של Artifact Registry כדי לגשת ל-Cloud Storage. אם אתם רוצים ליצור חשבון שירות נפרד כדי לגשת ל-Cloud Storage, תוכלו לעיין במאמר הגדרת חשבון שירות שיכול לגשת לקטגוריה של Cloud Storage.

    כדי ליצור סוד ב-Kubernetes מקובץ מפתח של חשבון שירות שהורדתם, משתמשים בפקודה הבאה:

    kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \
        --kubeconfig KUBECONFIG
    

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

    • SECRET_NAME: השם של הסוד.
    • KEY_FILE: הנתיב לקובץ ה-JSON של מפתח חשבון השירות שהורד. לדוגמה, bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json.
    • KUBECONFIG: הנתיב לקובץ kubeconfig של האשכול.

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

  • דוגמה ל-Container registry

    יש תמיכה במאגרי תמונות של קונטיינרים שתואמים ל-Open Container Initiative‏ (OCI) distribution-spec. בדוגמה הבאה נוצר דיסק מקובץ אימג' שמאוחסן במאגר Docker.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        registry:
          url: docker://kubevirt/fedora-cloud-registry-disk-demo
      size: 20GiB
      storageClassName: local-shared
    

פורמטים תקינים של תמונות

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

  • ארכיון GNU zip ‏ (gzip) (.gz)
  • ‫RAW ‏ (.raw, .img)
  • תמונת דיסק של QEMU copy on write גרסה 2 ‏ (qcow2) ‏ (.qcow2)
  • ארכיון XZ דחוס (.xz)
  • קובץ דיסק של מכונה וירטואלית (VMDK) ‏ (.vmdk)
  • קובץ תמונה של דיסק וירטואלי (VDI) של VirtualBox‏ (.vdi)
  • קובץ אימג' של דיסק קשיח וירטואלי (VHD) ‏ (.vdh)
  • קובץ של דיסק קשיח וירטואלי (VDHX) גרסה 2 (.vdhx)
  • קובץ אימג' של דיסק ISO ‏ (.iso)

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

כדי ליצור דיסק אתחול מתמונת Ubuntu:

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

    nano my-vm.yaml
    
  2. מעתיקים ומדביקים את הגדרת ה-YAML הבאה:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_NAME-boot-dv
    spec:
      size: 20Gi
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
    

    בדוגמה הזו נוצר דיסק בגודל 20Gi (20 גיביבייט) בשם VM_NAME-boot-dv באמצעות קובץ אימג' ציבורי של Ubuntu. בקטע spec.disks של המכונה הווירטואלית, הדיסק מוגדר ל-boot: true.

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

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

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    מחליפים את הערך של KUBECONFIG בנתיב לקובץ kubeconfig של האשכול.

דיסק קיים

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

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

    nano my-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:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: EXISTING_DISK_NAME
    

    בדוגמה הזו מצורף דיסק קיים בשם EXISTING_DISK_NAME.

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

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

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

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    מחליפים את הערך של KUBECONFIG בנתיב לקובץ kubeconfig של האשכול.

איתור דיסקים

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

לדוגמה, אם יצרתם מכונה וירטואלית וציינתם דיסק אתחול בשם sample-boot-dv, משאב מותאם אישית VirtualMachine ייראה בערך כך:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: sample-vm
spec:
  osType: Linux
  compute:
    cpu:
      vcpus: 2
    memory:
      capacity: 4Gi
  interfaces:
    - name: eth0
      networkName: pod-network
      default: true
  disks:
    - boot: true
      virtualMachineDiskName: sample-vm-boot-dv
    - virtualMachineDiskName: attached-disk

במכונות וירטואליות של Linux, כשמתחברים ל-VM, אפשר להריץ את הפקודה הבאה כדי לקבל רשימה של הדיסקים לפי המספר הסידורי שלהם:

ls -l /dev/disk/by-id/

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

total 0
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentInstallation -> ../../sdb
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentSADisk -> ../../sda
lrwxrwxrwx 1 root root  9 Oct 19 17:17 virtio-sample-boot-dv -> ../../vda
lrwxrwxrwx 1 root root 10 Oct 19 17:17 virtio-sample-boot-dv-part1 -> ../../vda1
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part14 -> ../../vda14
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part15 -> ../../vda15
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-attached-disk -> ../../vdb

חשוב לשים לב להתנהגות התכונה במצבים הבאים:

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

יצירה וצירוף של דיסקים למכונה וירטואלית קיימת

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

דיסק ריק

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

  1. משתמשים ב-kubectl כדי לעצור את ה-VM, אם צריך:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

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

    • VM_NAME: השם של המכונה הווירטואלית שרוצים לעצור.
    • KUBECONFIG: הנתיב לקובץ kubeconfig של האשכול.
  2. עורכים את משאב מכונת ה-VM הקיים, כמו my-vm:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. מעדכנים את מניפסט ה-YAML VirtualMachine כדי להוסיף קטע VirtualMachineDisk בחלק העליון, ואז מצרפים את הדיסק בסוף הקטע spec.disks של מכונת ה-VM:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    בדוגמה הזו נוצר דיסק ריק בגודל 10Gi (10 גיביבייט) בשם DISK_NAME.

  4. שומרים וסוגרים את מניפסט מכונת ה-VM המעודכן בעורך.

  5. משתמשים ב-kubectl כדי להפעיל את המכונה הווירטואלית:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

מתוך תמונה

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

  1. משתמשים ב-kubectl כדי לעצור את ה-VM, אם צריך:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

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

    • VM_NAME: השם של המכונה הווירטואלית שרוצים לעצור.
    • KUBECONFIG: הנתיב לקובץ kubeconfig של האשכול.
  2. עורכים את משאב מכונת ה-VM הקיים, כמו my-vm:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. מעדכנים את המניפסט VirtualMachine כדי להוסיף קטע VirtualMachineDisk בחלק העליון, ואז מצרפים את הדיסק בסוף הקטע spec.disks של מכונת ה-VM:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
      source:
        http:
          url: http://example.com/my-disk-img.qcow2
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    בדוגמה הזו נוצר דיסק 10Gi (10 גיביבייט) בשם DISK_NAME ממקור HTTP‏ http://example.com/my-disk-img.qcow2.

  4. שומרים וסוגרים את מניפסט מכונת ה-VM המעודכן בעורך.

  5. משתמשים ב-kubectl כדי להפעיל את המכונה הווירטואלית:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

יצירת דיסק

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

דיסק ריק

כדי ליצור דיסק ריק, מבצעים את השלבים הבאים.

  1. יוצרים קובץ VirtualMachineDisk מניפסט, כמו my-disk.yaml, בעורך לבחירתכם:

    nano my-disk.yaml
    
  2. מעתיקים ומדביקים את הגדרת ה-YAML הבאה:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    

    בדוגמה הזו נוצר דיסק ריק בגודל 10Gi (10 גיביבייט) בשם DISK_NAME.

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

  4. יוצרים את הדיסק באמצעות kubectl:

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    מחליפים את הערך של KUBECONFIG בנתיב לקובץ kubeconfig של האשכול.

מתוך תמונה

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

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

    nano my-disk.yaml
    
  2. מעתיקים ומדביקים את הגדרת ה-YAML הבאה:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 20Gi
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    

    בדוגמה הזו נוצר דיסק בנפח 20Gi (20 גיביבייט) בשם DISK_NAME באמצעות קובץ אימג' ציבורי של Ubuntu.

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

  4. יוצרים את הדיסק באמצעות kubectl:

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    מחליפים את הערך של KUBECONFIG בנתיב לקובץ kubeconfig של האשכול.

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