Juju adalah sebuah orchestration tool open-source buatan Canonical yang digunakan untuk mengelola, mengatur, dan mengotomatisasi proses deployment serta konfigurasi aplikasi kompleks di berbagai infrastruktur (bare-metal, VM, container, hingga cloud). Dengan Juju, aplikasi bisa dijalankan dalam bentuk charm yang berisi deklarasi bagaimana aplikasi diinstal, dikonfigurasi, dan dihubungkan dengan aplikasi lain.
LXD adalah container hypervisor berbasis sistem container Linux (LXC) yang memungkinkan menjalankan system container (bukan hanya application container seperti Docker). LXD berperan seperti "virtual machine ringan" karena setiap kontainer punya kernel namespace sendiri, bisa punya profil jaringan, storage, dan resource constraint seperti halnya VM.
Panduan ini ditujukan untuk membangun Kubernetes cluster di atas LXD dengan bantuan Juju.
Ada dua opsi instalasi:
Charmed Kubernetes Bundle – instalasi otomatis menggunakan bundle resmi dari Canonical.
Manual Deployment – instalasi satu per satu komponen Kubernetes untuk fleksibilitas konfigurasi.
Prasyarat
Sebelum memulai instalasi, pastikan bahwa LXD sudah terpasang dan diinisialisasi di host. LXD akan menjadi lingkungan tempat node-node Kubernetes berjalan.
Instalasi Juju
Langkah pertama adalah menginstal Juju. Juju akan menjadi pengatur utama untuk melakukan deployment dan integrasi antar komponen Kubernetes.
sudo snap install jujuKonfigurasi controller Juju di LXD
Setelah Juju terinstal, kita perlu membuat controller. Controller adalah service utama Juju yang bertugas mengelola model dan aplikasi yang dijalankan. Karena kita memakai LXD, controller akan dipasang di atas localhost cloud yang berbasis LXD.
sudo adduser $USER lxd
sudo chown -f -R $USER
newgrp lxd
juju clouds
juju bootstrap localhost lxd-local
# tunggu sampai proses bootstraping selesai
juju whoami
juju models
Menambahkan Juju Dashboard (opsional)
Untuk memudahkan manajemen cluster, kita bisa menambahkan Juju Dashboard. Dashboard ini menyediakan antarmuka berbasis web agar kita bisa memantau dan mengelola aplikasi tanpa hanya mengandalkan CLI.
juju switch lxd-local:controller
juju deploy juju-dashboard
juju integrate juju-dashboard controller
juju expose juju-dashboard
# tunggu sampai ready
juju status --relations --watch 1s
# addd proxy device for forward port juju-dashboard container to the host
lxc config device add <container-name> <proxy-device-name> proxy listen=tcp:<listen-address-on-host>:<listen-port-on-host> connect=tcp:<listen-address-on-container>:<listen-port-on-container>
## example
lxc config device add juju-f77ab2-1 juju-dashboard proxy listen=tcp:0.0.0.0:31080 connect=tcp:127.0.0.1:8080
## to access the dashboard
# get credentials
juju dashboard
# access the dashboard from browser
http://<host-address>:31080
Instalasi Kubernetes
Tuning Profile lxd (Diperlukan untuk kedua metode instalasi)
Sebelum menjalankan deployment, kita perlu menyesuaikan profil LXD. Hal ini penting karena Kubernetes membutuhkan modul kernel, hak akses tambahan, serta konfigurasi khusus agar semua komponen dapat berjalan optimal di dalam container LXD.
export MODEL=kubernetes
# add model
juju add-model $MODEL
# tuning model profile
cat <<EOF > $HOME/profile.yaml
name: juju-$MODEL
config:
boot.autostart: "true"
linux.kernel_modules: ip_vs,ip_vs_rr,ip_vs_wrr,ip_vs_sh,ip_tables,ip6_tables,netlink_diag,nf_nat,overlay,br_netfilter
raw.lxc: |
lxc.apparmor.profile=unconfined
lxc.mount.auto=proc:rw sys:rw cgroup:rw
lxc.cgroup.devices.allow=a
lxc.cap.drop=
security.nesting: "true"
security.privileged: "true"
description: "Juju profile modified for Charmed Kubernetes"
devices:
aadisable:
path: /sys/module/nf_conntrack/parameters/hashsize
source: /sys/module/nf_conntrack/parameters/hashsize
type: disk
aadisable2:
path: /dev/kmsg
source: /dev/kmsg
type: unix-char
aadisable3:
path: /sys/fs/bpf
source: /sys/fs/bpf
type: disk
aadisable4:
path: /proc/sys/net/netfilter/nf_conntrack_max
source: /proc/sys/net/netfilter/nf_conntrack_max
type: disk
EOF
cat $HOME/profile.yaml | lxc profile edit juju-$MODELInstalasi lewat Charmed Bundle
Metode ini paling mudah karena semua komponen Kubernetes sudah dirangkai dalam satu bundle. Cocok untuk uji coba cepat.
juju deploy charmed-kubernetes
# Untuk memantau proses Instalasi:
juju status --color --watch 1s
Instalasi Manual
Jika ingin kontrol penuh, kita bisa melakukan deployment manual setiap komponen Kubernetes. Dengan cara ini, kita bisa menyesuaikan skala dan integrasi sesuai kebutuhan.
# manual deployment each component
juju deploy easyrsa --constraints='cores=1 mem=1G root-disk=10G' --channel=latest/stable
juju deploy etcd --constraints='cores=2 mem=4G root-disk=50G' --channel=latest/stable
juju integrate etcd easyrsa
juju deploy kubernetes-control-plane --constraints='cores=2 mem=4G root-disk=100G' --channel=latest/stable -n3
juju deploy kubernetes-worker --constraints='cores=2 mem=4G root-disk=100G' --channel=latest/stable -n2
juju integrate kubernetes-control-plane kubernetes-worker:kube-control
juju integrate kubernetes-control-plane kubernetes-worker:tokens
juju integrate easyrsa kubernetes-control-plane
juju integrate easyrsa kubernetes-worker
juju integrate etcd kubernetes-control-plane
juju expose kubernetes-control-plane
# deploy container runtime
juju deploy containerd --channel=latest/stable
juju integrate containerd kubernetes-control-plane
juju integrate containerd kubernetes-worker
# deploy cni plugin
juju deploy calico --channel=latest/stable
juju integrate calico kubernetes-control-plane
juju integrate calico kubernetes-worker
juju integrate calico etcd
juju config kubernetes-control-plane default-cni=calico
# deploy kubeapi-load-balancer
juju deploy kubeapi-load-balancer --constraints='cores=2 mem=4G root-disk=50G' --channel=latest/stable
juju integrate kubeapi-load-balancer kubernetes-control-plane:loadbalancer-external
juju integrate kubeapi-load-balancer kubernetes-control-plane:loadbalancer-internal
juju integrate kubeapi-load-balancer easyrsa
juju expose kubeapi-load-balancer
juju status --color --watch 1sDisable Add-on dashboard kubernetes (jika tidak diperlukan)
Secara default, Juju akan memasang add-on dashboard Kubernetes. Jika tidak diperlukan, kita bisa mematikannya agar lebih ringan.
juju config kubernetes-control-plane enable-dashboard-addons=falseTroubleshoot
Jika terlihat ada error calico dengan status: ignore-loose-rpf config is in conflict with rp_filter value itu karena parameter kernel net.ipv4.conf.all.rp_filter di set 2. Karena instalasi ini di atas lxd dan jalan di container, kita tidak bisa ubah parameter di containernya karena bergantung ke host. Untuk situasi ini kita bisa pakai command berikut:
juju config calico ignore-loose-rpf=trueInstalasi kubectl
Terakhir, kita pasang kubectl sebagai command line tool untuk berinteraksi dengan Kubernetes. Setelah konfigurasi kubeconfig diambil dari cluster, kita bisa mulai mengelola node dan workload.
sudo snap install kubectl --classic
sudo apt install yq -y
mkdir ~/.kube
juju run kubernetes-control-plane/leader get-kubeconfig |yq -r '.kubeconfig' |tee ~/.kube/config
kubectl get node -o wide

Menghapus Cluster
Selain melakukan deployment, Juju juga dapat digunakan untuk mengurangi skala cluster, menghapus komponen tertentu, atau bahkan menghancurkan seluruh cluster. Hal ini sangat berguna untuk uji coba, debugging, atau saat kita ingin menghemat resource.
Ada tiga skenario umum dalam proses penghapusan:
Mengurangi Unit
Jika sebuah aplikasi sudah berjalan dengan beberapa unit (misalnya worker node dengan skala 3), kita bisa mengurangi jumlah unit tanpa menghapus keseluruhan aplikasi.
# contoh: mengurangi 1 unit worker
juju remove-unit kubernetes-worker/2Menghapus Komponen
Jika kita ingin menghapus seluruh aplikasi/komponen (misalnya calico atau kubeapi-load-balancer), kita bisa menggunakan:
# contoh: menghapus aplikasi calico
juju remove-application calicoMenghapus Satu Cluster
Jika kita ingin benar-benar menghapus seluruh model/cluster beserta aplikasi-aplikasinya, kita bisa melakukan destroy model. Ini akan menghapus semua resource cluster sekaligus.
# contoh: menghapus model kubernetes beserta semua komponennya
juju destroy-model kubernetes --destroy-storage --force --no-waitJika ingin menghapus seluruh environment Juju termasuk controller, gunakan:
# contoh: menghapus deployment beserta controller
juju destroy-controller lxd-local --destroy-all-models --destroy-storage