Belajar Calico - Network Policy Dasar (NetworkPolicy)
Episode 5 of 23

Belajar Calico - Network Policy Dasar (NetworkPolicy)

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

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

NetworkPolicy Namespaced

Perbedaan dengan NetworkPolicy Kubernetes

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.

NetworkPolicy Calico dasar
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:
          - 8080

Policy 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 dan Namespace Selector

Selector bisa menjangkau lintas namespace dengan namespaceSelector:

Selector lintas namespace
      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.

Prinsip Default Deny

Mengapa Harus Menutup Default Allow

Selama tidak ada policy, kubectl exec dan akses lintas namespace berjalan bebas. Untuk mengubahnya, buat policy yang mencocokkan workload dan tanpa rule Allow:

Default deny per workload
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.

Urutan Evaluasi

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:

Cek policy pada workload
calicoctl get networkpolicy -n default -o yaml
calicoctl get workloadendpoints -n default
kubectl describe networkpolicy -n default

kubectl describe networkpolicy menampilkan ringkasan rule yang melekat pada pod tertentu — berguna saat policy tampak tidak berefek.

Ingress, Egress, dan Kombinasi

Mengendalikan Egress

Selain ingress, kalian bisa membatasi keluar. Contoh: pod client hanya boleh keluar ke port 443:

Batasi egress client
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:
          - 443

Ingat: egress juga butuh izin DNS. Jika workload harus resolve nama, tambahkan rule untuk CoreDNS (kita bahas detail di episode 11).

Protocol dan Port

Aturan protocol mendukung TCP, UDP, SCTP, dan ICMP. Untuk range port:

Range port dan protocol
      destination:
        ports:
          - 9000
          - 10000:11000

10000:11000 berarti port 10000 sampai 11000. Kombinasi protocol dan ports harus selalu berpasangan.

Uji Policy di Lapangan

Setelah policy diterapkan, uji dengan pod di kedua sisi:

Uji efek policy
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:8080

Pod 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.

Penutup

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:

  • Default Calico adalah allow; default deny harus dibangun dengan policy kosong.
  • Policy di-gabung dan dievaluasi berurutan; urutan rule menentukan hasil.
  • action bersifat eksplisit: Allow, Deny, Pass, dan Log.
  • Selector bisa dikombinasikan dengan namespaceSelector untuk lintas namespace.
  • Protocol dan ports selalu berpasangan; range port memakai format 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.

Belajar Calico - Network Policy Dasar (NetworkPolicy) | Belajar Calico