Halaman ini menunjukkan cara menggunakan kebijakan jaringan cluster untuk mengontrol apakah Pod dapat menerima traffic jaringan masuk (atau Traffic Masuk), dan apakah Pod dapat mengirim traffic keluar (atau Traffic Keluar).
Dengan kebijakan jaringan, Anda dapat membatasi koneksi antar-objek Pod, sehingga Anda dapat mengurangi paparan serangan.
Kebijakan jaringan berfungsi sebagai firewall pada lapisan 3 atau lapisan 4 dari model OSI. Fitur tersebut 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 memberlakukan kebijakan. Anda dapat menentukan objek dan beban kerja Pod dengan label dan pemilih.
Jenis traffic yang terpengaruh oleh kebijakan jaringan: Traffic masuk untuk traffic masuk, Traffic keluar 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 dengan objek Pod yang ditentukan.
Contoh pembatasan traffic masuk
Bagian ini menunjukkan pembuatan batasan traffic masuk pada aplikasi contoh. Ubah contoh ini agar sesuai dengan lingkungan aplikasi Anda.
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
Konfigurasikan
NetworkPolicy
untuk mengizinkan traffic ke Podhello-web
hanya 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=hello
dan 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, buat 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:8080
Jika traffic dari Pod
app=foo
ke objek Podapp=hello
diaktifkan, outputnya akan terlihat seperti berikut:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
Jalankan 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:8080
Output mengonfirmasi bahwa koneksi tidak menerima respons:
wget: download timed out
Membatasi traffic keluar dari objek Pod
Anda dapat membatasi traffic keluar seperti yang dilakukan terhadap traffic masuk.
Namun, untuk mengkueri nama host internal seperti hello-web
atau nama host eksternal seperti www.example.com
, Anda harus membuat kebijakan Keluar yang mengizinkan traffic DNS pada port 53 menggunakan protokol TCP dan UDP.
Untuk mengaktifkan kebijakan jaringan Keluar, deploy NetworkPolicy
yang mengontrol traffic keluar dari objek Pod dengan label app=foo
, sekaligus mengizinkan traffic hanya ke objek Pod dengan label app=hello
, serta traffic DNS.
Manifes berikut menentukan NetworkPolicy
yang mengontrol Traffic keluar dari objek Pod dengan label app=foo
dengan dua tujuan yang diizinkan:
- Objek pod di 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 Traffic Keluar
Deploy aplikasi web baru bernama
hello-web-2
dan ekspos aplikasi tersebut 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
Jalankan Pod sementara dengan label
app=foo
dan validasi bahwa Pod dapat menghubungkan kehello-web:8080
:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080
Pod merespons permintaan tersebut:
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
Validasi 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:8080
Output mengonfirmasi bahwa koneksi tidak menerima respons:
wget: download timed out
Pastikan 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.com
Output 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 selanjutnya
- Dokumentasi Kebijakan Jaringan Kubernetes
- Gunakan logging kebijakan jaringan untuk merekam kapan koneksi ke objek Pod diizinkan atau ditolak oleh kebijakan jaringan cluster Anda.