Mengonfigurasi kebijakan jaringan

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.

  1. 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
    
  2. Konfigurasi NetworkPolicy untuk mengizinkan traffic ke Pod hello-web hanya dari objek Pod app=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 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
  3. Terapkan kebijakan ini ke cluster:

    kubectl apply -f hello-allow-from-foo.yaml
    

Memverifikasi kebijakan Ingress

  1. Jalankan Pod sementara dengan label app=foo. Untuk memverifikasi bahwa traffic masuk diizinkan, ajukan permintaan ke endpoint hello-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 Pod app=hello diaktifkan, outputnya akan terlihat seperti berikut:

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  2. 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:

  1. Objek Pod dalam Namespace yang sama dengan label app=hello
  2. Endpoint internal atau 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

Terapkan kebijakan ini ke cluster:

kubectl apply -f foo-allow-to-hello.yaml

Memvalidasi kebijakan Egress

  1. 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
    
  2. Jalankan Pod sementara dengan label app=foo dan validasi bahwa Pod dapat membuat koneksi ke hello-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
    
  3. 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
    
  4. 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