Mengonfigurasi kebijakan jaringan untuk aplikasi

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:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: hello-allow-from-foo
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: hello
  ingress:
  - from:
    - podSelector:
        matchLabels:
          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:

  1. Pod dalam namespace yang sama dengan label app=hello.
  2. Endpoint eksternal atau Pod Cluster di port 53 (UDP dan TCP).
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

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