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

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

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

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

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

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

  • אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות. אימות הוא התהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-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 במסמכי האימות של Google Cloud .

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

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

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

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

    gcloud compute ssh VM_NAME
    

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

  3. מתקינים את החבילה האחרונה של qemu-kvm:

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

  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. בודקים אם למכונה הווירטואלית ברמה L2 יש גישה חיצונית:

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

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

כדי ליצור מכונה וירטואלית ברמה 2 עם גשר רשת פרטי למכונה הווירטואלית ברמה 1 שיצרתם קודם, פועלים לפי התהליך הבא. למידע על שינוי ברירת המחדל של יחידת השידור המקסימלית (MTU) של רשת ה-VPC, קראו את הסקירה הכללית על יחידת השידור המקסימלית.

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

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

    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 כדי לעבור מה-VM ברמה 1 ל-VM ברמה 2:

    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, כדי להשתמש בו במכונה הווירטואלית ברמה 2.

  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. במכונה הווירטואלית ברמה 2, מריצים את הפקודה ip addr show כדי לוודא שיש למכונה הווירטואלית כתובת במרחב 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. כדי לבדוק אם המכונה הווירטואלית ברמה 1 יכולה לשלוח פינג למכונה הווירטואלית ברמה 2, מחליפים את כתובת ה-IP הבאה בכתובת ה-IP של המכונה הווירטואלית ברמה 2:

    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>
    

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

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

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

  1. יוצרים מכונה וירטואלית ברמה L1 עם וירטואליזציה בתצורה משולבת, וכוללים טווח כתובות IP חלופיות ותמיכה בתעבורת נתונים ב-HTTP או ב-HTTPS. פלטפורמת ה-CPU המינימלית למכונות וירטואליות של Intel צריכה להיות "Intel Haswell":

    gcloud

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

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

    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"
            }
          ],
        }
      ],
      "advancedMachineFeatures": {
        "enableNestedVirtualization": true
      },
      ...
    }
    

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

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

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

    • ‫VM_NAME: השם של ה-VM

  2. משתמשים בפקודה gcloud compute ssh כדי להתחבר ל-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 כדי לעבור מה-VM ברמה 1 ל-VM ברמה 2:

    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, כדי להשתמש בו במכונה הווירטואלית ברמה 2.

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

    screen
    
  13. כדי להפעיל את המכונה הווירטואלית בתצורה בת-מקוננת, משתמשים בפקודה הבאה. כשמוצגת בקשה, נכנסים לחשבון באמצעות 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. ב-VM ברמה L2, מריצים את הפקודה ip addr כדי לוודא שיש ל-VM ברמה 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. כדי לבדוק אם המכונה הווירטואלית ברמה 1 יכולה לשלוח פינג למכונה הווירטואלית ברמה 2, מחליפים את כתובת ה-IP בכתובת ה-IP של המכונה הווירטואלית ברמה 2:

    curl 192.168.122.89:8000
    
  18. מוודאים שהתגובה מה-VM ברמה 2 דומה לזו:

    <!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 שמשמש בהוראות האלה, צריך לנקות את IPtables:

    sudo iptables -F
    
  20. מזהים את כתובת ה-IP החלופית של המכונה הווירטואלית ברמה 1:

    ip route show table local
    
  21. מוודאים שהפלט דומה לפלט הבא: בדוגמה הזו, יש שתי כתובות IP שמשויכות למכשיר האתרנט eth0 של ה-VM ברמה 2. הראשונה, 10.128.0.2, היא כתובת ה-IP הראשית של ה-VM ברמה 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 לדוגמה של ה-alias‏ 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. כדי לאמת את הגישה למכונה הווירטואלית ברמה 2 מחוץ למכונה הווירטואלית ברמה 1, נכנסים למכונה וירטואלית אחרת שנמצאת באותה רשת כמו המכונה הווירטואלית ברמה 1, ושולחים בקשת curl לכתובת ה-IP החלופית על ידי החלפת כתובת ה-IP בכתובת ה-IP החלופית של המכונה הווירטואלית ברמה 2:

    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>
    

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