Kubernetes Network Policy – Block Access

Jaringan pada Kubernetes

Jaringan pada Kubernetes sendiri memiliki spesifikasi layaknya virtual machine, yaitu seperti setiap pod yang mendapatkan alamat IP-nya sendiri; kontainer dalam pod berbagi alamat IP pod dan dapat berkomunikasi secara bebas satu sama lain; Pod dapat berkomunikasi dengan semua Pod lain dalam cluster menggunakan alamat IP Pod dan Dapat melakukan Isolasi atau membatasi dengan apa setiap pod dapat berkomunikasi yang didefinisikan menggunakan kebijakan jaringan.

Oleh karena itu, pod dapat diperlakukan layaknya VM atau host karena mereka semua memiliki alamat IP yang unik dan container di dalam pod dapat diperlakukan seperti proses yang berjalan dalam VM atau host yaitu mereka berjalan di namespace jaringan yang sama. Model ini memudahkan aplikasi untuk dimigrasikan dari VM dan host ke pod yang dikelola oleh Kubernetes. Selain itu, karena isolasi didefinisikan menggunakan kebijakan jaringan daripada struktur jaringan, jaringan tetap mudah dipahami. Gaya jaringan ini kadang-kadang disebut sebagai “jaringan flat.”

Kebijakan Jaringan pada Kubernetes

Kebijakan jaringan dalam kubernetes berfungsi layaknya firewall dimana berfungsi untuk mengatur lalu lintas data dalam Kubernetes. Kebijakan jaringan menggunakan konstruksi Kubernetes seperti pemilih label untuk menentukan pod mana yang dapat berbicara satu sama lain daripada menggunakan alamat IP. Anda dapat memikirkan kebijakan jaringan seperti firewall virtual. Ini diterapkan ke pod Anda secara real time.

Perlu diingatkan bahwa Kubernetes mendefinisikan kumpulan API kebijakan jaringan dan hanya menyimpannya. Plugin jaringan Anda menangani bagian implementasi. Kebijakan jaringan dikonfigurasi menggunakan manifes deklaratif dan, tentu saja, dapat disimpan dengan kode sumber Anda. Ini akan memungkinkan Anda untuk menerapkannya bersama dengan aplikasi Anda di Kubernetes.

Menyiapkan Namespace

Sebelum praktik tentang penggunaan kebijakan jaringan kita harus menyiapkan 2 buah namespace terlebih dahulu lalu nanti kita akan membuat pod sebagai pengetesanya. Oke pada kasus ini kita akan membuat namespace bernama nm1 dan nm2, untuk perintahnya kubectl create namespace nm1 dan kubectl create namespace nm2

Membuat Pod dan Service pada Namespace nm1

Untuk membuat pod pada namespace nm1 kita perlu membuat file bernama pod1.yml lalu isikan seperti dibawah 


apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: nm1
  labels:
    app: pod1
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

Simpan dan jalankan dengan perintah kubectl apply -f pod1.yml

Lalu kita buat service nya dengan cara membuat file service1.yml lalu isikan seperti dibawah 

apiVersion: v1
kind: Service
metadata:
  name: service1
  namespace: nm1
  labels:
    app: pod1
spec:
  ports:
  - port: 80
  selector:
    app: pod1

Simpan dan jalankan dengan perintah kubectl apply -f service1.yml

Verifikasi bahwa pod dan service telah di buat degan perintah kubectl get service,pod -n nm1

Oke pod dan service pada namespaces nm1 telah sukses kita buat.

Membuat Pod pada Namespace nm2

Oke pada namespace nm2 kita akan membuat Pod untuk pengetesanya, disini kita menggunakan kontainer busybox yang di mana didalamnya akan menjalankan perintah curl ke Pod yang kita buat pada namespace nm1. Sebelumnya kita harus mengecek service yang di buat pada namespace nm1 terlebih dahulu untuk perintahnya kubectl get svc -n nm1

Perhatikan diatas pada bagian ClusterIP, maka pada kontainer busybox kita akan memberikan command curl 10.104.127.70 lalu untuk membuatnya kita perlu membuat file baru bernama pod2.yml lalu isikan seperti dibawah


apiVersion: v1
kind: Pod
metadata:
  name: pod2
  namespace: nm2
spec:
  containers:
  - image: yauritux/busybox-curl
    command:  ["echo", "Ini adalah Test Job"]
    name: busybox

Simpan dan jalankan menggunakan perintah kubectl apply -f pod2.yml

Untuk memverifikasinya kita bisa mengecek log pada pod2 dengan perintah kubectl logs pod/pod2 -n nm2

Terlihat bukan, nginx dari pod1 bisa kita akses dari pod2 dengan berbeda namespace. Lalu langkah selanjutnya kita kan mencoba memblocking akses dari namespaces lain.

Membuat Kebijakan Jaringan pada Namespace nm1

Kali ini kita akan mencoba membuat blocking traffic ke pod1 yang berada pada namespace nm1, untuk membuatnya kita perlu membuat file bernama block1.yml lalu isikan seperti dibawah

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: block1
  namespace: nm1
spec:
  podSelector:
    matchLabels:
      app: pod1
  ingress: []

Simpan dan jalankan dengan perintah kubectl apply -f block1.yml

Untuk mengetesnya, hapus terlebih dahulu pod2 pada namespace nm2 dengan perintah kubectl delete pod/pod2 -n nm2

Lalu kita buat kembali pod2 dengan perintah kubectl apply -f pod2.yml

Lalu lihat kembali log pada pod2 dengan perintah kubectl logs pod/pod2 -n nm2

Oke sampai disini kita sudah berhasil melakukan block semua traffic pada pod1, selanjutnya kita akan mencoba melakukan blocking pada spesifik port dalam Pod jadi mungkin cukup sekian kali ini mohon maaf bila banyak kesalahan sekian dan terima kasih!

Write a comment