Membuat VM bertingkat


Virtualisasi bertingkat diizinkan secara default. Jadi, kecuali jika seseorang mengubah batasan untuk virtualisasi bertingkat, Anda tidak perlu membuat perubahan apa pun sebelum membuat VM bertingkat dalam organisasi, folder, atau project. Jika project Anda bukan milik organisasi, virtualisasi bertingkat diizinkan secara default dan Anda tidak dapat mengubah batasan. Untuk informasi tentang cara mengubah batasan yang menentukan apakah Anda dapat membuat VM bertingkat atau tidak, lihat Mengelola batasan virtualisasi bertingkat.

Dokumen ini menjelaskan cara membuat berbagai jenis instance mesin virtual (VM) level 2 (L2). Sebelum membuat VM bertingkat, Anda harus membuat VM L1 yang telah mengaktifkan virtualisasi bertingkat. Untuk deskripsi tentang VM L1 dan L2, lihat Ringkasan virtualisasi bertingkat.

Setelah membuat VM L1 yang mengaktifkan virtualisasi bertingkat, Anda dapat melakukan salah satu langkah berikut:

  • Membuat VM L2 dengan akses jaringan eksternal
  • Membuat VM L2 dengan jembatan jaringan pribadi ke VM L1
  • Membuat VM L2 dengan akses jaringan dari luar VM L1

Sebelum memulai

  • Siapkan autentikasi, jika Anda belum melakukannya. Autentikasi adalah proses verifikasi identitas Anda untuk akses ke layanan dan API Google Cloud. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke Compute Engine sebagai berikut.

    Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:

    gcloud

    1. Instal Google Cloud CLI, lalu initialize dengan menjalankan perintah berikut:

      gcloud init
    2. Menetapkan region dan zona default.

    REST

    Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

      Instal Google Cloud CLI, lalu initialize dengan menjalankan perintah berikut:

      gcloud init

Membuat VM L2 dengan akses jaringan eksternal

Buat VM L2 dengan akses jaringan eksternal menggunakan prosedur berikut. Prosedur ini menggunakan qemu-system-x86_64 untuk memulai VM L2. Jika Anda menggunakan prosedur lain untuk membuat VM L2 dan mengalami masalah, rekonstruksi masalah menggunakan prosedur ini sebelum menghubungi Dukungan.

  1. Buat VM L1 yang telah mengaktifkan virtualisasi bertingkat.

  2. Gunakan perintah gcloud compute ssh untuk terhubung ke VM:

    gcloud compute ssh VM_NAME
    

    Ganti VM_NAME dengan nama VM yang akan dihubungkan.

  3. Instal paket qemu-kvm terbaru:

    sudo apt update && sudo apt install qemu-kvm -y
    
  4. Download image OS yang kompatibel dengan QEMU untuk digunakan pada VM L2.

  5. Gunakan perintah berikut untuk memulai L2 VM. Saat diminta, login dengan user: root, password: root.

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

    Ganti IMAGE_NAME dengan nama OS image yang kompatibel dengan QEMU yang akan digunakan untuk VM L2.

  6. Uji apakah VM L2 Anda memiliki akses eksternal:

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

Membuat VM L2 dengan jembatan jaringan pribadi ke VM L1

Buat VM L2 dengan jembatan jaringan pribadi ke VM L1 yang dibuat sebelumnya dengan menggunakan prosedur berikut. Untuk mengetahui informasi tentang cara mengubah unit transmisi maksimum (MTU) default untuk jaringan VPC Anda, lihat ringkasan unit transmisi maksimum.

  1. Buat VM L1 yang telah mengaktifkan virtualisasi bertingkat.

  2. Gunakan perintah gcloud compute ssh untuk terhubung ke VM:

    gcloud compute ssh VM_NAME
    

    Ganti VM_NAME dengan nama VM yang akan dihubungkan.

  3. Instal paket yang diperlukan untuk membuat jembatan pribadi:

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. Mulai jaringan default yang disertakan dengan paket libvirt:

    sudo virsh net-start default
    
  5. Jalankan perintah berikut untuk memeriksa apakah Anda memiliki jembatan virbr0:

    ip addr
    
  6. Outputnya mirip dengan hal berikut ini:

    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. Buat antarmuka tap untuk beralih dari VM L1 ke VM L2:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  8. Kaitkan antarmuka tap ke jembatan pribadi:

    sudo brctl addif virbr0 tap0
    
  9. Jalankan perintah berikut untuk memverifikasi penyiapan jaringan jembatan:

    sudo brctl show
    
  10. Outputnya mirip dengan hal berikut ini:

    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254008ca6a1       yes             tap0
                                                            virbr0-nic
    
  11. Download image OS yang kompatibel dengan QEMU untuk digunakan pada VM L2.

  12. Jalankan screen, lalu tekan Enter di perintah selamat datang:

    screen
    
  13. Gunakan perintah berikut untuk memulai VM L2. Jika diminta, login dengan 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
    

    Ganti IMAGE_NAME dengan nama OS image yang kompatibel dengan QEMU yang akan digunakan untuk VM L2.

  14. Di VM L2, jalankan ip addr show untuk mengonfirmasi bahwa VM memiliki alamat di ruang virbr0—misalnya, 192.168.122.89:

    user@nested-vm:~$ ip addr
    
  15. Mulai server web placeholder pada port 8000:

    user@nested-vm:~$ python -m http.server
    
  16. Lepaskan dari sesi screen dengan Ctrl+A, Ctrl+D.

  17. Uji apakah VM L1 Anda dapat melakukan ping ke VM L2, dengan mengganti alamat IP berikut dengan alamat IP VM L2:

    curl 192.168.122.89:8000
    
  18. Outputnya mirip dengan hal berikut ini:

    <!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>
    

Membuat VM L2 dengan akses jaringan dari luar VM L1

Anda dapat menyiapkan VM L2 dengan IP alias sehingga VM di luar VM L1 dapat mengakses VM L2. Gunakan prosedur berikut untuk membuat VM L2 dengan akses jaringan melalui IP alias dari luar VM L1 yang dibuat sebelumnya. Untuk mengetahui informasi tentang cara membuat alamat IP alias, lihat Mengonfigurasi rentang IP alias.

Prosedur berikut mengasumsikan subnet yang dibuat sebelumnya yang disebut subnet1. Jika sudah memiliki subnet dengan nama yang berbeda, ganti subnet1 dengan nama subnet Anda, atau buat subnet baru bernama subnet1.

  1. Buat VM L1 dengan mengaktifkan virtualisasi bertingkat dan sertakan rentang IP alias dan dukungan untuk traffic 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
    

    Ganti VM_NAME dengan nama untuk VM 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
      },
      ...
    }
    

    Ganti kode berikut:

    • PROJECT_ID: project ID

    • ZONE: zona untuk membuat VM

    • VM_NAME: nama VM

  2. Gunakan perintah gcloud compute ssh untuk terhubung ke VM. Jika Anda mengalami masalah saat terhubung ke VM, coba reset VM atau ubah aturan firewall.

    gcloud compute ssh VM_NAME
    

    Ganti VM_NAME dengan nama VM yang akan dihubungkan.

  3. Update VM dan instal paket yang diperlukan:

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. Mulai jaringan default yang disertakan dengan paket libvirt:

    sudo virsh net-start default
    
  5. Jalankan perintah berikut untuk memeriksa apakah Anda memiliki jembatan virbr0:

    user@nested-vm:~$ ip addr
    
  6. Verifikasi output yang mirip dengan berikut ini:

    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. Buat antarmuka tap untuk beralih dari VM L1 ke VM L2:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  8. Kaitkan antarmuka tap ke jembatan pribadi:

    sudo brctl addif virbr0 tap0
    
  9. Jalankan perintah berikut untuk memverifikasi penyiapan jaringan bridge:

    sudo brctl show
    
  10. Verifikasi output yang mirip dengan berikut ini:

    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254008ca6a1       yes             tap0
                                                            virbr0-nic
    
  11. Download image OS yang kompatibel dengan QEMU untuk digunakan pada VM L2.

  12. Jalankan screen, lalu tekan Enter di perintah selamat datang:

    screen
    
  13. Gunakan perintah berikut untuk memulai VM bertingkat. Jika diminta, login dengan 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
    

    Ganti IMAGE_NAME dengan nama OS image yang kompatibel dengan QEMU yang akan digunakan untuk VM L2.

  14. Di VM L2, jalankan ip addr untuk mengonfirmasi bahwa VM L2 memiliki alamat di ruang virbr0, seperti 192.168.122.89:

    user@nested-vm:~$ ip addr
    
  15. Mulai server web placeholder pada port 8000:

    user@nested-vm:~$ python -m http.server
    
  16. Lepaskan dari sesi screen dengan Ctrl+A, Ctrl+D.

  17. Uji apakah VM L1 Anda dapat melakukan ping ke VM L2, lalu ganti alamat IP di bawah dengan alamat IP VM L2:

    curl 192.168.122.89:8000
    
  18. Pastikan respons dari VM L2 mirip dengan yang berikut ini:

    <!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. Di VM L1, siapkan iptables untuk mengizinkan penerusan dari VM L1 ke VM L2. Untuk OS image L2 yang digunakan dalam petunjuk ini, Anda harus mengosongkan tabel IP:

    sudo iptables -F
    
  20. Tentukan IP alias VM L1:

    ip route show table local
    
  21. Pastikan output-nya mirip dengan berikut ini. Untuk contoh ini, ada dua alamat IP yang terkait dengan perangkat ethernet eth0 VM L2. Yang pertama, 10.128.0.2, adalah alamat IP utama VM L2, yang ditampilkan oleh sudo ifconfig -a. Yang kedua, 10.128.0.13, adalah alamat IP alias VM L2.

    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. Jalankan perintah berikut untuk meneruskan traffic dari contoh IP alias 10.128.0.13 ke contoh IP 192.168.122.89 untuk VM L2:

    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
    

    Untuk informasi tentang pemecahan masalah iptables, lihat iptables tidak meneruskan traffic.

  23. Verifikasi akses VM L2 dari luar VM L1 dengan login ke VM lain yang berada di jaringan yang sama dengan VM L1, dan membuat permintaan curl ke IP alias, yang mengganti alamat IP di bawah dengan IP alias VM L2:

    user@another-vm:~$ curl 10.128.0.13:8000
    
  24. Verifikasi bahwa respons curl mirip dengan yang berikut:

    <!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>
    

Langkah selanjutnya