Episode ini membahas RuntimeClass secara menyeluruh: kata untuk QEMU, kata-clh untuk Cloud Hypervisor, kata-fc untuk Firecracker, dan kata-qemu-coco-dev untuk confidential containers. Kalian juga menjalankan pod pertama dengan spec.runtimeClassName dan membuktikan bahwa proses aplikasi berjalan di dalam microVM.

Di episode 3 kalian sudah menginstall Kata dan menyiapkan RuntimeClass kata. Episode 4 adalah momen yang paling memuaskan: menjalankan pod pertama dengan isolasi microVM. Tapi sebelum itu, kita perlu memahami RuntimeClass secara utuh — karena di cluster production, kalian akan berhadapan dengan beberapa RuntimeClass sekaligus, masing-masing untuk backend hypervisor yang berbeda.
Kalian juga akan melihat sendiri bukti paling meyakinkan bahwa isolasi benar-benar terjadi: proses aplikasi tidak terlihat di host, melainkan di dalam microVM. Setelah episode ini, konsep "the speed of containers, the security of VMs" bukan lagi slogan, melainkan sesuatu yang kalian buktikan dengan perintah ps.
Kata menyediakan beberapa RuntimeClass yang umum dipakai, masing-masing menunjuk ke backend VMM berbeda:
kata: backend QEMU — default, kompatibilitas terluas.kata-clh: backend Cloud Hypervisor — modern dan cepat untuk workload umum.kata-fc: backend Firecracker — minimalis, cocok untuk sandbox ringan.kata-qemu-coco-dev: backend QEMU dengan dukungan confidential containers (TDX/SEV-SNP), dipakai untuk workload yang butuh attestation.Nama-nama ini bukan magic — masing-masing adalah entri RuntimeClass yang handler-nya menunjuk ke konfigurasi containerd. Lihat apa yang sudah terdaftar di cluster kalian:
kubectl get runtimeclass
kubectl get runtimeclass kata -o yamlkubectl get runtimeclass menampilkan daftar RuntimeClass yang dikenal cluster. kubectl get runtimeclass kata -o yaml menampilkan detail — termasuk handler: kata yang harus cocok dengan nama runtime di containerd.
Alur pemilihan runtime mengikuti rantai yang sudah dibangun di episode 2 dan 3:
spec.runtimeClassName: kata.runtimes di config.toml.containerd-shim-kata-v2, dan microVM lahir.Jika handler tidak ditemukan, Kubernetes menolak pod dengan error failed to find runtime handler. Inilah mengapa konfigurasi containerd (episode 3) dan nama handler harus konsisten.
Pod dengan Kata terlihat seperti pod biasa, dengan satu perbedaan: spec.runtimeClassName. Buat file pod-kata.yaml:
apiVersion: v1
kind: Pod
metadata:
name: kata-demo
labels:
app: kata-demo
spec:
runtimeClassName: kata
containers:
- name: app
image: nginx:alpine
ports:
- containerPort: 80spec.runtimeClassName: kata adalah satu-satunya perbedaan dari pod biasa. Terapkan dan tunggu pod menjadi Running:
kubectl apply -f pod-kata.yaml
kubectl get pod kata-demo -wkubectl get pod kata-demo -w menampilkan status pod secara real-time. Yang menarik: pod Kata biasanya menampilkan status ContainerCreating lebih lama sesaat — karena microVM sedang di-boot — tapi secara keseluruhan tetap cepat, sesuai klaim boot 150-300 ms.
Satu detail arsitektur yang penting: pod sandbox dan app container berbagi satu microVM. Di Kata, sebuah pod adalah satu microVM, dan container-container di dalam pod adalah container-container di dalam guest. Sandbox (pause container) dan app container lahir di guest yang sama, dikelola oleh Kata agent.
Untuk melihat hubungan ini, periksa container dan sandbox dari sisi containerd:
crictl pods
crictl pscrictl pods menampilkan sandbox pod, dan crictl ps menampilkan container yang berjalan. Keduanya harus menampilkan pod kata-demo dalam kondisi normal — dari perspektif CRI, semuanya tampak seperti runtime container biasa.
Ini momen pembuktian yang paling menarik. Cari proses aplikasi di host:
ps aux | grep nginx
pgrep -f nginxps aux | grep nginx di host harus tidak menemukan proses nginx. Yang ada di host hanyalah proses VMM — satu proses per microVM. Lihatlah:
ps aux | grep -E "(qemu|cloud-hypervisor|firecracker)"ps aux | grep -E "(qemu|cloud-hypervisor|firecracker)" menampilkan satu proses VMM yang membungkus seluruh microVM pod kata-demo. Proses nginx tidak terlihat di host karena ia lahir di dalam guest kernel.
Untuk melihat proses di dalam guest, kita perlu masuk ke guest. Kata menyediakan kata-runtime exec untuk menjalankan perintah di dalam microVM. Ambil ID sandbox dari kata-runtime list:
kata-runtime list
sudo kata-runtime exec <sandbox-id> ps auxkata-runtime list menampilkan sandbox yang sedang berjalan beserta ID-nya. kata-runtime exec <sandbox-id> ps aux menjalankan ps di dalam guest — di sinilah kalian akan melihat proses nginx, bersama dengan proses Kata agent dan proses sistem guest.
Tip
Cara cepat membuktikan isolasi: jalankan ps aux | grep nginx di host (harus kosong), lalu kata-runtime exec <sandbox-id> ps aux untuk melihat nginx di dalam guest. Host hanya melihat satu proses VMM; guest melihat semua proses aplikasi.
Beberapa masalah yang paling sering ditemui saat menjalankan pod Kata pertama:
kubectl describe pod untuk pesan error persisnya./dev/kvm membuat microVM tidak bisa boot. Pod akan stuck di ContainerCreating lalu CreateContainerError./etc/containerd/config.toml tidak aktif sampai containerd di-restart.kubectl describe pod dan kubectl logs tetap menjadi alat diagnosis pertama. Perluas dengan perintah kata-runtime dan log di /var/log/kata-containers/ ketika mencurigai masalah di lapisan Kata — kita akan membahasnya menyeluruh di episode 12.
Inti yang harus dibawa pulang:
kata, kata-clh, kata-fc, kata-qemu-coco-dev.spec.runtimeClassName adalah satu-satunya perubahan yang dibutuhkan pada pod.kata-runtime list dan kata-runtime exec membuktikan isolasi secara langsung.Di episode 5 selanjutnya kita akan membahas konfigurasi runtime — membedah /etc/kata-containers/configuration.toml, parameter hypervisor, kernel, memory/CPU limits, dan pilihan block device driver virtio-blk vs virtio-scsi. Inilah file yang mengontrol perilaku microVM Kalian, dan memahaminya akan membuat kalian menguasai tuning Kata.
Fase 2 berjalan lancar. Lanjut ke episode berikutnya!