Episode ini membedah NetworkPolicy Calico yang namespaced: struktur selector, ingress dan egress, port dan protocol, prinsip default deny, serta urutan evaluasi policy menggunakan tiers.

Inilah episode yang paling sering menjadi alasan orang memakai Calico: network policy. Di episode ini kalian belajar menulis policy yang mengendalikan traffic masuk dan keluar dari workload berbasis label, port, dan protocol — dan yang lebih penting, memahami kapan sebuah paket diizinkan atau ditolak.
Aturan mainnya harus jelas sejak awal: di Calico, default adalah allow. Kalau tidak ada policy yang cocok dengan workload, semua traffic mengalir bebas. Untuk membangun keamanan yang nyata, kalian harus menutup lubang itu dengan policy default deny — tema yang kita perdalam di episode 13.
Calico menyediakan NetworkPolicy dengan apiVersion projectcalico.org/v3. Secara sintaks mirip dengan networking.k8s.io/v1, tapi punya kelebihan: selector memakai label Calico, aksi eksplisit (Allow/Deny/Pass/Log), dan dukungan protocol yang lebih luas seperti SCTP.
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-web-from-app
namespace: default
spec:
selector: app == 'web'
types:
- Ingress
ingress:
- action: Allow
protocol: TCP
source:
selector: app == 'app'
destination:
ports:
- 8080Policy ini mengizinkan pod berlabel app: web menerima TCP dari pod berlabel app: app di port 8080. Perhatikan action: Allow — di Calico aksinya eksplisit, bukan sekadar menambahkan rule.
Selector bisa menjangkau lintas namespace dengan namespaceSelector:
source:
namespaceSelector: project == 'frontend'
selector: app == 'api-client'Gabungan namespaceSelector dan selector berarti: pod dari namespace yang memenuhi label project: frontend dan berlabel app: api-client.
Selama tidak ada policy, kubectl exec dan akses lintas namespace berjalan bebas. Untuk mengubahnya, buat policy yang mencocokkan workload dan tanpa rule Allow:
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: default-deny-web
namespace: default
spec:
selector: app == 'web'
types:
- Ingress
- Egress
ingress: []
egress: []Policy dengan ingress: [] dan egress: [] menandakan: semua traffic yang tidak dicocokkan rule lain akan ditolak untuk workload ini. Ini pola dasar microsegmentation.
Saat sebuah pod dicocokkan oleh beberapa policy, aturan dari semua policy digabung dan dievaluasi berurutan oleh tiers (episode 6). Rule pertama yang cocok menentukan aksi. Karena itu urutan rule penting: letakkan deny yang lebih spesifik sebelum allow yang luas.
Verifikasi policy yang diterapkan pada workload tertentu:
calicoctl get networkpolicy -n default -o yaml
calicoctl get workloadendpoints -n default
kubectl describe networkpolicy -n defaultkubectl describe networkpolicy menampilkan ringkasan rule yang melekat pada pod tertentu — berguna saat policy tampak tidak berefek.
Selain ingress, kalian bisa membatasi keluar. Contoh: pod client hanya boleh keluar ke port 443:
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: egress-client
namespace: default
spec:
selector: app == 'client'
types:
- Egress
egress:
- action: Allow
protocol: TCP
destination:
selector: app == 'api'
ports:
- 443Ingat: egress juga butuh izin DNS. Jika workload harus resolve nama, tambahkan rule untuk CoreDNS (kita bahas detail di episode 11).
Aturan protocol mendukung TCP, UDP, SCTP, dan ICMP. Untuk range port:
destination:
ports:
- 9000
- 10000:1100010000:11000 berarti port 10000 sampai 11000. Kombinasi protocol dan ports harus selalu berpasangan.
Setelah policy diterapkan, uji dengan pod di kedua sisi:
kubectl run allow-src --image=busybox --labels app=app --command -- sleep 3600
kubectl run deny-src --image=busybox --labels app=other --command -- sleep 3600
kubectl exec allow-src -- wget -q -O - http://web.default.svc.cluster.local:8080
kubectl exec deny-src -- wget -q -O - http://web.default.svc.cluster.local:8080Pod allow-src harus berhasil, sedangkan deny-src akan timeout karena tidak dicocokkan policy Allow. Kalau deny-src malah berhasil, ada policy allow yang terlalu luas — atau policy belum diterapkan.
Episode 5 membekali kalian keterampilan inti keamanan Calico: menulis NetworkPolicy namespaced, memahami prinsip default deny, mengontrol ingress dan egress, serta menguji efek policy secara nyata.
Inti yang harus dibawa pulang:
action bersifat eksplisit: Allow, Deny, Pass, dan Log.namespaceSelector untuk lintas namespace.awal:akhir.kubectl describe networkpolicy dan uji pod adalah cara tercepat memvalidasi.Di episode 6 selanjutnya kita naik satu level: GlobalNetworkPolicy dan tiers — policy cluster-scope yang berlaku ke semua node, GlobalNetworkSet, serta hierarki tier security, platform, dan application yang mengatur urutan evaluasi policy di seluruh klaster.