Halaman ini menunjukkan cara menggunakan kebijakan jaringan cluster untuk mengontrol apakah Pod dapat menerima traffic jaringan masuk (atau Ingress), dan apakah Pod dapat mengirim traffic keluar (atau Egress).
Kebijakan jaringan memungkinkan Anda membatasi koneksi antar-objek Pod, sehingga Anda dapat mengurangi risiko serangan.
Kebijakan jaringan berfungsi sebagai firewall di lapisan 3 atau lapisan 4 dari model OSI. Elemen ini tidak menawarkan fitur tambahan seperti otorisasi atau enkripsi.
Membatasi traffic masuk ke objek Pod
Objek NetworkPolicy
memungkinkan Anda mengonfigurasi kebijakan akses jaringan untuk Pod. Objek NetworkPolicy
berisi informasi berikut:
Objek pod yang menerapkan kebijakan. Anda menentukan objek dan workload Pod dengan label dan pemilih.
Jenis traffic yang terpengaruh oleh kebijakan jaringan: Ingress untuk traffic masuk, Egress untuk traffic keluar, atau keduanya.
Untuk kebijakan Ingress, objek Pod mana yang dapat terhubung ke objek Pod yang ditentukan.
Untuk kebijakan Keluar, objek Pod yang dapat dihubungkan oleh objek Pod yang ditentukan.
Contoh pembatasan traffic masuk
Bagian ini menunjukkan pembuatan pembatasan traffic masuk pada aplikasi contoh. Ubah contoh ini agar sesuai dengan lingkungan aplikasi Anda sendiri.
Jalankan aplikasi server web dengan label
app=hellodan 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 --exposeKonfigurasi
NetworkPolicyuntuk mengizinkan traffic ke Podhello-webhanya dari objek Podapp=foo. GKE di AWS memblokir traffic masuk dari objek Pod yang tidak memiliki label ini, serta traffic eksternal, dan traffic dari objek Pod di Namespace yang berbeda.Manifes berikut memilih objek Pod dengan label
app=hellodan menentukan kebijakan Ingress untuk mengizinkan traffic hanya dari objek Pod dengan labelapp=foo:Terapkan kebijakan ini ke cluster:
kubectl apply -f hello-allow-from-foo.yaml
Memverifikasi kebijakan Ingress
Jalankan Pod sementara dengan label
app=foo. Untuk memverifikasi bahwa traffic masuk diizinkan, ajukan permintaan ke endpointhello-web:8080:kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Jika traffic dari Pod
app=fooke objek Podapp=hellodiaktifkan, outputnya akan terlihat seperti berikut:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zJalankan Pod sementara dengan label yang berbeda (
app=other) dan buat permintaan yang sama untuk mengamati bahwa traffic tidak diizinkan:kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \ -- wget -qO- --timeout=2 http://hello-web:8080Output mengonfirmasi bahwa koneksi tidak menerima respons:
wget: download timed out
Membatasi traffic keluar dari objek Pod
Anda dapat membatasi traffic keluar seperti halnya traffic masuk.
Namun, untuk membuat kueri nama host internal seperti hello-web atau nama host eksternal
seperti www.example.com, Anda harus membuat kebijakan Egress yang mengizinkan
traffic DNS di port 53 menggunakan protokol TCP dan UDP.
Untuk mengaktifkan kebijakan jaringan Egress, deploy NetworkPolicy yang mengontrol traffic
keluar dari objek Pod dengan label app=foo, dan hanya mengizinkan traffic ke
objek Pod dengan label app=hello, serta traffic DNS.
Manifes berikut menentukan NetworkPolicy yang mengontrol traffic Egress
dari objek Pod dengan label app=foo dengan dua tujuan yang diizinkan:
- Objek Pod dalam Namespace yang sama dengan label
app=hello - Endpoint internal atau eksternal di port 53 (UDP dan TCP)
Terapkan kebijakan ini ke cluster:
kubectl apply -f foo-allow-to-hello.yaml
Memvalidasi kebijakan Egress
Deploy aplikasi web baru bernama
hello-web-2dan 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 --exposeJalankan Pod sementara dengan label
app=foodan validasi bahwa Pod dapat membuat koneksi kehello-web:8080:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Pod merespons permintaan:
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zValidasi bahwa Pod tidak dapat terhubung ke
hello-web-2:8080:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web-2:8080Output mengonfirmasi bahwa koneksi tidak menerima respons:
wget: download timed outValidasi bahwa Pod tidak dapat terhubung ke situs eksternal seperti
www.example.com.kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.comOutput mengonfirmasi bahwa koneksi tidak menerima respons:
wget: download timed out
Pembersihan
Untuk menghapus resource yang Anda buat dalam tutorial ini, jalankan perintah berikut:
kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml
Langkah berikutnya
- Dokumentasi Kebijakan Jaringan Kubernetes
- Gunakan logging kebijakan jaringan untuk mencatat kapan koneksi ke objek Pod diizinkan atau ditolak oleh kebijakan jaringan cluster Anda.