הווירטואליזציה המקוננת מותרת כברירת מחדל, כך שאם אף אחד לא משנה את המגבלה על הווירטואליזציה המקוננת, לא צריך לבצע שינויים לפני שיוצרים מכונות וירטואליות מקוננות בארגון, בתיקייה או בפרויקט. אם הפרויקט לא שייך לארגון, הווירטואליזציה המקוננת מותרת כברירת מחדל ואי אפשר לשנות את ההגבלה. במאמר ניהול האילוץ של וירטואליזציה בתצורה בת-זוג מוסבר איך לשנות את האילוץ שקובע אם אפשר ליצור מכונות וירטואליות בתצורה בת-זוג.
במאמר הזה נסביר איך ליצור סוגים שונים של מכונות וירטואליות (VM) ברמה 2 (L2). לפני שיוצרים VM בתצורה בת-זוג, צריך ליצור VM ברמה L1 שמופעלת בו וירטואליזציה בת-זוג. לתיאור של מכונות וירטואליות ברמה 1 וברמה 2, קראו את הסקירה הכללית על וירטואליזציה בתצוגת עץ.
אחרי שיוצרים מכונה וירטואלית ברמה 1 עם וירטואליזציה בתצורה מקוננת, אפשר לבצע את הפעולות הבאות:
- יצירת מכונה וירטואלית ברמה 2 עם גישה לרשת חיצונית
- יצירת מכונה וירטואלית ברמה L2 עם גשר רשת פרטי למכונה וירטואלית ברמה L1
- יצירת מכונה וירטואלית ברמה L2 עם גישה לרשת מחוץ למכונה הווירטואלית ברמה L1
לפני שמתחילים
-
אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות.
אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:
צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:
gcloud
-
התקינו את ה-CLI של Google Cloud. אחר כך, מאתחלים את ה-CLI של Google Cloud באמצעות הפקודה הבאה:
gcloud initאם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
- הגדרת אזור ותחום כברירת מחדל
REST
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.
התקינו את ה-CLI של Google Cloud.
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .
יצירת מכונה וירטואלית ברמה 2 עם גישה לרשת חיצונית
כדי ליצור מכונה וירטואלית ברמה L2 עם גישה לרשת חיצונית, מבצעים את השלבים הבאים.
בתהליך הזה משתמשים ב-qemu-system-x86_64 כדי להפעיל את המכונה הווירטואלית ברמה 2. אם אתם משתמשים בתהליך אחר כדי ליצור VM ברמה 2 ונתקלים בבעיות, שחזרו את הבעיה באמצעות התהליך הזה לפני שאתם פונים לתמיכה.
יוצרים מכונה וירטואלית ברמה L1 שמופעלת בה וירטואליזציה בתצורה משולבת.
משתמשים בפקודה
gcloud compute sshכדי להתחבר למכונה הווירטואלית:gcloud compute ssh VM_NAME
מחליפים את
VM_NAMEבשם של המכונה הווירטואלית שאליה רוצים להתחבר.מתקינים את חבילת
qemu-kvmהעדכנית:sudo apt update && sudo apt install qemu-kvm -y
מורידים קובץ אימג' של מערכת הפעלה שתואם ל-QEMU כדי להשתמש בו במכונה הווירטואלית (VM) ברמה 2.
משתמשים בפקודה הבאה כדי להפעיל את מכונת ה-VM ברמה 2. כשמופיעה בקשה, מתחברים באמצעות
user: root,password: root.sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -curses
מחליפים את
IMAGE_NAMEבשם של קובץ האימג' של מערכת ההפעלה שתואמת ל-QEMU, שבו רוצים להשתמש במכונה הווירטואלית ברמה 2.בודקים שלמכונה הווירטואלית ברמה 2 יש גישה חיצונית:
user@nested-vm:~$ host google.com
יצירת מכונה וירטואלית ברמה L2 עם גשר רשת פרטי למכונה וירטואלית ברמה L1
כדי ליצור מכונה וירטואלית (VM) ברמה L2 עם גשר רשת פרטי למכונה וירטואלית ברמה L1 שנוצרה קודם, צריך לפעול לפי השלבים הבאים. מידע על שינוי יחידת השידור המקסימלית (MTU) שמוגדרת כברירת מחדל ברשת VPC זמין במאמר סקירה כללית על יחידת שידור מקסימלית (MTU).
יוצרים מכונה וירטואלית ברמה 1 שמופעלת בה וירטואליזציה בתצורה מקוננת.
משתמשים בפקודה
gcloud compute sshכדי להתחבר למכונה הווירטואלית:gcloud compute ssh VM_NAME
מחליפים את
VM_NAMEבשם של המכונה הווירטואלית שאליה רוצים להתחבר.מתקינים את החבילות שנדרשות ליצירת הגשר הפרטי:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
מפעילים את רשת ברירת המחדל שמגיעה עם חבילת
libvirt:sudo virsh net-start default
מריצים את הפקודה הבאה כדי לוודא שיש לכם את הגשר
virbr0:ip addr
הפלט אמור להיראות כך:
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יוצרים ממשק
tapכדי לעבור מהמכונה הווירטואלית L1 למכונה הווירטואלית L2:sudo tunctl -t tap0 sudo ifconfig tap0 up
מקשרים את הממשק
tapלגשר הפרטי:sudo brctl addif virbr0 tap0
מריצים את הפקודה הבאה כדי לוודא שהגדרת רשת הגישור בוצעה:
sudo brctl show
הפלט אמור להיראות כך:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nicמורידים קובץ אימג' של מערכת הפעלה שתואם ל-QEMU כדי להשתמש בו במכונה הווירטואלית (VM) ברמה 2.
מריצים את הפקודה
screenומקישים על Enter בפרומפט הפתיחה:screen
משתמשים בפקודה הבאה כדי להפעיל את מכונת ה-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.במכונה הווירטואלית L2, מריצים את הפקודה
ip addr showכדי לוודא שלמכונה הווירטואלית יש כתובת במרחבvirbr0– לדוגמה,192.168.122.89:user@nested-vm:~$ ip addrמפעילים שרת אינטרנט זמני ביציאה
8000:user@nested-vm:~$ python -m http.serverניתוק מהסשן
screenעםCtrl+A, Ctrl+D.בודקים אם המכונה הווירטואלית ברמה 1 יכולה לשלוח פינג למכונה הווירטואלית ברמה 2. מחליפים את כתובת ה-IP הבאה בכתובת ה-IP של המכונה הווירטואלית ברמה 2:
curl 192.168.122.89:8000
הפלט אמור להיראות כך:
<!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
אפשר להגדיר מכונה וירטואלית ברמה 2 עם כתובת IP של כינוי, כדי שמכונות וירטואליות מחוץ למכונה וירטואלית ברמה 1 יוכלו לגשת למכונה וירטואלית ברמה 2. כדי ליצור מכונה וירטואלית ברמה L2 עם גישה לרשת באמצעות כתובת IP של כינוי מחוץ למכונה הווירטואלית ברמה L1 שנוצרה קודם, פועלים לפי התהליך הבא. למידע נוסף על יצירת כתובות IP חלופיות, ראו הגדרת טווחי כתובות IP חלופיות.
ההליך הבא מניח שקיימת תת-רשת שנקראת subnet1. אם כבר יש לכם רשת משנה בשם אחר, צריך להחליף את subnet1 בשם של רשת המשנה או ליצור רשת משנה חדשה בשם subnet1.
יוצרים מכונה וירטואלית ברמה 1 עם וירטואליזציה בתצורה מקוננת, וכוללים טווח של כתובות 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
משתמשים בפקודה
gcloud compute sshכדי להתחבר ל-VM. אם אתם נתקלים בבעיות בהתחברות למכונה הווירטואלית, נסו לאפס אותה או לשנות את כללי חומת האש.gcloud compute ssh VM_NAME
מחליפים את
VM_NAMEבשם של המכונה הווירטואלית שאליה רוצים להתחבר.מעדכנים את ה-VM ומתקינים את החבילות הנדרשות:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
מפעילים את רשת ברירת המחדל שמגיעה עם חבילת
libvirt:sudo virsh net-start default
מריצים את הפקודה הבאה כדי לבדוק אם יש לכם את הגשר
virbr0:user@nested-vm:~$ ip addrבודקים שהפלט דומה לזה:
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יוצרים ממשק
tapכדי לעבור מהמכונה הווירטואלית ברמה 1 למכונה הווירטואלית ברמה 2:sudo tunctl -t tap0 sudo ifconfig tap0 up
מקשרים את הממשק
tapלגשר הפרטי:sudo brctl addif virbr0 tap0
מריצים את הפקודה הבאה כדי לוודא שהגדרת רשת הגישור בוצעה:
sudo brctl show
בודקים שהפלט דומה לזה:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nicמורידים קובץ אימג' של מערכת הפעלה שתואם ל-QEMU כדי להשתמש בו במכונה הווירטואלית (VM) ברמה 2.
מריצים את הפקודה
screenומקישים על Enter בפרומפט הפתיחה:screen
כדי להפעיל את המכונה הווירטואלית המקוננת, משתמשים בפקודה הבאה. כשמופיעה בקשה, מתחברים באמצעות
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, שבו רוצים להשתמש במכונה הווירטואלית ברמה L2.במכונה הווירטואלית L2, מריצים את הפקודה
ip addrכדי לוודא שלמכונה הווירטואלית L2 יש כתובת במרחב virbr0, כמו192.168.122.89:user@nested-vm:~$ ip addrמפעילים שרת אינטרנט זמני ביציאה
8000:user@nested-vm:~$ python -m http.serverהתנתקות מהסשן של
screenעםCtrl+A,Ctrl+D.בודקים שהמכונה הווירטואלית ברמה 1 יכולה לשלוח פינג למכונה הווירטואלית ברמה 2. מחליפים את כתובת ה-IP שלמטה בכתובת ה-IP של המכונה הווירטואלית ברמה 2:
curl 192.168.122.89:8000
מוודאים שהתגובה מהמכונה הווירטואלית ברמה 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>במכונה הווירטואלית L1, מגדירים את
iptablesכדי לאפשר העברה מהמכונה הווירטואלית L1 למכונה הווירטואלית L2. כדי להשתמש בקובץ אימג' של מערכת ההפעלה L2 שמופיע בהוראות האלה, צריך לרוקן מידע (Flush) את טבלאות ה-IP:sudo iptables -F
קובעים את כתובת ה-IP של הכינוי של מכונה וירטואלית ברמה 1:
ip route show table local
מוודאים שהפלט דומה לזה שמופיע בהמשך. בדוגמה הזו, יש שתי כתובות IP שמשויכות למכשיר האתרנט
eth0של מכונת L2. הראשונה,10.128.0.2, היא כתובת ה-IP הראשית של מכונת L2, שמוחזרת על ידיsudo ifconfig -a. השנייה,10.128.0.13, היא כתובת ה-IP החלופית של ה-VM ברמה 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מריצים את הפקודות הבאות כדי להעביר תנועה מכתובת ה-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לא מעביר תנועה.כדי לוודא שיש למכונה הווירטואלית L2 גישה מחוץ למכונה הווירטואלית L1, מתחברים למכונה וירטואלית אחרת שנמצאת באותה רשת כמו המכונה הווירטואלית L1, ומבצעים בקשת
curlלכתובת ה-IP של הכינוי. מחליפים את כתובת ה-IP שבהמשך בכתובת ה-IP של הכינוי של המכונה הווירטואלית L2:user@another-vm:~$ curl 10.128.0.13:8000מוודאים שהתגובה
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>