Tutorial: Men-deploy VM yang ada di cluster menggunakan VM Runtime di GDC

Runtime VM di GDC memungkinkan Anda men-deploy workload virtual machine (VM) langsung ke penginstalan software Distributed Cloud khusus untuk bare metal. Dalam tutorial ini, Anda akan memigrasikan contoh aplikasi tempat penjualan, yang mewakili terminal tempat penjualan retail, dari VM Compute Engine ke cluster bare metal dan mengakses frontend webnya.

Deployment menggunakan disk image yang telah disiapkan sebelumnya, tempat workload berjalan sebagai layanan systemd. Anda juga dapat mengikuti langkah-langkah ini untuk menyiapkan dan men-deploy aplikasi berbasis VM Anda sendiri.

Tujuan

Sebelum memulai

Untuk menyelesaikan dokumen ini, Anda memerlukan resource berikut:

  • Akses ke cluster bare metal versi 1.12.0 atau yang lebih tinggi yang dibuat dengan mengikuti panduan Menginstal dengan Loadbalancer Manual. Dokumen ini menyiapkan resource jaringan sehingga Anda dapat mengakses workload yang berjalan di dalam VM melalui browser. Jika tidak memerlukan perilaku tersebut, Anda dapat mengikuti dokumen ini menggunakan penginstalan software Distributed Cloud apa pun khusus untuk bare metal.
  • Workstation yang memenuhi persyaratan berikut:
    • Memiliki akses ke cluster Anda menggunakan bmctl CLI.
    • Memiliki akses ke cluster Anda menggunakan kubectl CLI.

Mengaktifkan VM Runtime on GDC dan menginstal plugin virtctl

Definisi resource kustom Runtime VM di GDC adalah bagian dari semua cluster bare metal sejak versi 1.10. Instance resource kustom VMRuntime sudah dibuat setelah penginstalan. Namun, fitur ini dinonaktifkan secara default.

  1. Aktifkan Runtime VM di GDC:

    sudo bmctl enable vmruntime --kubeconfig KUBECONFIG_PATH
    
    • KUBECONFIG_PATH: Jalur file kubeconfig cluster pengguna.
  2. Validasi bahwa VMRuntime diaktifkan:

    kubectl wait --for=jsonpath='{.status.ready}'=true vmruntime vmruntime
    

    Mungkin perlu waktu beberapa menit hingga VMRuntime siap. Jika belum siap, periksa beberapa kali dengan jeda singkat. Contoh output berikut menunjukkan bahwa VMRuntime sudah siap:

    vmruntime.vm.cluster.gke.io/vmruntime condition met
    
  3. Instal plugin virtctl untuk kubectl:

    sudo -E bmctl install virtctl
    

    Contoh output berikut menunjukkan proses penginstalan plugin virtctl telah selesai:

    Please check the logs at bmctl-workspace/log/install-virtctl-20220831-182135/install-virtctl.log
    [2022-08-31 18:21:35+0000] Install virtctl succeeded
    
  4. Verifikasi penginstalan plugin virtctl:

    kubectl virt
    

    Contoh output berikut menunjukkan bahwa plugin virtctl tersedia untuk digunakan dengan kubectl:

    Available Commands:
      addvolume         add a volume to a running VM
      completion        generate the autocompletion script for the specified shell
      config            Config subcommands.
      console           Connect to a console of a virtual machine instance.
      create            Create subcommands.
      delete            Delete  subcommands.
    ...
    

Men-deploy workload berbasis VM

Saat Anda men-deploy VM ke penginstalan software Distributed Cloud khusus untuk bare metal, VM Runtime di GDC mengharapkan image VM. Image ini berfungsi sebagai boot disk untuk VM yang di-deploy.

Untuk memigrasikan VM yang ada ke dalam cluster, disk image VM tersebut harus dibuat terlebih dahulu. Kemudian, image harus dihosting di repositori yang dapat diakses oleh cluster. Terakhir, URL image tersebut dapat digunakan untuk membuat VM. Runtime VM di GDC mengharapkan image dalam format qcow2. Jika Anda memberikan jenis gambar yang berbeda, gambar tersebut akan otomatis dikonversi ke format qcow2. Untuk menghindari konversi berulang dan mengaktifkan penggunaan kembali, Anda dapat mengonversi disk image virtual dan menghosting image qcow2.

Pada langkah-langkah berikut, Anda akan menggunakan image qcow2 yang telah disiapkan sebelumnya, tempat workload contoh dibuat sebagai disk image VM di Google Cloud dan diekspor ke bucket Cloud Storage.

Kode sumber dalam dokumen ini tersedia di repositori GitHub anthos-samples. Anda akan menggunakan resource dari repositori ini untuk menyelesaikan langkah-langkah berikut.

  1. Men-deploy StatefulSet MySQL. Aplikasi tempat penjualan diharapkan terhubung ke database MySQL untuk menyimpan informasi inventaris dan pembayaran. Repositori titik penjualan memiliki contoh manifes yang men-deploy StatefulSet MySQL, mengonfigurasi ConfigMap terkait, dan Service Kubernetes. ConfigMap menentukan kredensial untuk instance MySQL, yang merupakan kredensial yang sama yang diteruskan ke aplikasi point of sale.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/point-of-sale/main/k8-manifests/common/mysql-db.yaml
    
  2. Deploy workload VM menggunakan image qcow2 yang telah disiapkan sebelumnya:

    kubectl virt create vm pos-vm \
        --boot-disk-size=80Gi \
        --memory=4Gi \
        --vcpu=2 \
        --image=https://storage.googleapis.com/pos-vm-images/pos-vm.qcow2
    

    Perintah ini membuat file YAML yang diberi nama sesuai VM (google-virtctl/pos-vm.yaml). Anda dapat memeriksa file untuk melihat definisi VirtualMachine dan VirtualMachineDisk. Alih-alih menggunakan plugin virtctl, Anda dapat men-deploy workload VM menggunakan definisi Model Resource Kubernetes (KRM), seperti yang terlihat dalam file YAML yang dibuat.

    Jika perintah berhasil dijalankan, perintah tersebut akan menghasilkan output seperti contoh berikut yang menjelaskan berbagai resource yang dibuat:

    Constructing manifest for vm "pos-vm":
    Manifest for vm "pos-vm" is saved to /home/tfadmin/google-virtctl/pos-vm.yaml
    Applying manifest for vm "pos-vm"
    Created gvm "pos-vm"
    
  3. Periksa status pembuatan VM.

    Resource VirtualMachine diidentifikasi oleh resource vm.cluster.gke.io/v1.VirtualMachine di Runtime VM di GDC. Bentuk singkatnya adalah gvm.

    Saat Anda membuat VM, dua resource berikut akan dibuat:

    • VirtualMachineDisk adalah persistent disk tempat konten image VM diimpor.
    • VirtualMachine adalah instance VM itu sendiri. DataVolume dipasang ke VirtualMachine sebelum VM di-booting.

    Periksa status VirtualMachineDisk. VirtualMachineDisk secara internal membuat resource DataVolume. Image VM diimpor ke DataVolume yang dipasang ke VM:

    kubectl get datavolume
    

    Contoh output berikut menunjukkan awal impor image:

    NAME              PHASE             PROGRESS   RESTARTS   AGE
    pos-vm-boot-dv    ImportScheduled   N/A                   8s
    
  4. Periksa status VirtualMachine. VirtualMachine berada dalam status Provisioning hingga DataVolume diimpor sepenuhnya:

    kubectl get gvm
    

    Contoh output berikut menunjukkan VirtualMachine yang sedang disediakan:

    NAME      STATUS         AGE     IP
    pos-vm    Provisioning   1m
    
  5. Tunggu hingga image VM diimpor sepenuhnya ke DataVolume. Terus pantau progresnya saat image diimpor:

    kubectl get datavolume -w
    

    Contoh output berikut menunjukkan disk image yang sedang diimpor:

    NAME              PHASE              PROGRESS   RESTARTS   AGE
    pos-vm-boot-dv   ImportInProgress   0.00%                 14s
    ...
    ...
    pos-vm-boot-dv   ImportInProgress   0.00%                 31s
    pos-vm-boot-dv   ImportInProgress   1.02%                 33s
    pos-vm-boot-dv   ImportInProgress   1.02%                 35s
    ...
    

    Setelah impor selesai dan DataVolume dibuat, contoh output berikut menunjukkan PHASE dari Succeeded :

    kubectl get datavolume
    
    NAME              PHASE             PROGRESS   RESTARTS   AGE
    pos-vm-boot-dv    Succeeded         100.0%                14m18s
    
  6. Pastikan VirtualMachine telah berhasil dibuat:

    kubectl get gvm
    

    Jika pembuatan berhasil, STATUS akan menampilkan RUNNING, seperti yang ditunjukkan dalam contoh berikut, beserta alamat IP VM:

    NAME      STATUS    AGE     IP
    pos-vm    Running   40m     192.168.3.250
    

Menghubungkan ke VM dan memeriksa status aplikasi

Image yang digunakan untuk VM mencakup aplikasi contoh point of sale. Aplikasi dikonfigurasi untuk otomatis dimulai saat booting sebagai layanan systemd. Anda dapat melihat file konfigurasi layanan systemd di direktori pos-systemd-services.

  1. Hubungkan ke konsol VM. Jalankan perintah berikut dan tekan Enter⏎ setelah Anda melihat pesan Successfully connected to pos-vm…:

    kubectl virt console pos-vm
    

    Perintah ini menghasilkan contoh output berikut yang meminta Anda memasukkan detail login:

    Successfully connected to pos-vm console. The escape sequence is ^]
    
    pos-from-public-image login:
    

    Gunakan akun pengguna dan sandi berikut. Akun ini disiapkan di dalam VM asli tempat image untuk VirtualMachine Runtime VM di GDC dibuat.

    • Nama Pengguna Login: abmuser
    • Sandi: abmworks
  2. Memeriksa status layanan aplikasi tempat penjualan. Aplikasi point of sale mencakup tiga layanan: API, Inventaris, dan Pembayaran. Semua layanan ini berjalan sebagai layanan sistem.

    Ketiga layanan tersebut terhubung satu sama lain melalui localhost. Namun, aplikasi terhubung ke database MySQL menggunakan Service Kubernetes mysql-db yang dibuat pada langkah sebelumnya. Perilaku ini berarti VM otomatis terhubung ke jaringan yang sama dengan Pods dan Services, sehingga memungkinkan komunikasi yang lancar antara workload VM dan aplikasi dalam container lainnya. Anda tidak perlu melakukan tindakan tambahan apa pun untuk membuat Services Kubernetes dapat dijangkau dari VM yang di-deploy menggunakan VM Runtime di GDC.

    sudo systemctl status pos*
    

    Contoh output berikut menunjukkan status tiga layanan dan layanan sistem root, pos.service:

    ● pos_payments.service - Payments service of the Point of Sale Application
        Loaded: loaded (/etc/systemd/system/pos_payments.service; enabled; vendor >
        Active: active (running) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago
      Main PID: 750 (payments.sh)
          Tasks: 27 (limit: 4664)
        Memory: 295.1M
        CGroup: /system.slice/pos_payments.service
                ├─750 /bin/sh /pos/scripts/payments.sh
                └─760 java -jar /pos/jars/payments.jar --server.port=8083
    
    ● pos_inventory.service - Inventory service of the Point of Sale Application
        Loaded: loaded (/etc/systemd/system/pos_inventory.service; enabled; vendor>
        Active: active (running) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago
      Main PID: 749 (inventory.sh)
          Tasks: 27 (limit: 4664)
        Memory: 272.6M
        CGroup: /system.slice/pos_inventory.service
                ├─749 /bin/sh /pos/scripts/inventory.sh
                └─759 java -jar /pos/jars/inventory.jar --server.port=8082
    
    ● pos.service - Point of Sale Application
        Loaded: loaded (/etc/systemd/system/pos.service; enabled; vendor preset: e>
        Active: active (exited) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago
      Main PID: 743 (code=exited, status=0/SUCCESS)
          Tasks: 0 (limit: 4664)
        Memory: 0B
        CGroup: /system.slice/pos.service
    
    Jun 21 18:55:30 pos-vm systemd[1]: Starting Point of Sale Application...
    Jun 21 18:55:30 pos-vm systemd[1]: Finished Point of Sale Application.
    
    ● pos_apiserver.service - API Server of the Point of Sale Application
        Loaded: loaded (/etc/systemd/system/pos_apiserver.service; enabled; vendor>
        Active: active (running) since Tue 2022-06-21 18:55:31 UTC; 1h 10min ago
      Main PID: 751 (api-server.sh)
          Tasks: 26 (limit: 4664)
        Memory: 203.1M
        CGroup: /system.slice/pos_apiserver.service
                ├─751 /bin/sh /pos/scripts/api-server.sh
                └─755 java -jar /pos/jars/api-server.jar --server.port=8081
    
  3. Keluar dari VM. Untuk keluar dari koneksi konsol, gunakan urutan escape ^] dengan menekan Ctrl + ].

Mengakses workload berbasis VM

Jika cluster Anda disiapkan dengan mengikuti panduan Menginstal dengan Loadbalancer Manual, cluster tersebut sudah memiliki resource Ingress yang disebut pos-ingress. Resource ini merutekan traffic dari alamat IP eksternal Load Balancer Ingress ke layanan server API aplikasi contoh point of sale.

  1. Jika cluster Anda tidak memiliki resource Ingress ini, buat resource tersebut dengan menerapkan manifes berikut:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-bm-gcp-terraform/resources/manifests/pos-ingress.yaml
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: pos-ingress
    spec:
      rules:
      - http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api-server-svc
                port:
                  number: 8080
  2. Buat Service Kubernetes yang merutekan traffic ke VM. Resource Ingress merutekan traffic ke Service ini:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-vmruntime/pos-service.yaml
    

    Contoh output berikut mengonfirmasi pembuatan Service:

    service/api-server-svc created
    
    apiVersion: v1
    kind: Service
    metadata:
      name: api-server-svc
    spec:
      selector:
        kubevirt/vm: pos-vm
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8081
  3. Dapatkan alamat IP eksternal load balancer Ingress. Ingress Loadbalancer merutekan traffic berdasarkan aturan resource Ingress. Anda sudah memiliki aturan pos-ingress untuk meneruskan permintaan ke server API Service. Service ini meneruskan permintaan ke VM:

    INGRESS_IP=$(kubectl get ingress/pos-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo $INGRESS_IP
    

    Contoh output berikut menunjukkan alamat IP load balancer Ingress:

    172.29.249.159 # you might have a different IP address
    
  4. Akses aplikasi menggunakan alamat IP Loadbalancer Ingress di browser. Screenshot contoh berikut menunjukkan kios tempat penjualan dengan dua item. Anda dapat mengklik item, lebih dari sekali jika ingin memesan beberapa item, dan melakukan pemesanan dengan tombol Bayar. Pengalaman ini menunjukkan bahwa Anda telah berhasil men-deploy workload berbasis VM ke cluster menggunakan VM Runtime di GDC.

UI aplikasi tempat penjualan
UI aplikasi point of sale (klik gambar untuk memperbesar)

Pembersihan

Anda dapat menghapus semua resource yang dibuat dalam tutorial ini atau hanya menghapus VM dan menyimpan resource yang dapat digunakan kembali. Menghapus VM menjelaskan opsi yang tersedia secara mendetail.

Hapus Semua

  • Hapus Runtime VM di GDC VirtualMachine beserta semua resource-nya:

    kubectl virt delete vm pos-vm --all
    

    Contoh output berikut mengonfirmasi penghapusan:

    vm "pos-vm" used the following resources:
        gvm: pos-vm
        VirtualMachineDisk: pos-vm-boot-dv
    Start deleting the resources:
        Deleted gvm "pos-vm".
        Deleted VirtualMachineDisk "pos-vm-boot-dv".
    

Hanya hapus VM

  • Menghapus VM saja akan mempertahankan VirtualMachineDisk yang dibuat. Hal ini memungkinkan penggunaan kembali image VM ini dan menghemat waktu yang dihabiskan untuk mengimpor image saat membuat VM baru.

    kubectl virt delete vm pos-vm
    

    Contoh output berikut mengonfirmasi penghapusan:

    vm "pos-vm" used the following resources:
        gvm: pos-vm
        VirtualMachineDisk: pos-vm-boot-dv
    Start deleting the resources:
        Deleted gvm "pos-vm".
    

Langkah berikutnya

  • VM asli yang digunakan dalam panduan ini adalah instance Compute Engine yang menjalankan Ubuntu 20.04 LTS. Image VM ini dapat diakses secara publik melalui bucket Cloud Storage pos-vm-images. Untuk mengetahui informasi selengkapnya tentang cara VM dikonfigurasi dan image-nya dibuat, lihat petunjuk di repositori point-of-sale.
  • Saat Anda membuat VM di cluster menggunakan perintah kubectl virt create vm pos-vm, file YAML yang diberi nama sesuai VM (google-virtctl/pos-vm.yaml) akan dibuat. Anda dapat memeriksa file untuk melihat definisi VirtualMachine dan VirtualMachineDisk. Alih-alih menggunakan plugin virtctl, Anda dapat men-deploy VM menggunakan definisi KRM seperti yang terlihat dalam file YAML yang dibuat.