Mengontrol traffic keluar Pod menggunakan kebijakan jaringan FQDN


Halaman ini menjelaskan cara mengontrol komunikasi traffic keluar antara Pod dan resource di luar cluster Google Kubernetes Engine (GKE) menggunakan nama domain yang sepenuhnya memenuhi syarat (FQDN). Resource kustom yang Anda gunakan untuk mengonfigurasi FQDN adalah resource FQDNNetworkPolicy.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Persyaratan dan batasan

Resource FQDNNetworkPolicy memiliki persyaratan dan batasan berikut:

  • Anda harus memiliki cluster GKE yang menjalankan salah satu versi berikut:
    • 1.26.4-gke.500 atau yang lebih baru
    • 1.27.1-gke.400 atau yang lebih baru
  • Cluster Anda harus menggunakan GKE Dataplane V2.
  • Anda harus menggunakan salah satu penyedia DNS di cluster GKE, kube-dns, atau Cloud DNS. Deployment kube-dns kustom atau Core DNS tidak didukung.
  • Google Cloud CLI versi 462.0.0 atau yang lebih baru.
  • Node pool Windows tidak didukung.
  • Anthos Service Mesh tidak didukung.
  • Jika aplikasi Anda memiliki alamat IP yang di-hard code, gunakan kolom IPBlock pada Kubernetes NetworkPolicy, bukan FQDNNetworkPolicy.
  • Hasil yang ditampilkan oleh server nama DNS non-cluster seperti server nama alternatif di resolv.conf tidak dianggap valid untuk diprogram dalam daftar yang diizinkan di bidang data GKE.
  • Jumlah maksimum alamat IP IPv4 dan IPv6 yang dapat diselesaikan FQDNNetworkPolicy adalah 50.
  • Anda tidak dapat mengizinkan traffic ke ClusterIP atau Layanan Headless sebagai tujuan traffic keluar di FQDNNetworkPolicy karena GKE menerjemahkan Alamat IP virtual (VIP) Layanan ke alamat IP Pod backend sebelum mengevaluasi aturan kebijakan jaringan. Sebagai gantinya, gunakan NetworkPolicy berbasis label Kubernetes.
  • Kuota maksimumnya adalah 100 alamat IP per nama host.
  • Enkripsi transparan antar-node tidak didukung dengan Kebijakan Jaringan FQDN.

Mengaktifkan Kebijakan Jaringan FQDN

Anda dapat mengaktifkan Kebijakan Jaringan FQDN pada cluster baru atau lama.

Mengaktifkan Kebijakan Jaringan FQDN di cluster baru

Buat cluster menggunakan flag --enable-fqdn-network-policy:

gcloud container clusters create CLUSTER_NAME  \
    --enable-fqdn-network-policy

Ganti CLUSTER_NAME dengan nama cluster Anda.

Mengaktifkan Kebijakan Jaringan FQDN di cluster lama

  1. Untuk cluster Autopilot dan Standard, update cluster menggunakan flag --enable-fqdn-network-policy:

    gcloud container clusters update CLUSTER_NAME  \
        --enable-fqdn-network-policy
    

    Ganti CLUSTER_NAME dengan nama cluster Anda.

  2. Khusus cluster Standard, mulai ulang DaemonSet anetd GKE Dataplane V2:

    kubectl rollout restart ds -n kube-system anetd
    

Membuat FQDNNetworkPolicy

  1. Simpan manifes berikut sebagai fqdn-network-policy.yaml:

    apiVersion: networking.gke.io/v1alpha1
    kind: FQDNNetworkPolicy
    metadata:
      name: allow-out-fqdnnp
    spec:
      podSelector:
        matchLabels:
          app: curl-client
      egress:
      - matches:
        - pattern: "*.yourdomain.com"
        - name: "www.google.com"
        ports:
        - protocol: "TCP"
          port: 443
    

    Manifes ini memiliki properti berikut:

    • name: www.google.com: nama domain yang sepenuhnya memenuhi syarat. Alamat IP yang disediakan oleh server nama yang terkait dengan www.google.com diizinkan. Anda harus menentukan salah satu dari name atau pattern, atau keduanya.
    • pattern: "*.yourdomain.com": Alamat IP yang disediakan oleh server nama yang cocok dengan pola ini diizinkan. Anda dapat menggunakan ekspresi reguler berikut untuk kunci pola: ^([a-zA-Z0-9*]([-a-zA-Z0-9_*]*[a-zA-Z0-9*])*\.?)*$. Kriteria kecocokan bersifat tambahan. Anda dapat menggunakan beberapa kolom pattern. Anda harus menentukan salah satu dari name atau pattern, atau keduanya.
    • protocol: "TCP" dan port: 443: menentukan protokol dan port. Jika Pod mencoba membuat koneksi ke alamat IP menggunakan kombinasi protokol dan port ini, resolusi namanya akan berfungsi, tetapi bidang data akan memblokir koneksi keluar. Kolom ini bersifat opsional.
  2. Pastikan kebijakan jaringan memilih workload Anda:

    kubectl describe fqdnnp
    

    Output-nya mirip dengan berikut ini:

    Name:         allow-out-fqdnnp
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1alpha1
    Kind:         FQDNNetworkPolicy
    Metadata:
    ...
    Spec:
      Egress:
        Matches:
          Pattern:  *.yourdomain.com
          Name:     www.google.com
        Ports:
          Port:      443
          Protocol:  TCP
      Pod Selector:
        Match Labels:
          App: curl-client
    Events:     <none>
    

Menghapus FQDNNetworkPolicy

Anda dapat menghapus FQDNNetworkPolicy menggunakan perintah kubectl delete fqdnnp:

kubectl delete fqdnnp FQDN_POLICY_NAME

Ganti FQDN_POLICY_NAME dengan nama FQDNNetworkPolicy Anda.

GKE menghapus aturan dari penegakan kebijakan, tetapi koneksi yang ada akan tetap aktif hingga ditutup dengan mengikuti panduan protokol standar conntrack.

Cara kerja kebijakan jaringan FQDN

FQDNNetworkPolicies adalah kebijakan khusus traffic keluar yang mengontrol endpoint yang dapat dikirimi traffic oleh Pod yang dipilih. Serupa dengan Kubernetes NetworkPolicy, FQDNNetworkPolicy yang memilih beban kerja akan membuat aturan penolakan implisit ke endpoint yang tidak ditentukan sebagai tujuan keluar yang diizinkan. FQDNNetworkPolicies dapat digunakan dengan Kubernetes NetworkPolicies seperti yang dijelaskan dalam FQDNNetworkPolicy dan NetworkPolicy.

FQDNNetworkPolicies diterapkan pada alamat IP dan tingkat port. Aturan tersebut tidak diterapkan menggunakan informasi protokol Lapisan 7 apa pun (misalnya, Request-URI dalam permintaan HTTP). Nama domain yang ditentukan diterjemahkan menjadi alamat IP menggunakan informasi DNS yang diberikan oleh penyedia DNS cluster GKE.

Permintaan DNS

FQDNNetworkPolicy aktif yang memilih workload tidak memengaruhi kemampuan workload untuk membuat permintaan DNS. Perintah seperti nslookup atau dig berfungsi di domain apa pun tanpa terpengaruh oleh kebijakan. Namun, permintaan berikutnya ke alamat IP yang mendukung domain yang tidak termasuk dalam akun yang diizinkan akan dihapus.

Misalnya, jika FQDNNetworkPolicy mengizinkan traffic keluar ke www.github.com, permintaan DNS untuk semua domain akan diizinkan, tetapi traffic yang dikirim ke alamat IP yang mendukung twitter.com akan dihapus.

Masa berlaku TTL

FQDNNetworkPolicy mengikuti TTL yang diberikan oleh data DNS. Jika Pod mencoba menghubungi alamat IP yang habis masa berlakunya setelah TTL data DNS berlalu, koneksi baru akan ditolak. Koneksi berdurasi panjang yang durasinya melebihi TTL data DNS tidak akan mengalami gangguan traffic, meskipun koneksi tersebut dianggap masih aktif.

FQDNNetworkPolicy dan NetworkPolicy

Saat FQDNNetworkPolicy dan NetworkPolicy diterapkan ke Pod yang sama, artinya label Pod cocok dengan yang dikonfigurasi di kebijakan, traffic keluar diizinkan selama cocok dengan salah satu kebijakan singkat ini. Tidak ada hierarki antara NetworkPolicies traffic keluar yang menentukan alamat IP atau pemilih label dan FQDNNetworkPolicies.

Endpoint Alamat IP Bersama (Load Balancer, CDN, Gateway VPN, dll.)

Banyak domain tidak memiliki alamat IP khusus yang mendukungnya dan justru terekspos menggunakan alamat IP bersama. Hal ini sangat umum terjadi jika aplikasi disalurkan oleh Load Balancer atau CDN. Misalnya, Google Cloud API (compute.googleapis.com, container.googleapis.com, dll.) tidak memiliki alamat IP unik untuk setiap API. Sebagai gantinya, semua API diekspos menggunakan rentang bersama.

Saat mengonfigurasi FQDNNetworkPolicies, penting untuk mempertimbangkan apakah domain yang diizinkan menggunakan alamat IP khusus atau alamat IP bersama. Karena FQDNNetworkPolicies diterapkan pada tingkat alamat IP dan port, keduanya tidak dapat membedakan antara beberapa domain yang disalurkan oleh alamat IP yang sama. Mengizinkan akses ke domain yang didukung oleh alamat IP bersama akan memungkinkan Pod Anda berkomunikasi dengan semua domain lain yang disalurkan oleh alamat IP tersebut. Misalnya, mengizinkan traffic ke compute.googleapis.com juga akan memungkinkan Pod berkomunikasi dengan API Google Cloud lainnya.

Mencari CNAME

Jika objek FQDN di FQDNNetworkPolicy menyertakan domain yang memiliki CNAME dalam data DNS, Anda harus mengonfigurasi FQDNNetworkPolicy dengan semua nama domain yang dapat dikueri secara langsung oleh Pod, termasuk semua alias potensial, untuk memastikan perilaku FQDNNetworkPolicy yang andal.

Jika Pod Anda menjalankan kueri example.com, maka example.com adalah kode yang harus Anda tulis dalam aturan. Meskipun Anda mendapatkan kembali rantai alias dari server DNS upstream (misalnya, example.com ke example.cdn.com ke 1.2.3.4), Kebijakan Jaringan FQDN akan tetap mengizinkan traffic Anda masuk.

Masalah Umum

Bagian ini mencantumkan semua masalah umum untuk nama domain yang sepenuhnya memenuhi syarat (FQDN).

Menentukan protocol: ALL akan menyebabkan kebijakan diabaikan

Masalah umum ini telah diperbaiki untuk GKE versi 1.27.10-gke.1055000+ dan 1.28.3-gke.1055000+

Jika Anda membuat FQDNNetworkPolicy yang menentukan protocol: ALL di bagian ports, GKE tidak akan menerapkan kebijakan tersebut. Masalah ini terjadi karena ada masalah saat menguraikan kebijakan. Menentukan TCP atau UDP tidak menyebabkan masalah ini.

Sebagai solusinya, jika Anda tidak menentukan protocol dalam entri ports, aturannya akan cocok dengan semua protokol secara default. Menghapus protocol: ALL akan mengabaikan masalah penguraian dan GKE akan menerapkan FQDNNetworkPolicy.

Pada GKE versi 1.27.10-gke.1055000+ dan 1.28.3-gke.1055000+, kebijakan dengan protocol: ALL diuraikan dan diterapkan dengan benar.

NetworkPolicy Logging menyebabkan log yang salah atau tidak ada

Masalah umum ini telah diperbaiki untuk GKE versi 1.27.10-gke.1055000+ dan 1.28.2-gke.1157000+

Jika cluster menggunakan Logging Kebijakan Jaringan dan kebijakan jaringan FQDN, ada bug yang dapat menyebabkan entri log tidak ada atau salah.

Saat menggunakan logging kebijakan jaringan tanpa delegasi, log kebijakan untuk koneksi DNS yang keluar dari beban kerja secara keliru mengklaim bahwa traffic telah dihapus. Traffic itu sendiri diizinkan (per FQDNNetworkPolicy), tetapi log tidak benar.

Saat menggunakan logging kebijakan jaringan dengan delegasi, log kebijakan tidak ada. Traffic itu sendiri tidak terpengaruh.

Pada GKE versi 1.27.10-gke.105500+ dan 1.28.2-gke.1157000+, bug ini telah diperbaiki. Koneksi DNS kini akan dicatat dengan benar sebagai ALLOWED, saat traffic dipilih oleh NetworkPolicy atau FQDNNetworkPolicy.

Langkah selanjutnya