Pemecahan masalah virtual machine

Halaman ini membahas pemecahan masalah virtual machine (VM) untuk Operator Aplikasi (AO) di perangkat air-gapped Google Distributed Cloud (GDC).

Memulihkan boot disk VM yang penuh

Jika VM kehabisan ruang di boot disk, misalnya, saat aplikasi mengisi partisi boot disk dengan log, kemampuan penting di VM akan gagal berfungsi. Anda mungkin tidak dapat menambahkan kunci SSH baru melalui resource VirtualMachineAccessRequest, atau membuat koneksi SSH ke VM menggunakan kunci yang ada.

Halaman ini menjelaskan langkah-langkah untuk membuat VM baru dan memasang disk untuk memulihkan konten ke VM baru sebagai disk tambahan. Langkah-langkah ini menunjukkan hal berikut:

  • Koneksi SSH yang berhasil ke VM baru.
  • Tingkatkan jumlah ruang dengan memasang disk untuk memulihkan dan menghapus data yang tidak diperlukan.
  • Hapus VM baru dan ganti disk asli ke VM asli.

Sebelum memulai

Sebelum melanjutkan, pastikan Anda meminta akses VM tingkat project. Ikuti langkah-langkah yang diberikan untuk menetapkan peran Project VirtualMachine Admin (project-vm-admin).

Untuk operasi VM menggunakan gdcloud CLI, minta Admin IAM Project Anda untuk memberi Anda peran Project VirtualMachine Admin dan peran Project Viewer (project-viewer).

Untuk menggunakan perintah antarmuka command line (CLI) gdcloud, pastikan Anda telah mendownload, menginstal, dan mengonfigurasi CLI gdcloud. Semua perintah untuk appliance air-gapped GDC menggunakan CLI gdcloud atau kubectl, dan memerlukan lingkungan sistem operasi (OS).

Mendapatkan jalur file kubeconfig

Untuk menjalankan perintah terhadap server Management API, pastikan Anda memiliki resource berikut:

  1. Temukan nama server Management API, atau tanyakan kepada Administrator Platform (PA) Anda nama servernya.

  2. Login dan buat file kubeconfig untuk server Management API jika Anda belum memilikinya.

  3. Gunakan jalur untuk menggantikan MANAGEMENT_API_SERVER{"</var>"}} dalam petunjuk ini.

Memulihkan disk VM yang kehabisan ruang penyimpanan

Untuk memulihkan boot disk VM yang kehabisan ruang, selesaikan langkah-langkah berikut:

  1. Hentikan VM yang ada dengan mengikuti langkah-langkah di bagian Menghentikan VM.

  2. Edit VM yang ada:

    kubectl --kubeconfig ADMIN_KUBECONFIG edit \
        virtualmachine.virtualmachine.gdc.goog -n PROJECT VM_NAME
    

    Ganti nama disk VM yang ada di kolom spec dengan nama placeholder baru:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME
    
  3. Buat VM baru dengan sistem operasi (OS) image yang berbeda dari VM asli. Misalnya, jika disk asli menggunakan OS ubuntu-2004, buat VM baru dengan rocky-8.

  4. Pasang disk asli sebagai disk tambahan ke VM baru:

    ...
    spec:
      disks:
      - boot: true
        autoDelete: true
        virtualMachineDiskRef:
          name: NEW_VM_DISK_NAME
      - virtualMachineDiskRef:
          name: ORIGINAL_VM_DISK_NAME
    

    Ganti kode berikut:

    • NEW_VM_DISK_NAME: nama yang Anda berikan ke disk VM baru.
    • ORIGINAL_VM_DISK_NAME: nama disk VM asli.
  5. Setelah Anda membuat VM dan VM berjalan, buat koneksi SSH ke VM dengan mengikuti Menghubungkan ke VM.

  6. Buat direktori dan pasang disk asli ke direktori pemasangan. Contoh, /mnt/disks/new-disk.

  7. Periksa file dan direktori di direktori pemasangan menggunakan ruang ekstra:

    cd /mnt/disks/MOUNT_DIR
    du -hs -- * | sort -rh | head -10
    

    Ganti MOUNT_DIR dengan nama direktori tempat Anda memasang disk asli.

    Outputnya mirip dengan hal berikut ini:

    18G   home
    1.4G  usr
    331M  var
    56M   boot
    5.8M  etc
    36K   snap
    24K   tmp
    16K   lost+found
    16K   dev
    8.0K  run
    
  8. Periksa setiap file dan direktori untuk memverifikasi jumlah ruang yang digunakan masing-masing. Contoh ini memeriksa direktori home karena menggunakan 18G ruang penyimpanan.

    cd home
    du -hs -- * | sort -rh | head -10
    

    Outputnya mirip dengan hal berikut ini:

    17G   log_file
    ...
    4.0K  readme.md
    4.0K  main.go
    

    Contoh file log_file adalah file yang perlu dihapus karena menggunakan 17G ruang, dan tidak diperlukan.

  9. Hapus file yang tidak Anda perlukan yang menghabiskan ruang tambahan, atau cadangkan file ke boot disk VM baru:

    • Pindahkan file yang ingin Anda simpan:

      mv /mnt/disks/MOUNT_DIR/home/FILENAME/home/backup/
      
    • Hapus file yang menggunakan ruang penyimpanan ekstra:

      rm /mnt/disks/MOUNT_DIR/home/FILENAME
      

      Ganti FILENAME dengan nama file yang ingin Anda pindahkan atau hapus.

  10. Logout dari VM baru dan Hentikan VM.

  11. Edit VM baru untuk menghapus disk asli dari kolom spec:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
        edit virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
    

    Hapus daftar virtualMachineDiskRef yang berisi nama disk VM asli:

    spec:
      disks:
      - autoDelete: true
        boot: true
        virtualMachineDiskRef:
          name: NEW_VM_DISK_NAME
      - virtualMachineDiskRef: # Remove this list
          name: ORIGINAL_VM_DISK_NAME # Remove this disk name
    
  12. Edit VM asli dan ganti VM_DISK_PLACEHOLDER_NAME yang Anda tetapkan di langkah kedua dengan nama sebelumnya:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME # Replace this name with the previous VM name
    
  13. Mulai VM asli. Jika Anda telah mengosongkan ruang yang cukup, VM akan berhasil di-boot.

  14. Jika Anda tidak memerlukan VM baru, hapus VM tersebut:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
        delete virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
    

Menyediakan mesin virtual

Bagian ini menjelaskan cara memecahkan masalah yang mungkin terjadi saat menyediakan virtual machine (VM) baru di perlengkapan air-gapped Google Distributed Cloud (GDC).

Operator Aplikasi (AO) harus menjalankan semua perintah terhadap cluster pengguna default.

Tidak dapat membuat disk

Jika PersistentVolumeClaim (PVC) dalam status Pending, tinjau alternatif berikut untuk mengatasi status tersebut:

  • Class penyimpanan tidak mendukung pembuatan PVC dengan mode akses ReadWriteMany:

    1. Perbarui nilai spec.dataVolumeTemplate.spec.pvc.storageClassName virtual machine dengan class penyimpanan yang mendukung mode akses ReadWriteMany dan menggunakan driver Antarmuka Penyimpanan Container (CSI) sebagai penyedia penyimpanannya.

    2. Jika tidak ada class penyimpanan lain di cluster yang dapat menyediakan kemampuan ReadWriteMany, perbarui nilai spec.dataVolumeTemplate.spec.pvc.accessMode untuk menyertakan mode akses ReadWriteOnce.

  • Driver CSI tidak dapat menyediakan PersistentVolume:

    1. Periksa pesan error:

      kubectl describe pvc VM_NAME-boot-dv -n NAMESPACE_NAME
      

      Ganti variabel berikut:

      • VM_NAME: Nama mesin virtual.
      • NAMESPACE_NAME: Nama namespace.
    2. Konfigurasi driver untuk mengatasi error. Untuk memastikan penyediaan PersistentVolume berfungsi, buat PVC pengujian di spec baru dengan nama yang berbeda dari yang ditentukan di dataVolumeTemplate.spec.pvc:

      cat <<EOF | kubectl apply -
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: test-pvc
        namespace: NAMESPACE_NAME
      spec:
        storageClassName: standard-rwx
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
      EOF
      
    3. Setelah penyediaan objek PersistentVolume berhasil, hapus PVC pengujian setelah verifikasi:

      kubectl delete pvc test-pvc -n NAMESPACE_NAME
      

Tidak dapat membuat virtual machine

Jika resource mesin virtual diterapkan tetapi tidak mencapai status Running, ikuti langkah-langkah berikut:

  1. Tinjau log mesin virtual:

    kubectl get vm VM_NAME -n NAMESPACE_NAME
    
  2. Periksa status Pod yang sesuai dari mesin virtual:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    

    Output menampilkan status Pod. Kemungkinan opsinya adalah sebagai berikut:

Status ContainerCreating

Jika Pod dalam status ContainerCreating, ikuti langkah-langkah berikut:

  1. Dapatkan detail tambahan tentang status Pod:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    
  2. Jika volume tidak di-unmount, pastikan semua volume yang ditentukan di kolom spec.volumes berhasil di-mount. Jika volume adalah disk, periksa status disk.

  3. Kolom spec.accessCredentials menentukan nilai untuk memasang kunci publik SSH. Pastikan secret dibuat di namespace yang sama dengan mesin virtual.

Jika tidak ada cukup resource di cluster untuk membuat Pod, ikuti langkah-langkah berikut:

  1. Jika cluster tidak memiliki cukup resource komputasi untuk menjadwalkan Pod virtual machine, hapus Pod lain yang tidak diinginkan untuk membantu melepaskan resource.

  2. Kurangi nilai spec.domain.resources.requests.cpu dan spec.domain.resources.requests.memory mesin virtual.

Status Error atau CrashLoopBackoff

Untuk mengatasi masalah Pod dalam status Error atau CrashLoopBackoff, ambil log dari Pod komputasi mesin virtual:

kubectl logs -l  kubevirt.io/vm=VM_NAME  -c compute

Status Running dan kegagalan mesin virtual

Jika Pod dalam status Running, tetapi mesin virtual itu sendiri gagal, ikuti langkah-langkah berikut:

  1. Lihat log dari Pod log mesin virtual:

    kubectl logs -l  kubevirt.io/vm=VM_NAME  -c log
    
  2. Jika log menunjukkan error saat startup mesin virtual, periksa perangkat booting yang benar dari mesin virtual. Tetapkan nilai spec.domain.devices.disks.bootOrder dari disk boot utama dengan nilai 1. Gunakan contoh berikut sebagai referensi:

      spec:
          domain:
            devices:
              disks:
              - bootOrder: 1
                disk:
                  bus: virtio
                name: VM_NAME-boot-dv
      

Untuk memecahkan masalah konfigurasi image mesin virtual, buat mesin virtual lain dengan image yang berbeda.

Mengakses konsol serial

Bagian ini menjelaskan cara menggunakan konsol serial instance VM untuk men-debug masalah booting dan jaringan, memecahkan masalah instance yang tidak berfungsi, berinteraksi dengan Grand Unified Bootloader (GRUB), dan melakukan tugas pemecahan masalah lainnya.

Berinteraksi dengan port serial sebanding dengan menggunakan jendela terminal: input dan output dalam mode teks, tanpa dukungan antarmuka grafis. Sistem operasi (OS) instance, input dan output dasar (BIOS), sering menulis output ke port serial dan menerima input seperti perintah.

Untuk mendapatkan akses ke konsol serial, pelajari bagian berikut:

Mengonfigurasi nama pengguna dan sandi

Secara default, image sistem Linux GDC tidak dikonfigurasi untuk mengizinkan login berbasis sandi bagi pengguna lokal.

Jika VM Anda menjalankan image yang telah dikonfigurasi sebelumnya dengan login konsol serial, Anda dapat menyiapkan sandi lokal di VM dan login melalui konsol serial. Di VM Linux GDC, Anda mengonfigurasi nama pengguna dan sandi melalui skrip startup yang disimpan sebagai secret Kubernetes selama atau setelah pembuatan VM.

Petunjuk berikut menjelaskan cara menyiapkan sandi lokal setelah pembuatan VM. Untuk mengonfigurasi nama pengguna dan sandi, selesaikan langkah-langkah berikut:

  1. Buat file teks.
  2. Di file teks, konfigurasikan nama pengguna dan sandi:

    #!/bin/bash
    username="USERNAME"
    password="PASSWORD"
    sudo useradd -m -s /bin/bash "$username"
    echo "$username:$password" | sudo chpasswd
    sudo usermod -aG sudo "$username"
    

    Ganti kode berikut:

    • USERNAME: nama pengguna yang ingin Anda tambahkan.
    • PASSWORD: sandi untuk nama pengguna. Hindari sandi dasar, karena beberapa OS mungkin memerlukan panjang dan kompleksitas sandi yang minimal.
  3. Buat skrip startup sebagai secret Kubernetes:

    kubectl --kubeconfig=ADMIN_KUBECONFIG create secret \
    generic STARTUP_SCRIPT_NAME -n PROJECT_NAMESPACE \
    --from-file=STARTUP_SCRIPT_PATH
    

    Ganti kode berikut:

    • PROJECT_NAMESPACE: namespace project tempat VM berada.
    • STARTUP_SCRIPT_NAME: the name you give to the startup script. For example,configure-credentials`.
    • STARTUP_SCRIPT_PATH: jalur ke skrip startup yang berisi nama pengguna dan sandi yang Anda konfigurasi.
  4. Hentikan VM.

  5. Edit spesifikasi VM:

    kubectl --kubeconfig=ADMIN_KUBECONFIG edit gvm \
    -n PROJECT_NAMESPACE VM_NAME
    

    Ganti VM_NAME dengan nama VM yang akan ditambahkan dalam skrip startup.

  6. Di kolom startupScripts, tambahkan referensi secret Kubernetes yang Anda buat pada langkah ketiga:

    spec:
      compute:
        memory: 8Gi
        vcpus: 8
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: disk-name 
      startupScripts:
      - name: STARTUP_SCRIPT_NAME
        scriptSecretRef:
          name: STARTUP_SCRIPT_NAME
    
  7. Mulai VM.

    • Jika Anda sedang mengerjakan VM baru, lewati langkah ini.

Mengakses konsol serial VM

Untuk mulai mengakses konsol serial VM, lakukan hal berikut:

  1. Hubungkan ke konsol serial:

    gdcloud compute connect-to-serial-port VM_NAME \
    --project PROJECT_NAMESPACE
    
  2. Saat diminta, masukkan nama pengguna dan sandi yang Anda tentukan di Konfigurasi nama pengguna dan sandi.