Membangun dan mengoperasikan infrastruktur Kubernetes produksi: merancang cluster dan node, memahami networking CNI dan storage persistent, mengelola upgrade yang aman, serta observability dan backup cluster

Setelah di episode 13 kita menghubungkan dunia on-prem dan cloud, kini kita masuk ke platform yang di 2026 hampir identik dengan "infrastruktur modern": Kubernetes. Di episode 7 kita sudah mengenal konsep dasarnya; kini kita melihat K8s dari sisi operator — cluster design, networking, storage, upgrade, dan observability.
Mengapa topik ini penting? Karena di 2026 Kubernetes bukan lagi sekadar orkestrator container — ia adalah lapisan platform tempat sebagian besar workload baru dijalankan, baik on-prem maupun cloud. Infrastructure engineer yang tidak bisa mengoperasikan K8s akan kehilangan sebagian besar pasar kerja.
| Komponen | Fungsi | Tanggung Jawab Infra |
|---|---|---|
| API Server | Gerbang semua operasi | Ketersediaan & keamanan |
| etcd | Database state cluster | Backup rutin! (kritis) |
| Scheduler | Menempatkan pod ke node | Memastikan resources cukup |
| Kubelet | Agen di tiap node | Kesehatan node |
| Container runtime | Menjalankan container (containerd/CRI-O) | Update & hardening |
Poin paling penting untuk infra engineer: etcd adalah jantung cluster. Cluster yang kehilangan etcd kehilangan segalanya. Backup etcd adalah bagian pertama checklist DR cluster.
| Pola | Kelebihan | Kekurangan |
|---|---|---|
| 1 cluster besar | Biaya rendah, sederhana | Blast radius besar, lingkungan campur |
| Cluster per lingkungan | Isolasi, blast radius kecil | Lebih mahal, lebih banyak operasi |
| Cluster per tim (multi-tenant) | Isolasi kuat | Sangat mahal, overkill |
Pola produksi yang umum: cluster staging + cluster production terpisah, dengan namespaces memisahkan tim/aplikasi dalam satu cluster. Multi-tenant dengan isolasi keras (beberapa tim berbeda) biasanya butuh cluster terpisah.
Pertimbangan ukuran node: node besar (32+ core) = lebih sedikit node, biaya operasi rendah, tetapi blast radius besar saat node mati. Node kecil (4-8 core) = lebih banyak node, failover lebih halus, tetapi overhead lebih tinggi. Keseimbangan umum: 8-16 core per node.
Networking K8s adalah lapisan yang paling sering disalahpahami. Empat model yang harus jelas:
| Model | Menghubungkan | Implementasi |
|---|---|---|
| Container-to-container | Container dalam satu pod | Loopback bersama (localhost) |
| Pod-to-pod | Pod antar node mana pun | CNI (Calico, Cilium, Flannel) |
| Pod-to-Service | Pod ke alamat stabil | Service + kube-proxy (iptables/IPVS) |
| External-to-Service | Dari luar ke cluster | NodePort, LoadBalancer, Ingress |
CNI (Container Network Interface) mengatur jaringan pod di seluruh node. Setiap pod mendapat IP unik yang bisa menjangkau pod lain di node mana pun tanpa NAT.
kubectl get pods -n kube-system | grep -i "cilium\|calico"
kubectl get ds -n kube-systemDua CNI paling populer 2026: Calico (mendukung network policy yang matang) dan Cilium (eBPF — performa tinggi, observability dalam, mendukung network policy juga). Pilihan CNI menentukan kemampuan network policy kalian.
Di K8s, semua pod bisa saling bicara secara default — itu bahaya. Network Policy membatasinya:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-db-from-web-only
spec:
podSelector:
matchLabels:
app: database
policyTypes: [Ingress]
ingress:
- from:
- podSelector:
matchLabels:
app: web
ports:
- protocol: TCP
port: 5432Policy ini: database hanya menerima koneksi port 5432 dari pod berlabel app: web. Semua yang lain diblokir — menerapkan prinsip segmentation (episode 18) di level platform.
Important
Di cluster default, network policy tidak aktif sampai CNI yang mendukungnya terpasang — dan policy yang didefinisikan tanpa CNI yang tepat tidak berlaku diam-diam. Verifikasi dengan kubectl get networkpolicies dan uji koneksi antar pod setelah menerapkan policy.
Pod bersifat sementara — data yang harus bertahan hidup di PersistentVolume:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 10Gi
storageClassName: standardReadWriteOnce (satu node), ReadWriteMany (banyak node — butuh NFS/Ceph).hostPath — pakai storage yang bisa direplikasi (Ceph/Longhorn di on-prem, managed disk di cloud).Upgrade adalah saat paling berisiko dalam siklus hidup cluster. Prinsip yang benar:
kubectl drain node-01 --ignore-daemonsets
sudo kubeadm upgrade node
sudo systemctl restart kubelet
kubectl uncordon node-01
kubectl get nodesdrain mengosongkan pod dari node dengan aman (migrasi bertahap), uncordon mengembalikan node sebagai target scheduling. Ini pola yang sama di semua distribusi K8s.
Tip
Mulai upgrade dari node yang paling tidak penting, dan sisakan satu node terakhir untuk observasi. Jika masalah muncul, kalian bisa membandingkan perilaku node baru vs node lama. Jangan pernah meng-upgrade semua node dalam satu malam tanpa bisa rollback.
Di episode 9 kita membangun observability umum; untuk K8s tambahkan:
kube-state-metrics).NotReady, pod CrashLoopBackOff, imagePullBackOff, PVC pending.NodeDown : node tidak responsif > 5 menit
PodNotReady : pod stuck > 15 menit
PersistentVolumePending : PVC tidak bisa dibind (storage habis?)
OutOfMemoryKilled : pod di-OOM-killBackup K8s mencakup tiga lapisan:
sudo ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-$(date +%F).dbTools modern seperti Velero mengotomasi backup seluruh cluster (manifests + volume) ke object storage.
Pada episode 14 ini kalian telah menguasai infrastruktur Kubernetes:
Di episode 15 selanjutnya kita masuk ke data infrastructure — managed databases, cache Redis, dan message broker yang menjadi platform data bagi aplikasi. Sampai jumpa di episode 15!