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 kebijakan tersebut tidak menawarkan fitur tingkat yang lebih tinggi seperti otorisasi atau transpor aman (seperti SSL/TLS).

Tujuan

Dalam tutorial ini, Anda akan mempelajari:

  • Cara membuat cluster dengan penegakan Kebijakan Jaringan
  • Cara membatasi traffic masuk ke Pod menggunakan label
  • Cara membatasi traffic keluar dari Pod menggunakan label

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Lakukan langkah-langkah berikut untuk mengaktifkan Kubernetes Engine API:
  1. Buka halaman Kubernetes Engine di Konsol Google Cloud.
  2. Buat atau pilih project.
  3. Tunggu hingga API dan layanan terkait diaktifkan. Proses ini dapat memerlukan waktu beberapa menit.
  4. Make sure that billing is enabled for your Google Cloud project.

Instal alat command line berikut yang digunakan dalam tutorial ini:

  • gcloud digunakan untuk membuat dan menghapus cluster Kubernetes Engine. gcloud disertakan dalam gcloud CLI.
  • kubectl digunakan untuk mengelola Kubernetes, sistem orkestrasi cluster yang digunakan oleh Kubernetes Engine. Anda dapat menginstal kubectl menggunakan gcloud:
    gcloud components install kubectl

Clone kode contoh dari GitHub:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/networking/network-policies

Menetapkan default untuk alat command line gcloud

Untuk menghemat waktu saat mengetik opsi project ID dan Zona Compute Engine di alat command line gcloud, Anda dapat menetapkan setelan default:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

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 menjadi sasaran 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, konfigurasikan 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 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 karenanya waktu permintaan 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. Pod Cluster atau endpoint eksternal 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 penampung:

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 terhubung ke hello-web-2:8080:

/ # wget -qO- --timeout=2 http://hello-web-2:8080
wget: download timed out

Validasi bahwa Pod tidak dapat terhubung ke situs eksternal seperti www.example.com, dan keluar dari shell Pod.

/ # wget -qO- --timeout=2 http://www.example.com
wget: download timed out
/ # exit

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

  1. Menghapus cluster container: Langkah ini akan menghapus resource yang membentuk cluster container, seperti instance komputasi, disk, dan resource jaringan.

    gcloud container clusters delete test

Langkah berikutnya