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 melakukan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Aktifkan Google Kubernetes Engine API
- Untuk menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi
gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah
gcloud components update. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
Persyaratan dan batasan
Resource FQDNNetworkPolicy memiliki persyaratan dan batasan berikut:
- 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.
- Cloud Service Mesh tidak didukung.
- Jika aplikasi Anda memiliki alamat IP hard code, gunakan kolom
IPBlockNetworkPolicyKubernetes, bukanFQDNNetworkPolicy. - Hasil yang ditampilkan oleh server nama DNS non-cluster seperti server nama alternatif di
resolv.conftidak dianggap valid untuk diprogram dalam daftar yang diizinkan dalam bidang data GKE. - Jumlah maksimum alamat IP IPv4 dan IPv6 yang dapat di-resolve oleh
FQDNNetworkPolicyadalah 50. - Anda tidak dapat mengizinkan traffic ke ClusterIP atau Service Headless sebagai tujuan egress di
FQDNNetworkPolicykarena GKE menerjemahkan alamat IP virtual (VIP) Service ke alamat IP Pod backend sebelum mengevaluasi aturan kebijakan jaringan. Sebagai gantinya, gunakanNetworkPolicyberbasis label Kubernetes. - Kuota maksimumnya adalah 100 alamat IP per nama host.
- Enkripsi transparan antar-node tidak didukung dengan Kebijakan Jaringan FQDN.
- Kebijakan jaringan FQDN yang menggunakan pencocokan pola hanya cocok dengan subdomain di tingkat yang sama dengan karakter pengganti. Misalnya,
pattern: *.company.comcocok denganapi.company.comataustore.company.com, tetapi tidak cocok denganeu.api.company.comataucompany.com.
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
Untuk cluster Autopilot dan Standard, update cluster menggunakan flag
--enable-fqdn-network-policy:gcloud container clusters update CLUSTER_NAME \ --enable-fqdn-network-policyGanti
CLUSTER_NAMEdengan nama cluster Anda.Khusus cluster Standard, mulai ulang DaemonSet
anetdGKE Dataplane V2:kubectl rollout restart ds -n kube-system anetd
Membuat FQDNNetworkPolicy
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: 443Manifes 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 darinameataupattern, 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 kolompattern. Anda harus menentukan salah satu darinameataupattern, atau keduanya.protocol: "TCP"danport: 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.
Pastikan kebijakan jaringan memilih workload Anda:
kubectl describe fqdnnpOutput-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 egress yang mengontrol endpoint mana yang dapat menerima traffic dari Pod yang dipilih. Serupa dengan NetworkPolicy Kubernetes, FQDNNetworkPolicy yang memilih workload akan membuat aturan penolakan implisit untuk
endpoint yang tidak ditentukan sebagai tujuan egress yang diizinkan. FQDNNetworkPolicies
dapat digunakan dengan NetworkPolicies Kubernetes seperti yang dijelaskan dalam FQDNNetworkPolicy
dan NetworkPolicy.
FQDNNetworkPolicies diterapkan di tingkat alamat IP dan port. Aturan ini tidak diterapkan menggunakan informasi protokol Lapisan 7 apa pun (misalnya, Request-URI dalam permintaan HTTP). Nama domain yang ditentukan diterjemahkan ke 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 egress 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 berumur panjang dengan durasi yang melampaui TTL data DNS tidak akan mengalami gangguan traffic, sedangkan koneksi 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 egress 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, melainkan
diekspos menggunakan alamat IP bersama. Hal ini sangat umum terjadi saat
aplikasi disajikan 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 di tingkat alamat IP dan port, kebijakan ini tidak dapat
membedakan antara beberapa domain yang dilayani 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 dilayani 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 dalam FQDNNetworkPolicy menyertakan domain yang memiliki CNAME
dalam data DNS, Anda harus mengonfigurasi FQDNNetworkPolicy dengan semua nama
domain yang dapat dikueri langsung oleh Pod, termasuk semua alias potensial, untuk memastikan perilaku FQDNNetworkPolicy
yang andal.
Jika Pod menjalankan kueri example.com, example.com adalah hal yang harus Anda tulis dalam aturan. Meskipun Anda mendapatkan kembali rantai alias dari server DNS upstream (misalnya, example.com ke example.cdn.com hingga 1.2.3.4), Kebijakan Jaringan FQDN akan tetap mengizinkan traffic Anda.
Langkah berikutnya
- Baca dokumentasi Kubernetes tentang kebijakan jaringan
- Gunakan insight keamanan guna menjelajahi cara lain untuk memperkuat infrastruktur Anda