Niko Akhmalul Ananto
Niko Akhmalul Ananto
Published on 2025-09-15 / 86 Visits
0
0

Instalasi Kubernetes Menggunakan Juju di LXD

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:

  1. Charmed Kubernetes Bundle – instalasi otomatis menggunakan bundle resmi dari Canonical.

  2. 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 juju

Konfigurasi 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

juju

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

juju dashboard

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-$MODEL

Instalasi 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 1s

Disable 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=false

Troubleshoot

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=true

Instalasi 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

juju status cluster

juju run kubernetes

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/2

Menghapus Komponen

Jika kita ingin menghapus seluruh aplikasi/komponen (misalnya calico atau kubeapi-load-balancer), kita bisa menggunakan:

# contoh: menghapus aplikasi calico
juju remove-application calico

Menghapus 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-wait

Jika ingin menghapus seluruh environment Juju termasuk controller, gunakan:

# contoh: menghapus deployment beserta controller
juju destroy-controller lxd-local --destroy-all-models --destroy-storage

Referensi


Comment