← Semua artikel
Tutorial Linux11 Nov 2026ariel6 menit baca

Migrasi Aplikasi Web Docker ke K3s untuk Homelab

Migrasikan web statis dari Docker Compose ke K3s: ConfigMap, Deployment, Service, uji akses lokal, troubleshooting, dan rollback homelab.
Kluster Kubernetes K3s Ringan di Linux

Tutorial ini memindahkan satu aplikasi web statis dari Docker Compose ke K3s pada lingkungan homelab. Hasil akhirnya adalah Deployment, ConfigMap, dan Service yang bisa diperiksa melalui localhost. Aplikasi Docker sumber tetap tersedia selama proses sehingga rollback tidak bergantung pada kluster baru.

Status: langkah disusun dan ditinjau terhadap dokumentasi resmi pada 12 November 2026. Alur K3s ini belum dijalankan dalam sesi pengujian Edelweis; tidak ada screenshot simulasi yang diklaim sebagai bukti. Contoh ini bukan migrasi database atau rancangan produksi dengan ketersediaan tinggi.

1. Siapkan lingkungan lab dan inventaris aplikasi

Gunakan dua VM Linux yang terpisah: mesin sumber dengan Docker Compose dan mesin tujuan dengan K3s. Untuk VM server K3s, siapkan setidaknya 2 CPU dan RAM 2 GB sebagai baseline K3s, ditambah kapasitas bagi workload. Sediakan disk SSD dan periksa persyaratan resmi sesuai arsitektur. Jangan memasang K3s pada hosting WordPress ini. Uji dari konsol VM; pemasangan mengubah service dan jaringan host.

cat /etc/os-release
uname -m
free -h
df -h /
# Di mesin sumber:
docker version
docker compose version

Sebelum memindahkan aplikasi sendiri, catat image/tag atau digest, port, environment, secret, volume, health check, dan ketergantungan database. Contoh berikut sengaja tidak memakai secret atau database. Jangan menyalin password produksi ke manifest atau ConfigMap.

2. Jalankan aplikasi sumber dengan Docker Compose

Di mesin sumber, buat folder khusus. Port hanya diikat ke localhost. Jika port 18080 sudah dipakai, pilih port lain dan sesuaikan pemeriksaan.

mkdir -p ~/edelweis-migration/html
cd ~/edelweis-migration
printf 'Edelweis migration lab\n' > html/index.html
cat > compose.yaml <<'YAML'
services:
  web:
    image: nginx:stable-alpine
    ports:
      - '127.0.0.1:18080:80'
    volumes:
      - ./html:/usr/share/nginx/html:ro
YAML
docker compose config
docker compose up -d
curl --fail http://127.0.0.1:18080/

Respons yang diharapkan adalah Edelweis migration lab. Catat digest image sumber dengan docker image inspect nginx:stable-alpine --format '{{index .RepoDigests 0}}'. Gunakan digest yang sama dalam manifest tujuan agar uji tidak membandingkan build berbeda. Tag contoh dapat berubah seiring waktu.

3. Pasang K3s pada VM tujuan

Dokumentasi K3s menyediakan installer resmi. Unduh dan tinjau skrip sebelum menjalankannya. Perintah sudo di bawah benar-benar memasang software dan mengubah host; jalankan hanya pada VM tujuan lab yang telah disiapkan. Jika memerlukan versi tetap, pilih rilis yang didukung dari dokumentasi dan catat versi tersebut.

curl --fail --show-error --location https://get.k3s.io -o install-k3s.sh
less install-k3s.sh
# Jalankan setelah sumber dan isi skrip diperiksa:
sudo sh install-k3s.sh
sudo systemctl status k3s --no-pager
sudo k3s --version
sudo k3s kubectl get nodes -o wide
sudo k3s kubectl get pods -A

Installer standar juga memasang utilitas kubectl. Contoh memakai sudo k3s kubectl secara konsisten agar konteks aksesnya jelas. Opsi instalasi tertentu dapat memengaruhi pembuatan symlink. Tunggu node berstatus Ready; pemasangan tidak dijamin selesai dalam beberapa detik. Jangan mengatasi kegagalan jaringan dengan menonaktifkan firewall secara membabi buta.

4. Buat manifest aplikasi tujuan

Di mesin tujuan, simpan file berikut sebagai web-lab.yaml. Namespace memisahkan resource contoh. ConfigMap membawa konten nonrahasia; Deployment mengatur replika; Service memberi alamat internal yang stabil. ConfigMap cocok untuk halaman contoh ini, bukan pengganti volume data aplikasi.

apiVersion: v1
kind: Namespace
metadata:
  name: edelweis-lab
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: web-content
  namespace: edelweis-lab
data:
  index.html: |
    Edelweis migration lab
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-lab
  namespace: edelweis-lab
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-lab
  template:
    metadata:
      labels:
        app: web-lab
    spec:
      containers:
        - name: nginx
          image: nginx:stable-alpine
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 50m
              memory: 32Mi
            limits:
              cpu: 250m
              memory: 128Mi
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 5
          volumeMounts:
            - name: content
              mountPath: /usr/share/nginx/html
              readOnly: true
      volumes:
        - name: content
          configMap:
            name: web-content
---
apiVersion: v1
kind: Service
metadata:
  name: web-lab
  namespace: edelweis-lab
spec:
  type: ClusterIP
  selector:
    app: web-lab
  ports:
    - port: 80
      targetPort: 80

Sebelum apply, ganti nilai image dengan digest image sumber yang dicatat. Requests dan limits adalah nilai contoh untuk halaman kecil; ukur ulang untuk aplikasi sendiri. Dua replika pada satu node tidak melindungi dari kegagalan node tersebut.

sudo k3s kubectl apply --dry-run=client -f web-lab.yaml
sudo k3s kubectl apply -f web-lab.yaml
sudo k3s kubectl -n edelweis-lab rollout status deployment/web-lab --timeout=180s
sudo k3s kubectl -n edelweis-lab get deployments,pods,services
sudo k3s kubectl -n edelweis-lab get endpointslices -l kubernetes.io/service-name=web-lab

5. Uji akses dan bandingkan hasil migrasi

Di terminal pertama pada VM tujuan, buka port-forward hanya ke loopback. Proses ini tetap berjalan di terminal dan berhenti dengan Ctrl+C. Jika lu mengakses VM melalui SSH, jalankan curl pada VM yang sama; localhost browser laptop adalah mesin yang berbeda.

sudo k3s kubectl -n edelweis-lab port-forward service/web-lab 18081:80 --address=127.0.0.1

Di terminal kedua pada VM tujuan:

curl --fail --show-error http://127.0.0.1:18081/
sudo k3s kubectl -n edelweis-lab logs deployment/web-lab --tail=30

Cocokkan isi respons dengan sumber: Edelweis migration lab. Deployment seharusnya menunjukkan dua replika siap dan EndpointSlice memuat alamat backend. Port-forward membuktikan akses lokal melalui API Kubernetes ke pod yang dipilih; ini belum membuktikan akses Ingress, DNS publik, HTTPS, atau distribusi trafik melalui jaringan Service.

6. Tentukan cutover dan rollback

Untuk lab lokal ini tidak ada perubahan DNS publik. Aplikasi sumber tetap berjalan pada mesin sumber, sedangkan tujuan diuji di port lokal berbeda. Jika tujuan gagal, gunakan kembali sumber yang sudah diverifikasi. Pada aplikasi nyata, cutover memerlukan pengujian Ingress/TLS, pengalihan trafik yang terkontrol, dan rencana konsistensi data; jangan menulis bersamaan ke dua database tanpa strategi replikasi yang jelas.

Untuk menguji pergantian pod di lab, jalankan perintah berikut. Port-forward bisa terputus ketika pod yang dipilih diganti; buka kembali setelah rollout selesai.

sudo k3s kubectl -n edelweis-lab rollout restart deployment/web-lab
sudo k3s kubectl -n edelweis-lab rollout status deployment/web-lab --timeout=180s

Pada pembaruan image berikutnya, rollout undo deployment/web-lab hanya dapat memulihkan revisi pod template yang masih tersimpan. Perintah itu bukan pemulihan isi ConfigMap, volume, atau database. Simpan manifest versi sebelumnya dan backup data secara terpisah.

7. Troubleshooting dan pembersihan lab

sudo k3s kubectl -n edelweis-lab get pods -o wide
sudo k3s kubectl -n edelweis-lab describe deployment web-lab
sudo k3s kubectl -n edelweis-lab get events --sort-by=.metadata.creationTimestamp
sudo k3s kubectl -n edelweis-lab logs deployment/web-lab --tail=50

Pending: cek kapasitas node dan requests. ImagePullBackOff: cek digest, registry, DNS, dan koneksi keluar. CrashLoopBackOff: baca log kontainer. Service tanpa endpoint: cocokkan selector dengan label pod dan hasil readiness probe. Connection refused: pastikan port-forward masih aktif dan port yang diuji sesuai.

Setelah selesai, Ctrl+C menghentikan port-forward. Perintah berikut menghapus resource contoh di namespace lab dan menghentikan container sumber; jangan memakai namespace atau folder milik aplikasi lain.

# Di VM tujuan, hanya untuk resource contoh artikel ini:
sudo k3s kubectl delete -f web-lab.yaml
# Di mesin sumber, dari folder ~/edelweis-migration:
docker compose down

File lab dan instalasi K3s tetap tersimpan. Untuk membuang seluruh lingkungan, matikan lalu hapus VM lab melalui hypervisor setelah memastikan tidak ada data yang dibutuhkan. Tidak perlu menjalankan perintah penghapusan host produksi.

Dokumentasi dan materi berikutnya

Panduan resmi instalasi K3s, persyaratan K3s, dan dokumentasi port-forward Kubernetes menjadi rujukan langkah ini. Mulai dari Docker dan Compose jika belum terbiasa dengan container, atau pilih jalur di Mulai di Sini.

Catatan editorial: Diagram bersifat konseptual kecuali diberi label sebagai hasil uji. Verifikasi konfigurasi di perangkat lu sendiri sebelum dipakai pada sistem produksi.

END OF NOTE.Jelajahi artikel lain ↗

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *