Penggunaan API Incus untuk Membuat Virtual Machine

Bagaimana membuat virtual machine yang sudah terkonfigurasi login SSH tanpa password memanfaaatkan API Incus dan Cloud-init.

Ketika kita menggunakan layanan komputasi awan seperti Amazon Web Service kita bisa membuat virtual machine melalui antar muka konsol web yang disediakan maupun menggunakan API dari layanan cloud tersebut. Akhir-akhir ini saya mempunyai kebutuhan untuk melakukan pembuatan virtual machine serupa layanan cloud namun dilakukan di komputer pribadi. Saya menemukan program bernama Incus yang menjawab dua kriteria yaitu pembuatan virtual machine bisa dilakukan menggunakan API dan konfigurasi awal virtual machine bisa dilakukan menggunakan program Cloud-init. Sepanjang artikel ini kita akan melihat bagaimana penggunaan API Incus ini hingga kita melakukan login SSH ke dalam virtual machine yang sudah dibuat.

Hal pertama yang perlu kita lakukan adalah memasang Incus di komputer kita. Saya menggunakan sistem operasi MacOS dan cara instalasi yang paling mudah adalah menggunakan program Brew.

brew install incus

Setelah kita berhasil memasang Colima dan Incus, kita sudah siap untuk membuat virtual machine di komputer kita. Persiapan terakhir sebelum membuat virtual machine pertama kita adalah memastikan bahwa runtime Incus sudah berjalan baik. Berikut ini perintah yang kita jalankan untuk memulai runtime Incus.

colima start --profile incus-host --runtime incus

Perintah yang kita jalankan baru saja akan membuat profile Colima baru bernama incus-host. Parameter profile ini perlu kita tambahkan apabila sebelumnya kita menggunakan Colima untuk menjalankan runtime container lain. Berikut ini contoh daftar runtime yang terbuat saat ini di komputer saya. Kita dapat melihat bahwa runtime Incus sudah berjalan dengan baik.

colima list

PROFILE       STATUS     ARCH       CPUS    MEMORY    DISK      RUNTIME    ADDRESS
default       Stopped    aarch64    2       2GiB      100GiB    docker
incus-host    Running    aarch64    2       2GiB      100GiB    incus      192.168.xxx.xxx

Kita perlu mencatat alamat IP dari profile colima incus-host ini dikarenakan alamat ini merupakan API Incus yang akan kita gunakan nanti ketika membuat virtual machine menggunakan API Incus. Selain itu kita perlu memastikan API ini bisa diakses oleh klien dengan menjalankan perintah berikut ini.

incus config set core.https_address=0.0.0.0:8443

Berikutnya kita akan membuat sebuah virtual machine pertama kita menggunakan Incus. Kita akan menggunakan sistem operasi Debian yang di dalamnya sudah terpasang program Cloud-init. Cloud-init adalah sebuah program yang membantu kita mengkondisikan virtual machine sesuai dengan konfigurasi yang kita tambahkan saat pembuatan virtual machine tersebut. Cloud-init sudah menjadi standar industri dan digunakan oleh banyak penyedia layanan komputasi awan. Untuk sementara ini kita akan membuat virtual machine tanpa menambahkan konfigurasi Cloud-init untuk sekedar tahu bahwa kita berhasil membuat virtual machine menggunakan Incus. Berikut adalah perintah yang kita jalankan untuk membuat virtual machine.

incus launch images:debian/13/cloud hello-debian --vm

Saat pertama kali membuat virtual machine perintah akan berjalan cukup lama menunggu untuk mengunduh image sistem operasi. Setelah perintah membuat virtual machine berhasil, kita bisa memeriksa daftar virtual machine yang berhasil dibuat dan memastikan kita bisa mengeksekusi perintah di dalam virtual machine tersebut.

incus exec hello-debian-1 -- cat /etc/os-release
incus exec hello-debian-1 -- cat /etc/passwd

Di titik ini kita sudah berhasil membuat virtual machine meskipun kita belum bisa masuk menggunakan SSH ke dalam virtual machine. Sejauh ini kita hanya memanfaatkan perintah yang disediakan program Incus dan belum memanfaatkan API Incus untuk membuat virtual machine. Di sisa artikel kita akan menyelesaikan dua hal ini.

Kita akan memanfaatkan Cloud-init untuk menyiapkan virtual machine supaya kita bisa masuk ke dalamnya menggunakan SSH. Kita mulai dengan menyiapkan konfigurasi Cloud-init seperti berikut ini dan simpan dengan nama init.yaml.

#cloud-config
package_update: true
package_upgrade: false
ssh_pwauth: false

users:
  - name: debian
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    shell: /bin/bash
    groups: sudo
    lock_passwd: false
    hashed_passwd: "*"
    ssh_authorized_keys:
      - (Ganti dengan public key SSH masing-masing)

packages:
  - openssh-server
  - curl
  - vim

runcmd:
  - [systemctl, enable, ssh]
  - [systemctl, start, ssh]

Kita coba gunakan konfigurasi Cloud-init sebelumnya untuk membuat virtual machine baru.

incus launch images:debian/13/cloud hello-debian-1 --vm --config cloud-init.user-data="$(cat init.yaml)" --config limits.memory="768MiB"

Untuk melihat alamat IP virtual machine yang baru saja kita buat, kita gunakan perintah incus list. Apabila alamat IP belum terlihat pada hasil perintah tadi, artinya proses pembuatan virtual machine masih berlangsung. Proses ini umumnya tidak membutuhkan waktu tidak lebih dari 1 menit.

Setelah kita mengetahui IP virtual machine, kita akan periksa apakah konfigurasi Cloud-init yang telah kita buat berhasil dijalankan dengan baik di dalam virtual machine baru. Tanda bahwa konfigurasi telah berjalan baik adalah perintah berikut ini menghasilkan status done.

incus exec hello-debian-1 -- cloud-init status

Kita akan coba melakukan login SSH ke dalam virtual machine.

ssh debian@<Ganti dengan alamat IP>

Jika semuanya berjalan baik, kita harusnya sudah bisa masuk ke dalam virtual machine yang baru saja dibuat dan melihat prompt seperti ini:

debian@hello-debian-1:~$

Kini kita sudah berhasil membuat virtual machine memanfaatkan perintah yang disediakan program Incus dan kita juga berhasil login menggunakan SSH ke dalam virtual machine tersebut.

Selanjutnya kita akan menggunakan API Incus untuk membuat virtual machine. Kita mesti menyiapkan sepasang sertifikat x.509 dan kuncinya sebagai kredensial untuk mengakses API Incus.

openssl req -x509 -newkey rsa:4096 \
-keyout client.key \
-out client.crt \
-days 3650 -nodes \
-subj "/CN=contoh-client"

Setelah berhasil membuat sertifikat x.509, kita mesti memasukkan sertifikat ini ke dalam daftar klien yang diperbolehkan mengakses API Incus dengan perintah berikut ini.

incus config trust add-certificate - < client.crt

Sekarang semua hal yang diperlukan untuk memanggil API Incus sudah siap. Berikut ini adalah script Python yang berisi pemanggilan API Incus untuk membuat virtual machine. Kita menggunakan pustaka httpx sebagai klien HTTP.

from pathlib import Path

import httpx

INCUS_URL = "https://192.168.xxx.xxx:8443"
CERT = "client.crt"
KEY = "client.key"

INSTANCE_NAME = "hello-debian-1"
IMAGE_ALIAS = "debian/13/cloud"
MEMORY = "768MiB"
CLOUD_INIT_FILE = "init.yaml"

client = httpx.Client(cert=(CERT, KEY), verify=False)
user_data = Path("init.yaml").read_text()

body = {
    "name": INSTANCE_NAME,
    "type": "virtual-machine",
    "source": {
        "type": "image",
        "mode": "pull",
        "server": "https://images.linuxcontainers.org",
        "protocol": "simplestreams",
        "alias": IMAGE_ALIAS,
    },
    "config": {
        "cloud-init.user-data": user_data,
        "limits.memory": MEMORY,
    },
    "start": True,
}

print(
    f"Launching VM '{INSTANCE_NAME}' from image '{IMAGE_ALIAS}' with memory={MEMORY} ..."
)
resp = client.post(f"{INCUS_URL}/1.0/instances", json=body)
resp.raise_for_status()
result = resp.json()

operation_url = result["operation"]
print(f"Operation started: {operation_url}")
print("Waiting for the instance to be created and started ...")

Kita melihat di script Python tersebut bahwa alamat IP profile Colima incus-host yang kita catat digunakan sebagai URL dasar untuk mengakses API Incus. Kita melihat juga konfigurasi Cloud-init kita sertakan. Setelah berhasil menjalankan script Python dan menunggu beberapa saat, kita mempunyai virtual machine yang kita buat menggunakan API Incus di perangkat komputer kita. Kita bisa login SSH ke dalam virtual machine sama seperti sebelumnya.

ssh debian@<Ganti dengan alamat IP>

Kita sampai di ujung artikel ini. Kita telah berhasil membuat virtual machine menggunakan API Incus dan melakukan login SSH ke dalam virtual machine tersebut. Dengan ini saya mengakhiri tulisan ini. Terima kasih dan sampai jumpa lagi di kesempatan berikutnya.

← All entriesBack to top ↑