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 bertindak sebagai firewall di lapisan 3 atau lapisan 4 dari model OSI. Mereka 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 beban kerja 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 Egress, 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=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
Konfigurasi
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, 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: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 Anda lakukan pada 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-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
Jalankan Pod sementara dengan label
app=foo
dan 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:8080
Pod merespons permintaan:
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
Validasi 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.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 berikutnya
- Dokumentasi Kebijakan Jaringan Kubernetes
- Gunakan logging kebijakan jaringan untuk mencatat kapan koneksi ke objek Pod diizinkan atau ditolak oleh kebijakan jaringan cluster Anda.