Cluster API atau disingkat CAPI merupakan salah satu tools dari Kubernetes yang dirancang untuk menyederhanakan dan otomasiasi cluster kubernetes, seperti create, configure, lifecycle management cluster. Untuk penggunaan CAPI sendiri hanya dengan define fitur yang diinginkan dalam file YAML, dan CAPI akan implementasi pada background system.
Pada artikel ini, saya akan menggunakan CAPI untuk LXD/Incus. Lebih spesifiknya saya akan coba untuk deploy cluster kubernetes diatas LXD. Control Plane akan running sebagai container dan worker Worker node sebagai Virtual Machine (VM) yang di isolate. Tujuan dari percobaan ini adalah untuk memaksimalkan resource dan mempercepat saat provisioning.
Prasyarat (Pre-requisites)
Kita akan memulai dengan menginstal sebuah management cluster menggunakan kind (Kubernetes in Docker). Cluster ini bersifat sementara dan berfungsi sebagai "Template" untuk membangun klaster Kubernetes utama kita (yang disebut workload cluster). Semua controller Cluster API akan berjalan di dalam management cluster ini.
Pertama, buat sebuah VM di LXD yang akan menjadi host untuk kind.
lxc init ubuntu:24.04 kind-management --vm --device root,size=30GiB --config limits.memory=4GB --config limits.cpu=4
lxc start kind-management
lxc shell kind-managementSemua perintah selanjutnya dieksekusi didalam shell
kind-management.
Selanjutnya, install semua tool yang diperlukan di dalam VM tersebut.
# Install Docker sebagai runtime untuk kind
curl [https://get.docker.com](https://get.docker.com) | bash -x
# Install kind
curl -Lo ./kind [https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64](https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64)
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# Install clusterctl, CLI utama untuk Cluster API
curl -L [https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.7.2/clusterctl-linux-amd64](https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.7.2/clusterctl-linux-amd64) -o clusterctl
chmod +x ./clusterctl
sudo mv ./clusterctl /usr/local/bin/clusterctl
# Install kubectl untuk berinteraksi dengan klaster
curl -LO "[https://dl.k8s.io/release/$(curl](https://dl.k8s.io/release/$(curl) -L -s [https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl](https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl)"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
# Buat management cluster dengan kind
kind create cluster
Keterangan:
Buat vm khusus untuk management cluster. Tujuannya agar environment tidak tercampur dan memisahkan dari host LXD.
kindakan membuat cluster Kubernetes didalam kontainer Docker. Tujuannya untuk membuat cluster lebih cepat.
Setelah claster kind berjalan, kita perlu menginisialisasinya sebagai management cluster untuk Cluster API.
export CLUSTER_TOPOLOGY=true
# Inisialisasi dengan provider incus (yang juga berfungsi untuk LXD)
clusterctl init --infrastructure incus
Buat sebuah secret Kubernetes untuk menyimpan kredensial akses ke LXD host. Controller Cluster API akan menggunakan secret ini untuk otentikasi ke API LXD dan membuat/mengelola kontainer serta VM.
kubectl create secret generic lxc-secret \
--from-literal=server="https://$(lxc config get core.https_address)" \
--from-literal=server-crt="$(cat ~/snap/lxd/common/config/servercerts/local-https.crt)" \
--from-literal=client-crt="$(cat ~/snap/lxd/common/config/client.crt)" \
--from-literal=client-key="$(cat ~/snap/lxd/common/config/client.key)" \
--from-literal=project="default"
Build Base Image
Selanjutnya buat image template, tujuannya adalah agar proses deploy menjadi lebih efisien karena pada proses ini, semua dependensi Kubernetes sudah terpasang (kubeadm, kubelet, containerd, dll.). Saat CAPI ingin membuat node baru, CAPI hanya perlu clone dari image ini, tanpa harus build ulang.
Persyaratan
Clone repository provider Incus/LXD dan build binary
image-builder.
git clone https://github.com/lxc/cluster-api-provider-incus
cd cluster-api-provider-incus
# Mulai build
make image-builderSebelum melakukan build image, image-builder yang berjalan di dalam VM kind-managementharus dapat berkomunikasi dengan LXD host diluarnya. Untuk itu kita akan menambahkan LXD host sebagai remote.
# Ganti <IP atau hostname> dengan IP dari LXD host Anda
lxc remote add lxd-access <IP atau hostname>:8443 --accept-certificate
lxc remote switch lxd-access
Nantinya, semua interaksi lxc akan dilakukan melalui koneksi HTTPS ke remote tersebut, bukan lagi melalui local socket.
Image untuk Control Plane (Container)
Image ini akan digunakan untuk membuat node control-plane. Karena control-plane tidak perlu menjalankan beban kerja pengguna secara langsung, kita bisa menjalankannya sebagai kontainer LXD yang lebih ringan dan efisien.
./bin/image-builder kubeadm --v=4 --output image-kubeadm.tar.gz \
--kubernetes-version v1.30.2 \
--base-image ubuntu:24.04 \
--image-alias kubeadm/v1.30.2/ubuntu/24.04
Image untuk Worker Node (Virtual Machine)
Image ini akan digunakan untuk membuat node pekerja (worker nodes). Kita menggunakan VM penuh untuk worker nodes demi isolasi keamanan yang lebih baik antara pod yang berjalan dan untuk memastikan kompatibilitas yang lebih luas dengan berbagai jenis beban kerja.
./bin/image-builder kubeadm --v=4 --output image-kubeadm-kvm.tar.gz \
--kubernetes-version v1.30.2 \
--base-image ubuntu:24.04 \
--image-alias kubeadm/v1.30.2/ubuntu/24.04/kvm \
--instance-type virtual-machine
Setelah proses build selesai, output akan menampilkan image baru di LXD host, dan siap untuk digunakan oleh Cluster API.

Contoh Penggunaan CAPI
Membuat Cluster dengan CAPI
Tahapan ini kita akan membuat cluster Kubenetes, sebelum deploy cluster ada beberapa variabel yang harus disetting terlebih dahulu.
export LOAD_BALANCER='lxc: {}'
export LXC_SECRET_NAME=lxc-secret
export DEPLOY_KUBE_FLANNEL=trueSelanjutnya ketik diterminal command clusterctl untuk generate manifes YAML cluster. Command ini akan membuat cluster bernama c1 dengan satu control-plane dan satu worker node.
clusterctl generate cluster c1 -i incus \
--kubernetes-version v1.30.2 \
--control-plane-machine-count 1 \
--worker-machine-count 1 \
> cluster.yaml
kubectl apply -f cluster.yamlSetelah generate manifest, controller Cluster API membuat cluster pada background proses. Kita bisa memantau prosesnya di LXD host dan di dalam management cluster. Untuk tahapan pembuatannya seperti ini:
Membuat container untuk control-plane.
Membuat VM untuk worker node.
Menjalankan
kubeadmuntuk menginisialisasi dan menggabungkan node.Menginstal CNI (Flannel) seperti yang kita definisikan.
Cek jika provisioning sudah selesai.
# Tunggu beberapa menit hingga semua status menjadi "True"
clusterctl describe cluster c1

Kita juga bisa melihat instance yang terbuat pada terminal LXD.

Gambar diatas menujukan cluster yang sudah dibuat oleh CAPI.
Menghapus Cluster dengan CAPI
Salah satu keunggulan utama Cluster API adalah kemudahan dalam mengelola lifecycle cluster. Contoh lain penggunaan CAPI adalah untuk menghapus seluruh klaster, disini saya ambil contoh menghapus cluster c1 beserta semua resourcenya (VM, container, load balancer, dll.). Cukup mudah untuk menghapus cluster dengan CAPI, cukup jalankan satu perintah:
kubectl delete cluster c1Cluster API akan secara otomatis dan aman menghapus semua komponen yang telah dibuatnya.

Kesimpulan
Cluster API atau CAPI merupakan fitur yang sangat membantu pada kubernetes. Karena fitur tersebut kita dipermudah dalam membuat, menghapus, ataupun manajeman cluster kubernetes. Jadi kita tidak perlu repot-repot untuk membuat container satu persatu dan memasang dependency pada masing-masing container.