שימוש בסקריפט לטעינה בזמן ההפעלה במכונת VM במכונות וירטואליות של Linux

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

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

כדי להשתמש בפקודות של ממשק שורת הפקודה (CLI) של gdcloud, צריך לוודא שהורדתם, התקנתם והגדרתם את gdcloud CLI. כל הפקודות למכשיר GDC עם air gap משתמשות ב-CLI‏ gdcloud או kubectl, ודורשות סביבת מערכת הפעלה (OS).

קבלת הנתיב של קובץ kubeconfig

כדי להריץ פקודות בשרת Management API, צריך לוודא שיש לכם את המשאבים הבאים:

  1. מאתרים את שם השרת של Management API או שואלים את מנהל הפלטפורמה מה שם השרת.

  2. נכנסים ויוצרים את קובץ ה-kubeconfig לשרת Management API אם אין לכם כזה.

  3. משתמשים בנתיב כדי להחליף את MANAGEMENT_API_SERVER{"</var>"}} בהוראות האלה.

שליחת בקשה לתפקידי IAM

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

  • Project VirtualMachine Admin (project-vm-admin): יצירה, שינוי, הצגה ומחיקה של מכונות וירטואליות במרחב השמות של הפרויקט.

  • Secret Admin (secret-admin): get, list, create, update, delete, patch, and watch Kubernetes secrets in the project namespace. משתמשים בתפקיד הזה כדי לציין סודות של סקריפט לטעינה בזמן ההפעלה. לא צריך את התפקיד הזה כדי לציין סקריפטים להפעלה של טקסט פשוט.

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

העברת סקריפט לטעינה בזמן ההפעלה

אפשר להשתמש בסקריפטים של bash או בסקריפטים אחרים כסקריפטים לטעינה בזמן ההפעלה. כדי לעשות זאת, צריך לכלול את התו #!/bin/… בתחילת הסקריפט כדי לציין את מתורגמן הסקריפט. לדוגמה, כדי להשתמש בסקריפט לטעינה בזמן ההפעלה בשפת Python 3, מוסיפים את #! /usr/bin/python3 לתחילת הסקריפט.

מכשיר Google Distributed Cloud ‏ (GDC) עם פער אוויר מריץ סקריפטים לטעינה בזמן ההפעלה בסדר אלפביתי, על סמך השם של כל סקריפט לטעינה בזמן ההפעלה.

בטבלה הבאה מפורט פורמט התסריט שבו צריך להשתמש בהתאם לגודל התסריט:

גודל התסריט פורמט התסריט
סקריפטים עד 2,048 בייט טקסט גלוי
סקריפטים שגדולים מ-2048 בייט סוד ב-Kubernetes

הגדרת סקריפט לטעינה בזמן ההפעלה

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

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

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  …
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data: 
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

כדאי לעיין בשיקולים הבאים:

  • סקריפט לטעינה בזמן ההפעלה פועל בכל אתחול.
  • לסקריפט לטעינה בזמן ההפעלה יש הרשאות ברירת מחדל של root.
  • בסוד של Kubernetes, השם של scriptSecretRef במכונה הווירטואלית spec חייב להיות זהה לשדה metadata.name.
  • בסוד של Kubernetes, מציינים את התוכן של סקריפט לטעינה בזמן ההפעלה על ידי הוספת מפתח script לשדה data.

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

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

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

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER create secret -n PROJECT generic SECRET_NAME --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. אפשר להיעזר בשלבים ליצירת מכונה וירטואלית שמתוארים בדף יצירת מכונה וירטואלית. בשלב הראשון מוסיפים את הסקריפט או הסקריפטים לטעינה בזמן ההפעלה לשדה spec לפני שמריצים את הפקודה ליצירת מכונה וירטואלית.

    בדוגמה הזו מוגדר סקריפט לטעינה בזמן ההפעלה עם טקסט ברור וגם עם סוד של Kubernetes:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
    name: VM_NAME
    namespace: PROJECT
    spec:
    …
    startupScripts:
    - name: CLEAR_TEXT_SCRIPT_NAME
      script: |
        #!/bin/bash
        CLEAR_TEXT_SCRIPT
    - name: SECRET_SCRIPT_NAME
      scriptSecretRef:
        name: SECRET_NAME
    

    המשתנים האלה מוגדרים כך:

    משתנההגדרה
    MANAGEMENT_API_SERVER קובץ kubeconfig של Management API.
    PROJECT פרויקט מכשיר GDC עם air gap שבו רוצים ליצור את המכונה הווירטואלית.
    VM_NAME שם מכונת ה-VM.
    FILE_NAME השם של הקובץ שבו יישמר סקריפט לטעינה בזמן ההפעלה.
    STARTUP_SCRIPT_CONTENT הפקודות שיופעלו כחלק מסקריפט לטעינה בזמן ההפעלה
    CLEAR_TEXT_SCRIPT_NAME השם של סקריפט לטעינה בזמן ההפעלה של הטקסט הגלוי.
    CLEAR_TEXT_SCRIPT הסקריפט של הטקסט הגלוי שאתם מגדירים.
    SECRET_NAME השם של הסוד ב-Kubernetes.
    SECRET_SCRIPT_NAME השם של סקריפט לטעינה בזמן ההפעלה כסוד של Kubernetes.
  3. כדי ליצור מכונה וירטואלית, ממשיכים לשלבים הבאים.

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

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        apply -n PROJECT -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data: 
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    בדוגמה, המשתנים מוגדרים כך:

    משתנההגדרה
    MANAGEMENT_API_SERVER קובץ kubeconfig של Management API.
    PROJECT פרויקט מכשיר GDC עם air gap שבו רוצים ליצור את המכונה הווירטואלית.
    VM_NAME השם של מכונת ה-VM החדשה.
    VM_BOOT_DISK_NAME השם של דיסק האתחול של המכונה הווירטואלית החדשה.
    BOOT_DISK_IMAGE_NAME השם של האימג' שישמש לדיסק האתחול של מכונת ה-VM החדשה.
    BOOT_DISK_SIZE גודל דיסק האתחול, למשל 20G.
    הערך הזה תמיד צריך להיות גדול מהערך minimumDiskSize של תמונת דיסק האתחול או שווה לו.
    BOOT_DISK_AUTO_DELETE הערך true או false, שמציין אם דיסק האתחול נמחק אוטומטית כשמוחקים את מופע ה-VM.
    MACHINE_TYPE סוג המכונה עם קונפיגורציה מוגדרת (predefined) של המכונה הווירטואלית החדשה. כדי לבחור סוג מכונה זמין, מריצים את הפקודה הבאה:
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

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

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

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

הצגת הפלט של סקריפט לטעינה בזמן ההפעלה

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

    sudo journalctl -u cloud-final
    

    יומני סקריפט לטעינה בזמן ההפעלה מתחילים במילים הבאות:

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...