
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!