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

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

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

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

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

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

הפעלת סוכן האורח

כדי להפעיל את סוכן האורח:

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

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    השדה spec.osType צריך להיות מוגדר למערכת ההפעלה של המכונה הווירטואלית, Linux או Windows. הקטע spec.guestEnvironment לא יכול להיות ריק. אם הקטע מוגדר כריק (guestEnvironment: {}), אפשר להסיר אותו לגמרי כדי להפעיל את סוכן האורחים.

    משאב מותאם אישית VirtualMachine למכונה הווירטואלית שאליה רוצים לגשת צריך להיראות כך:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: sample-vm
    spec:
      compute:
        cpu:
          vcpus: 2
        memory:
          capacity: 4Gi
    ...
      osType: Linux
    ...
    
  2. אם צריך, משתמשים בפקודה kubectl edit כדי לעדכן את המשאב VirtualMachine בהתאמה אישית.

  3. כדי לוודא שהסוכן האורח פועל, בודקים את status במשאב המותאם אישית של מכונת ה-VM:

    kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
    

    כשהסוכן האורח פועל, התנאים status: "True" ו-GuestEnvironmentEnabled מסומנים ב-GuestEnvironmentDataSynced.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      ...
      name: vm-sample-01
      ...
    status:
      conditions:
      - lastTransitionTime: "2022-10-05T22:40:26Z"
        message: ""
        observedGeneration: 1
        reason: UserConfiguration
        status: "True"
        type: GuestEnvironmentEnabled
      - lastTransitionTime: "2022-10-06T21:55:57Z"
        message: ""
        observedGeneration: 1
        reason: GuestEnvironmentDataSynced
        status: "True"
        type: GuestEnvironmentSynced
      ...
    

הפעלת גישת SSH ללא סיסמה

כדי להפעיל גישת SSH ללא סיסמה למכונה הווירטואלית:

  1. יוצרים קובץ מניפסט VirtualMachineAccessRequest, כמו vm-access-request.yaml, בעורך לבחירתכם:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      name: VMAR_NAME
      namespace: VM_NAMESPACE
    spec:
      vm: VM_NAME
      user: USERNAME
      ssh:
        key: PUBLIC_SSH_KEY
        ttl: EXPIRATION_TIME
    

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

    • VMAR_NAME: השם של משאב בקשת הגישה.
    • VM_NAMESPACE: מרחב השמות של המכונה הווירטואלית שרוצים לגשת אליה.
    • VM_NAME: השם של המכונה הווירטואלית שרוצים לגשת אליה.
    • USERNAME: שם המשתמש של המשתמש שניגש למכונה הווירטואלית.
    • PUBLIC_SSH_KEY: המפתח הציבורי לגישת SSH. בדרך כלל זה התוכן של הקובץ id_rsa.pub.
    • EXPIRATION_TIME: השדה ttl (זמן החיים) מציין את משך התוקף של מפתח ה-SSH.

      לדוגמה, אם מציינים 30m, התוקף של מפתח ה-SSH יפוג אחרי 30 דקות.

      הדגל הזה משתמש ביחידות הבאות:

      • s שניות
      • m דקות
      • h במשך שעות
      • d ליומיים
  2. משתמשים ב-kubectl apply כדי ליצור את VirtualMachineAccessRequest מקובץ המניפסט. לדוגמה, אם שם קובץ המניפסט הוא vm-access-request.yaml,

    kubectl apply -f MANIFEST --kubeconfig KUBECONFIG
    

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

    • MANIFEST: השם של קובץ המניפסט של בקשת הגישה. לדוגמה, vm-access-request.yaml.
    • KUBECONFIG: הנתיב לקובץ kubeconfig של האשכול שמארח את המכונה הווירטואלית שאליה אתם ניגשים.
  3. כדי לוודא שהגדרת בקשת הגישה בוצעה בהצלחה, בודקים את הסטטוס של VirtualMachineAccessRequest:

    kubectl get vmar VMAR_NAME -o yaml --kubeconfig KUBECONFIG
    

    אם ההגדרה בוצעה בהצלחה, הקטע status כולל את state: configured:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      ...
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"vm.cluster.gke.io/v1","kind":"VirtualMachineAccessRequest",
          "metadata":{"annotations":{},"name":"vmar-sample","namespace":"default"},
          "spec":{"ssh":{"key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc=
              sample-user@sample-host","ttl":"5h"},"user":"sample-user","vm":"vm-sample-01"}}
      creationTimestamp: "2022-10-06T21:55:57Z"
      finalizers:
      - vm.cluster.gke.io/vmar-finalizer
      generation: 2
      name: vmar-sample
      namespace: default
      resourceVersion: "13033921"
      uid: 282d72ad-f48d-4e89-af22-336940ac9f58
    spec:
      ssh:
        key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc= sample-user@sample-host
        ttl: 5m0s
      user: sample-user
      vm: vm-sample-01
    status:
      processedAt: "2022-10-06T21:55:57Z"
      state: configured
    

השבתת סוכן האורח

כשיוצרים מכונה וירטואלית חדשה ומגדירים את השדה osType, סוכן האורח מופעל. בזמן שהתכונה הזו נמצאת בגרסת טרום-השקה (Preview), אפשר להשבית אותה על ידי עריכה של VirtualMachine המשאב המותאם אישית. השבתת הסוכן לאורחים משביתה את הגישה ל-VM באמצעות SSH ללא סיסמה.

כדי להשבית את סוכן האורח:

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

    kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
    
  1. עורכים את משאב המכונה הווירטואלית:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  2. מעדכנים את ההגדרה של VirtualMachine כדי להוסיף spec.guestEnvironment ריק באופן מפורש:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vm-example
      namespace: default
    spec:
      compute:
      ...
      osType: Linux
      guestEnvironment: {}
    
  3. שומרים וסוגרים את מניפסט מכונת ה-VM המעודכן בעורך.

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

    kubectl virt start VM_NAME --kubeconfig KUBECONFIG
    

קישור באמצעות כתובת IP

אם למכונה הווירטואלית יש כתובת IP נגישה וכבר יש לכם את פרטי הכניסה לגישה למכונה הווירטואלית, אתם יכולים להתחבר באמצעות פרוטוקול כמו SSH,‏ VNC או RDP.

חיבור באמצעות כתובת IP

אם אתם יכולים להתחבר ישירות לכתובת ה-IP של המכונה הווירטואלית, אתם יכולים להשתמש באחת מהשיטות הבאות:

SSH

  1. כדי לראות את כתובת ה-IP של המכונה הווירטואלית, מקבלים את הפרטים שלה:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

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

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

    בדוגמה הבאה של פלט מוצגים פרטי מכונת ה-VM וכתובת ה-IP:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. מתחברים למכונה הווירטואלית באמצעות לקוח SSH:

    ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
    

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

    • USERNAME: שם המשתמש בחשבון במכונה הווירטואלית.
    • IP_ADDRESS: כתובת ה-IP של המכונה הווירטואלית שקיבלתם בשלב הקודם.
    • PATH_TO_KEY: הנתיב למפתח SSH פרטי.

VNC או RDP

Virtual Network Computing ‏ (VNC) ו-Remote Desktop Protocol ‏ (RDP) מאפשרים לכם להשתמש במסוף הגרפי כדי לגשת למכונה הווירטואלית. כשמשתמשים בכתובת IP, צריך להפעיל את VNC או RDP במערכת ההפעלה של האורח כדי להשתמש באחת מהן להתחברות למכונה הווירטואלית. למידע על הפעלה ושימוש ב-VNC או ב-RDP, אפשר לעיין במסמכים של מערכת ההפעלה של האורח.

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

  1. כדי לראות את כתובת ה-IP של המכונה הווירטואלית, מקבלים את הפרטים שלה:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

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

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

    בדוגמה הבאה של פלט מוצגים פרטי מכונת ה-VM וכתובת ה-IP:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. מתחברים לכתובת ה-IP של המכונה הווירטואלית שהתקבלה בשלב הקודם באמצעות כלי לקוח והיציאה המתאימה, כמו יציאת VNC‏ 5900 או יציאת RDP‏ 3389.

חיבור דרך שירות

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

  1. יוצרים קובץ Service manifest, כמו my-service-load-balancer.yaml, בכלי העריכה הרצוי:

    nano my-service-load-balancer.yaml
    
  2. מעתיקים ומדביקים את קובץ המניפסט הבא בפורמט YAML:

    apiVersion: v1
    kind: Service
    metadata:
      name: VM_NAME-service
    spec:
      selector:
        kubevirt/vm: VM_NAME
      ports:
      - name: PORT_NAME
        protocol: PROTOCOL_TYPE
        port: EXTERNAL_PORT
        targetPort: TARGET_PORT
      type: LoadBalancer
    

    במניפסט מסוג Service, מחליפים את הערכים הבאים:

    • VM_NAME: השם של המכונה הווירטואלית שרוצים לחשוף לגישה מרחוק.
    • PORT_NAME: השם של הפרוטוקול, למשל ssh,‏ vnc או rdp.
    • PROTOCOL_TYPE: סוג הפרוטוקול, למשל TCP ל-SSH ול-RDP, או UDP ל-VNC.
    • EXTERNAL_PORT: מספר היציאה החיצונית שרוצים לחשוף ושמשמשת לחיבור.
    • TARGET_PORT: יציאת היעד, למשל 22 ל-SSH.
  3. שומרים וסוגרים את קובץ המניפסט Service בכלי העריכה.

  4. יצירת Service באמצעות kubectl:

    kubectl apply -f my-service-load-balancer.yaml  --kubeconfig KUBECONFIG
    
  5. מקבלים את כתובת EXTERNAL-IP של שירות מאזן העומסים:

    kubectl get service VM_NAME-service --kubeconfig KUBECONFIG
    

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

    NAME          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    vm1-service   LoadBalancer   172.26.232.167   10.200.0.51   22:31141/TCP   6d20h
    
  6. מתחברים לכתובת EXTERNAL-IP של מאזן העומסים באמצעות פרוטוקול סטנדרטי, למשל באמצעות לקוח SSH:

    ssh USERNAME@LOAD_BALANCER_IP_ADDRESS  -i PATH_TO_KEY
    

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

    • USERNAME: שם המשתמש בחשבון במכונה הווירטואלית.
    • LOAD_BALANCER_IP_ADDRESS: כתובת ה-IP של מאזן העומסים.
    • PATH_TO_KEY: הנתיב למפתח SSH פרטי.

חיבור ישיר באמצעות SSH

אם הלקוח שלכם מחובר לאותה רשת פיזית כמו הצמתים של אשכול ה-Bare Metal, ואתם לא צריכים להשתמש במנהרות SSH כדי להתחבר לאשכול, אתם יכולים להתחבר באמצעות kubectl virt ssh.

  1. כדי להשתמש ב-SSH כדי לחבר מכונת Linux וירטואלית מהמסוף באמצעות התוסף virtctl:

    kubectl virt ssh USERNAME@VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

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

    • USERNAME: שם המשתמש לגישה למכונה הווירטואלית. החשבון הזה נוצר אם הוא לא קיים במכונה הווירטואלית.
    • VM_NAME: השם של ה-VM.
  2. אחרי שמתחברים בהצלחה למכונה הווירטואלית באמצעות SSH ולא צריכים יותר את החיבור, יוצאים מסשן ה-SSH:

    exit
    

חיבור ישיר באמצעות המסוף

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

  1. כדי לגשת למכונה וירטואלית של Linux מהמסוף, משתמשים בתוסף virtctl:

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    מחליפים את VM_NAME בשם של המכונה הווירטואלית.

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

  2. אחרי שמתחברים בהצלחה למסוף של המכונה הווירטואלית ולא צריכים יותר את החיבור, יוצאים מהסשן של המכונה הווירטואלית ומהמסוף:

    Ctrl + ]
    

חיבור ישיר באמצעות VNC

אתם יכולים להשתמש בפקודה kubectl virt vnc כדי לפתוח את המסוף הגרפי של Virtual Network Computing ‏(VNC) כדי לגשת למכונות הווירטואליות. השיטה הזו מתאימה למכונות וירטואליות שמופעלות בהן מערכות הפעלה אורחות של Windows או Linux. כשמשתמשים בפקודה kubectl virt vnc, ‏ VM Runtime ב-GDC פותח את VNC בשבילכם, כך שלא נדרש להפעיל את VNC במערכת ההפעלה של האורח.

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

  1. כדי לגשת למכונה וירטואלית באמצעות VNC, משתמשים בתוסף virtctl:

    kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
    

    מחליפים את VM_NAME בשם של המכונה הווירטואלית.

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

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

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

כשמתחברים ל-VM באמצעות המסוף, צריך לציין את פרטי המשתמש. התהליך ליצירת פרטי כניסה ראשוניים של משתמשים שונה במערכות הפעלה אורחות של Linux ו-Windows.

מערכת הפעלה אורחת של Linux

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

  • משתמשים בפרמטר --configure-initial-password עם הפקודה kubectl virt create:

    kubectl virt create vm VM_NAME \
        --image ubuntu20.04 \
        --os-type Linux \
        --configure-initial-password USERNAME:PASSWORD \
        --kubeconfig KUBECONFIG
    

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

    • VM_NAME: השם של המכונה הווירטואלית.
    • USERNAME: שם המשתמש של החשבון שרוצים ליצור במכונה הווירטואלית.
    • PASSWORD: הסיסמה של חשבון המשתמש.

    הפקודה לדוגמה הזו יוצרת מכונה וירטואלית של Linux שמריצה את Ubuntu 20.04. מומלץ לשנות את פרטי הכניסה הראשוניים אחרי הכניסה הראשונה ל-VM.

מערכת הפעלה אורחת של Windows

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

  1. הפעלת סוכן האורח במכונת ה-VM של Windows:

    1. מגדירים את המכונה הווירטואלית כדי להפעיל את סוכן האורח.

    2. משתמשים ב-VNC או ב-RDP כדי להתחבר ל-VM.

    3. במכונה הווירטואלית, עוברים לכונן guest agent. ברוב המקרים, זהו drive E:.

    4. מריצים את install.ps1 באמצעות PowerShell.

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

    5. סוגרים את הסשן המרוחק.

  2. בתחנת העבודה של האדמין, משתמשים בפקודה הבאה כדי לאפס את הסיסמה של מכונת ה-VM של Windows (או להגדיר אותה אם משתמשים בשם משתמש חדש):

    kubectl virt reset-windows-password VM_NAME \
        --user=USERNAME \
        --namespace=VM_NAMESPACE
    

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

    • VM_NAME: השם של המכונה הווירטואלית.
    • USERNAME: שם המשתמש שרוצים לאפס (או להגדיר) את הסיסמה שלו. אם שם המשתמש חדש, הפקודה יוצרת חשבון חדש ב-Windows ומגדירה את הסיסמה הראשונית.
    • VM_NAMESPACE: (אופציונלי) מרחב השמות של המכונה הווירטואלית. הדגל הזה הוא אופציונלי. אם לא מציינים מרחב שמות, המערכת משתמשת במרחב השמות שמוגדר כברירת מחדל, default.

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

    This command creates an account and sets an initial password for the
    user USERNAME if the account does not already exist.
    If the account already exists, resetting the password can cause the
    LOSS OF ENCRYPTED DATA secured with the current password, including
    files and stored passwords.
    
    Would you like to set or reset the password for USERNAME (Y/n)?
    

    אחרי שתאשרו (או תאלצו) את איפוס הסיסמה, הפקודה תחזיר את הסיסמה החדשה של מכונת ה-VM ושם המשתמש שצוינו:

    Resetting and retrieving password for USERNAME on VM_NAME
    
    vm_name:    VM_NAME
    username:   USERNAME
    password:   PASSWORD
    

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