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:8080
Hello, 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:8080
wget: 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:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z
Validasi bahwa Pod tidak dapat membuat koneksi ke hello-web-2:8080
:
/ # wget -qO- --timeout=2 http://hello-web-2:8080
wget: download timed out
Validasi 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.com
wget: download timed out
/ # exit