Memahami jaringan platform cloud-native: model pod network yang flat, peran CNI dan perbandingan Calico, Flannel, dan Cilium, cara kube-proxy mengimplementasikan Service lewat iptables/IPVS/eBPF, Ingress versus Gateway API, serta praktik menulis NetworkPolicy default-deny untuk microsegmentation

Setelah di episode 16 kalian menganyam overlay sendiri, sekarang lihat bagaimana platform aplikasi modern memakai prinsip yang sama dalam skala masif: Kubernetes. Bagi network engineer 2026, cluster bukan lagi wilayah asing — tim platform akan bertanya kenapa pod tak saling tembus, kenapa policy tidak jalan, atau kenapa conntrack penuh, dan kalian diharapkan ikut menjawab.
Episode ini membedah empat lapisan networking Kubernetes: pod network + CNI, Service & kube-proxy, traffic masuk (Ingress/Gateway API), dan NetworkPolicy.
Kubernetes menuntut satu kontrak sederhana namun berdampak besar:
Konsekuensinya: alamat pod datang dari CIDR cluster (--cluster-cidr, misal 10.244.0.0/16), dibagi per-node. Trafik antar-node diteruskan oleh... tergantung pilihan kalian — inilah CNI.
CNI (Container Network Interface) adalah spesifikasi plugin yang menyambungkan pod ke jaringan. Saat pod lahir, kubelet memanggil binary CNI untuk membuat veth pair, attach bridge/vxlan, assign IP. Pilihan utamanya:
| CNI | Model Data Plane | Kekuatan |
|---|---|---|
| Flannel | VXLAN overlay simpel | Paling mudah dipahami, cocok belajar |
| Calico | Routing BGP native (atau overlay) | NetworkPolicy matang, performa rute langsung |
| Cilium | eBPF di kernel | L7 policy, observability, tanpa iptables |
Pertanyaan arsitektur klasiknya: overlay vs routing native. Overlay (VXLAN ala episode 16) bebas di infrastruktur apa pun; native routing butuh underlay yang routable (BGP antar node) tapi lebih cepat karena tanpa enkapsulasi. Kalau kalian sudah paham kedua dunia itu, pemilihan CNI tinggal soal konteks.
Note
NetworkPolicy HANYA hidup jika CNI mendukungnya. Cluster dengan CNI tanpa enforcement (misal flannel polos) akan menerima manifest policy tanpa protes — dan menerapkan nol aturan. Selalu verifikasi CNI dulu sebelum menjanjikan segmentasi ke tim security.
Pod mati-hidup tiap deployment; IP-nya berganti. Service memberi virtual IP + DNS name yang stabil:
| Tipe Service | Perilaku |
|---|---|
| ClusterIP | VIP internal cluster (default) |
| NodePort | Buka port statis di tiap node |
| LoadBalancer | Provision LB cloud → menuju NodePort |
| Headless | Tanpa VIP; DNS menjawab daftar IP pod |
Yang menarik bagi engineer: kube-proxy adalah implementatornya. Ia memprogram setiap node agar VIP "ada" tanpa proses forwarding sentral:
Debugging klasik yang wajib hafal: service ClusterIP hanya ada di iptables/IPVS — ping VIP sering gagal padahal trafik TCP normal; uji dengan request nyata, bukan ICMP.
kubectl get svc -o wide
kubectl -n kube-system get ds # daemonset CNI/kube-proxy
sudo iptables-save | grep -i my-svc # rule NAT-nyaService LoadBalancer per aplikasi itu mahal (satu cloud LB tiap service). Solusi standarnya Ingress: satu LB di depan, routing L7 (host/path) ke banyak service:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port: { number: 80 }
- path: /
pathType: Prefix
backend:
service:
name: web-service
port: { number: 80 }Ingress punya batasan ekspresi (port non-HTTP sulit); generasi penerusnya Gateway API — role-oriented (GatewayClass/Gateway/HTTPRoute), lebih kaya protokol, dan memisahkan kepemilikan infra vs tim aplikasi. Untuk kasus advanced: service mesh (Istio/Linkerd, kini makin banyak sidecar-less via eBPF) menambahkan mTLS, retry, dan traffic splitting antar-service — layer 7 governance di atas semuanya.
Default Kubernetes = allow all antar pod — flat seperti LAN tanpa VLAN. Di era zero-trust, itu tidak bisa dibiarkan; jawabannya NetworkPolicy, firewall berlabel selektor.
Pola produksi wajib: default-deny dulu, izin eksplisit kemudian:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: prod
spec:
podSelector: {}
policyTypes: ["Ingress", "Egress"]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-web-to-api
namespace: prod
spec:
podSelector:
matchLabels: { app: api }
ingress:
- from:
- podSelector:
matchLabels: { app: web }
ports:
- { protocol: TCP, port: 8080 }Membacanya sebagai network engineer: ini ACL dinamis berbasis identitas label — deny ip any any lalu permit from web to api tcp/8080. Egress juga bisa dibatasi (hanya DNS + destinasi tertentu), menutup jalur eksfiltrasi data.
Praktik lab cepat untuk membuktikan perilakunya:
kubectl apply -f policy-default-deny.yaml
kubectl run probe --rm -it --image=busybox -- wget -qO- --timeout=3 http://api.prod:8080
# ditolak -> tambahkan label app=web pada probe, ulangi -> lolosInti yang harus dibawa pulang:
Di episode 18 kita kembali ke garis pertahanan: firewall dan Next-Gen Firewall — stateful inspection, IDS/IPS inline, application awareness lintas port, dan desain zona trust-untrust-DMZ yang menjadi kerangka keamanan enterprise. Sampai jumpa!