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

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

במאמר הזה נסביר איך ליצור סוגים שונים של מכונות וירטואליות (VM) ברמה 2 (L2). לפני שיוצרים מכונה וירטואלית מקוננת, צריך ליצור מכונה וירטואלית ברמה L1 עם הפעלה של וירטואליזציה מקוננת. תיאור של מכונות וירטואליות ברמה 1 וברמה 2 זמין במאמר סקירה כללית על וירטואליזציה מקוננת.

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

  • יצירת מכונה וירטואלית ברמה 2 עם גישה לרשת חיצונית
  • יצירת מכונה וירטואלית ברמה L2 עם גשר רשת פרטי למכונה וירטואלית ברמה L1
  • יצירת מכונה וירטואלית ברמה L2 עם גישה לרשת מחוץ למכונה וירטואלית ברמה L1

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

  • אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות. אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Cloud de Confiance by S3NS . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:

    צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:

    gcloud

    1. התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם. אחרי שנכנסתם לחשבון, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:

      gcloud init
  • הגדרת אזור ותחום כברירת מחדל
  • REST

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

      התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם.

    מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Cloud de Confiance .

יצירת מכונה וירטואלית ברמה 2 עם גישה לרשת חיצונית

כדי ליצור מכונה וירטואלית ברמה L2 עם גישה לרשת חיצונית, מבצעים את השלבים הבאים. בתהליך הזה נעשה שימוש ב-qemu-system-x86_64 כדי להפעיל את מכונת ה-VM ברמה 2. אם אתם משתמשים בהליך אחר כדי ליצור מכונת L2 ונתקלתם בבעיה, כדאי לשחזר את הבעיה באמצעות ההליך הזה לפני שפונים אל התמיכה.

  1. יוצרים מכונה וירטואלית ברמה L1 עם וירטואליזציה מקוננת מופעלת.

  2. משתמשים בפקודה gcloud compute ssh כדי להתחבר ל-VM:

    gcloud compute ssh VM_NAME
    

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

  3. מתקינים את חבילת qemu-kvm העדכנית:

    sudo apt update && sudo apt install qemu-kvm -y
    
  4. מורידים קובץ אימג' של מערכת הפעלה שתואם ל-QEMU כדי להשתמש בו במכונה הווירטואלית L2.

  5. משתמשים בפקודה הבאה כדי להפעיל את מכונת ה-VM ברמה 2. כשמופיעה בקשה, מתחברים באמצעות user: root, password: root.

    sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -curses
    

    מחליפים את IMAGE_NAME בשם של קובץ האימג' של מערכת ההפעלה שתואמת ל-QEMU שרוצים להשתמש בו במכונה הווירטואלית ברמה 2.

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

    user@nested-vm:~$ host google.com
    

יצירת מכונה וירטואלית ברמה L2 עם גשר רשת פרטי למכונה וירטואלית ברמה L1

כדי ליצור מכונה וירטואלית (VM) ברמה L2 עם גשר רשת פרטי למכונה וירטואלית ברמה L1 שנוצרה קודם, צריך לפעול לפי השלבים הבאים. מידע על שינוי יחידת השידור המקסימלית (MTU) שמוגדרת כברירת מחדל ברשת VPC זמין במאמר סקירה כללית על יחידת השידור המקסימלית.

  1. יוצרים מכונה וירטואלית ברמה L1 עם וירטואליזציה מקוננת מופעלת.

  2. משתמשים בפקודה gcloud compute ssh כדי להתחבר ל-VM:

    gcloud compute ssh VM_NAME
    

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

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

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. מפעילים את רשת ברירת המחדל שמגיעה עם חבילת libvirt:

    sudo virsh net-start default
    
  5. מריצים את הפקודה הבאה כדי לוודא שיש לכם את הגשר virbr0:

    ip addr
    
  6. הפלט אמור להיראות כך:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff
        inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::4001:aff:fe80:15/64 scope link
           valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
    
  7. יוצרים ממשק tap כדי לעבור מהמכונה הווירטואלית L1 למכונה הווירטואלית L2:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  8. מצמידים את הממשק tap לגשר הפרטי:

    sudo brctl addif virbr0 tap0
    
  9. מריצים את הפקודה הבאה כדי לוודא שהגדרת רשת הגישור בוצעה:

    sudo brctl show
    
  10. הפלט אמור להיראות כך:

    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254008ca6a1       yes             tap0
                                                            virbr0-nic
    
  11. מורידים קובץ אימג' של מערכת הפעלה שתואם ל-QEMU כדי להשתמש בו במכונה הווירטואלית L2.

  12. מריצים את הפקודה screen ומקישים על Enter בהנחיה להודעת הפתיחה:

    screen
    
  13. משתמשים בפקודה הבאה כדי להפעיל את מכונת ה-VM ברמה 2. כשמופיעה בקשה, מתחברים באמצעות user: root, password: root.

    sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    

    מחליפים את IMAGE_NAME בשם של קובץ האימג' של מערכת ההפעלה שתואמת ל-QEMU שרוצים להשתמש בו במכונה הווירטואלית ברמה 2.

  14. במכונה הווירטואלית L2, מריצים את הפקודה ip addr show כדי לוודא שלמכונה הווירטואלית יש כתובת במרחב virbr0 – לדוגמה, 192.168.122.89:

    user@nested-vm:~$ ip addr
    
  15. מפעילים שרת אינטרנט של placeholder ביציאה 8000:

    user@nested-vm:~$ python -m http.server
    
  16. התנתקות מהסשן screen עם Ctrl+A, ‏Ctrl+D.

  17. בודקים אם אפשר לשלוח פינג ממכונת L1 למכונת L2. מחליפים את כתובת ה-IP הבאה בכתובת ה-IP של מכונת L2:

    curl 192.168.122.89:8000
    
  18. הפלט אמור להיראות כך:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

יצירת מכונה וירטואלית ברמה L2 עם גישה לרשת מחוץ למכונה וירטואלית ברמה L1

אפשר להגדיר מכונה וירטואלית ברמה L2 עם כתובת IP של כינוי, כדי שמכונות וירטואליות מחוץ למכונה וירטואלית ברמה L1 יוכלו לגשת למכונה וירטואלית ברמה L2. כדי ליצור מכונה וירטואלית ברמה L2 עם גישה לרשת באמצעות כתובת IP של כינוי מחוץ למכונה הווירטואלית ברמה L1 שנוצרה קודם, פועלים לפי השלבים הבאים. מידע על יצירת כתובות IP של כינויים זמין במאמר בנושא הגדרה של טווחי כתובות IP של כינויים.

ההליך הבא מניח שקיימת תת-רשת שנקראת subnet1. אם כבר יש לכם רשת משנה בשם אחר, מחליפים את subnet1 בשם של רשת המשנה או יוצרים רשת משנה חדשה בשם subnet1.

  1. יוצרים מכונה וירטואלית ברמה 1 עם הפעלה של וירטואליזציה מקוננת, וכוללים טווח של כתובות IP עם כינוי ותמיכה בתעבורת נתונים ב-HTTP/HTTPS:

    gcloud

    gcloud compute instances create VM_NAME --enable-nested-virtualization \
        --tags http-server,https-server --can-ip-forward \
        --min-cpu-platform "Intel Haswell" \
        --network-interface subnet=subnet1,aliases=/30
    

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

    REST

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    
    {
      ...
      "name": VM_NAME,
      "tags": {
        "items": [
          http-server,https-server
        ],
      },
      "canIpForward": true,
      "networkInterfaces": [
        {
          "subnetwork": "subnet1",
          "aliasIpRanges": [
            {
              "ipCidrRange": "/30"
            }
          ],
        }
      ],
      "minCpuPlatform": "Intel Haswell",
      "advancedMachineFeatures": {
        "enableNestedVirtualization": true
      },
      ...
    }
    

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

    • PROJECT_ID: מזהה הפרויקט

    • ZONE: האזור שבו רוצים ליצור את המכונה הווירטואלית

    • VM_NAME: השם של ה-VM

  2. משתמשים בפקודה gcloud compute ssh כדי להתחבר ל-VM. אם נתקלים בבעיות בהתחברות ל-VM, מנסים לאפס את ה-VM או לשנות את כללי חומת האש.

    gcloud compute ssh VM_NAME
    

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

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

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. מפעילים את רשת ברירת המחדל שמגיעה עם חבילת libvirt:

    sudo virsh net-start default
    
  5. מריצים את הפקודה הבאה כדי לוודא שיש לכם את הגשר virbr0:

    user@nested-vm:~$ ip addr
    
  6. בודקים שהפלט דומה לזה:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff
        inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::4001:aff:fe80:15/64 scope link
           valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
    
  7. יוצרים ממשק tap כדי לעבור מהמכונה הווירטואלית L1 למכונה הווירטואלית L2:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  8. מצמידים את הממשק tap לגשר הפרטי:

    sudo brctl addif virbr0 tap0
    
  9. מריצים את הפקודה הבאה כדי לוודא שהגדרת רשת הגישור בוצעה:

    sudo brctl show
    
  10. בודקים שהפלט דומה לזה:

    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254008ca6a1       yes             tap0
                                                            virbr0-nic
    
  11. מורידים קובץ אימג' של מערכת הפעלה שתואם ל-QEMU כדי להשתמש בו במכונה הווירטואלית L2.

  12. מריצים את הפקודה screen ומקישים על Enter בהנחיה להודעת הפתיחה:

    screen
    
  13. כדי להפעיל את מכונת ה-VM המקוננת, משתמשים בפקודה הבאה. כשמופיעה בקשה, מתחברים באמצעות user: root, password: root.

    sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    

    מחליפים את IMAGE_NAME בשם של קובץ האימג' של מערכת ההפעלה שתואמת ל-QEMU שרוצים להשתמש בו במכונה הווירטואלית ברמה 2.

  14. במכונה הווירטואלית L2, מריצים את הפקודה ip addr כדי לוודא שלמכונה הווירטואלית L2 יש כתובת במרחב virbr0, כמו 192.168.122.89:

    user@nested-vm:~$ ip addr
    
  15. מפעילים שרת אינטרנט זמני ביציאה 8000:

    user@nested-vm:~$ python -m http.server
    
  16. התנתקות מהסשן screen עם Ctrl+A, ‏Ctrl+D.

  17. בודקים שמכונת ה-VM ברמה L1 יכולה לשלוח פינג למכונת ה-VM ברמה L2. מחליפים את כתובת ה-IP שבהמשך בכתובת ה-IP של מכונת ה-VM ברמה L2:

    curl 192.168.122.89:8000
    
  18. מוודאים שהתגובה מהמכונה הווירטואלית L2 דומה לתגובה הבאה:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    
  19. במכונה הווירטואלית L1, מגדירים את iptables כך שתתאפשר העברה מהמכונה הווירטואלית L1 למכונה הווירטואלית L2. כדי להשתמש בתמונת מערכת ההפעלה L2 שמופיעה בהוראות האלה, צריך לנקות את טבלאות ה-IP:

    sudo iptables -F
    
  20. קובעים את כתובת ה-IP של הכינוי של מכונה וירטואלית ברמה L1:

    ip route show table local
    
  21. מוודאים שהפלט דומה לזה שמופיע בהמשך. בדוגמה הזו, יש שתי כתובות IP שמשויכות למכשיר האתרנט eth0 של מכונת L2. הראשונה, 10.128.0.2, היא כתובת ה-IP הראשית של המכונה הווירטואלית ברמה 2, שמוחזרת על ידי sudo ifconfig -a. השנייה, 10.128.0.13, היא כתובת ה-IP של הכינוי של המכונה הווירטואלית ברמה 2.

    local 10.128.0.2 dev eth0 proto kernel scope host src 10.128.0.2
    broadcast 10.128.0.2 dev eth0 proto kernel scope link src 10.128.0.2
    local 10.128.0.13/30 dev eth0 proto 66 scope host
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 192.168.122.0 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1
    broadcast 192.168.122.255 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    
  22. מריצים את הפקודות הבאות כדי להעביר תנועה מכתובת ה-IP של הכינוי 10.128.0.13 לדוגמה לכתובת ה-IP 192.168.122.89 לדוגמה של מכונת ה-VM ברמה 2:

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
    sudo iptables -t nat -A PREROUTING -d 10.128.0.13 -j DNAT --to-destination 192.168.122.89
    sudo iptables -t nat -A POSTROUTING -s 192.168.122.89 -j MASQUERADE
    sudo iptables -A INPUT -p udp -j ACCEPT
    sudo iptables -A FORWARD -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p udp -j ACCEPT
    

    מידע על פתרון בעיות ב-iptables זמין במאמר iptables לא מעביר תנועה.

  23. כדי לוודא שיש למכונה הווירטואלית L2 גישה מחוץ למכונה הווירטואלית L1, מתחברים למכונה וירטואלית אחרת שנמצאת באותה רשת כמו המכונה הווירטואלית L1, ומבצעים בקשת curl לכתובת ה-IP של הכינוי. מחליפים את כתובת ה-IP שלמטה בכתובת ה-IP של הכינוי של המכונה הווירטואלית L2:

    user@another-vm:~$ curl 10.128.0.13:8000
    
  24. מוודאים שהתגובה של curl דומה לתגובה הבאה:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

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