Tutorial ini menunjukkan cara menggunakan kebijakan jaringan cluster untuk mengontrol Pod mana yang menerima traffic jaringan masuk, dan Pod mana yang dapat mengirim traffic keluar. Untuk mengetahui informasi selengkapnya, silakan melihat Membuat kebijakan jaringan cluster.
Kebijakan jaringan memungkinkan Anda membatasi koneksi antar-Pod. Oleh karena itu, menggunakan kebijakan jaringan memberikan keamanan yang lebih baik dengan mengurangi cakupan pelanggaran keamanan.
Perhatikan bahwa kebijakan jaringan menentukan apakah koneksi diizinkan, dan tidak menawarkan fitur tingkat yang lebih tinggi seperti otorisasi atau transportasi yang aman (seperti SSL/TLS).
Membuat cluster GKE dengan penegakan kebijakan jaringan
Untuk membuat cluster container dengan penegakan kebijakan jaringan, jalankan perintah berikut:
gcloud container clusters create test --enable-network-policy
Membatasi traffic masuk ke Pod
Resource NetworkPolicy Kubernetes memungkinkan Anda mengonfigurasi kebijakan akses jaringan
untuk Pod. Objek NetworkPolicy berisi informasi berikut:
Pod yang menerapkan kebijakan jaringan, biasanya ditetapkan oleh pemilih label
Jenis traffic yang terpengaruh oleh kebijakan jaringan: Traffic Ingress untuk traffic masuk, Traffic Keluar untuk traffic keluar, atau keduanya
Untuk kebijakan Ingress, Pod mana yang dapat terhubung ke Pod yang ditentukan
Untuk kebijakan Keluar, Pod tempat Pod yang ditetapkan dapat dihubungkan
Pertama, jalankan aplikasi server web dengan label app=hello dan ekspos secara internal di cluster:
kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
Selanjutnya, konfigurasi NetworkPolicy untuk mengizinkan traffic ke Pod hello-web
hanya dari Pod app=foo. Traffic masuk lainnya dari Pod yang tidak memiliki label ini, traffic eksternal, dan traffic dari Pod di namespace lain akan diblokir.
Manifes berikut memilih Pod dengan label app=hello dan menentukan
kebijakan Ingress untuk mengizinkan traffic hanya dari Pod dengan label app=foo:
Untuk menerapkan kebijakan ini ke cluster, jalankan perintah berikut:
kubectl apply -f hello-allow-from-foo.yaml
Memvalidasi kebijakan Ingress
Pertama, jalankan Pod sementara dengan label app=foo dan dapatkan shell di Pod:
kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t test-1
Ajukan permintaan ke endpoint hello-web:8080 untuk memverifikasi bahwa traffic
masuk diizinkan:
/ # wget -qO- --timeout=2 http://hello-web:8080Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z / # exit
Traffic dari app=foo Pod ke Pod app=hello diaktifkan.
Selanjutnya, jalankan Pod sementara dengan label yang berbeda (app=other) dan dapatkan shell di dalam Pod:
kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1
Buat permintaan yang sama untuk mengamati bahwa traffic tidak diizinkan dan oleh karena itu permintaan akan mencapai waktu tunggu habis, lalu keluar dari shell Pod:
/ # wget -qO- --timeout=2 http://hello-web:8080wget: download timed out / # exit
Membatasi traffic keluar dari Pod
Anda dapat membatasi traffic keluar seperti yang Anda lakukan untuk traffic masuk.
Namun, untuk dapat membuat kueri nama host internal seperti hello-web atau nama host
eksternal seperti www.example.com, Anda harus mengizinkan resolusi DNS (Domain Name System)
dalam kebijakan jaringan egress. Traffic DNS terjadi di port 53, menggunakan protokol TCP dan UDP.
Untuk mengaktifkan kebijakan jaringan keluar, deploy NetworkPolicy yang mengontrol
traffic keluar dari Pod dengan label app=foo, dan hanya mengizinkan traffic
ke Pod dengan label app=hello, serta traffic DNS.
Manifes berikut menentukan kebijakan jaringan yang mengontrol traffic keluar
dari Pod dengan label app=foo dengan dua tujuan yang diizinkan:
- Pod dalam namespace yang sama dengan label
app=hello. - Endpoint eksternal atau Pod Cluster di port 53 (UDP dan TCP).
Untuk menerapkan kebijakan ini ke cluster, jalankan perintah berikut:
kubectl apply -f foo-allow-to-hello.yaml
Validasi kebijakan egress
Pertama, deploy aplikasi web baru bernama hello-web-2 dan ekspos secara internal di cluster:
kubectl run hello-web-2 --labels app=hello-2 \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
Selanjutnya, jalankan Pod sementara dengan label app=foo dan buka shell di dalam
container:
kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never test-3
Validasi bahwa Pod dapat terhubung ke hello-web:8080:
/ # wget -qO- --timeout=2 http://hello-web:8080Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6zValidasi bahwa Pod tidak dapat membuat koneksi ke hello-web-2:8080:
/ # wget -qO- --timeout=2 http://hello-web-2:8080wget: download timed outValidasi bahwa Pod tidak dapat membuat koneksi ke situs eksternal seperti www.example.com, lalu keluar dari shell Pod.
/ # wget -qO- --timeout=2 http://www.example.comwget: download timed out
/ # exit