Memecahkan masalah Cloud NAT

Panduan ini membantu Anda mendiagnosis alasan workload (Pod atau VM) Anda tidak dapat mengakses jaringan eksternal menggunakan Cloud NAT. Sebagai developer, Anda terutama berinteraksi dengan resource CloudNatGateway. Status resource ini adalah sumber tepercaya utama Anda untuk proses debug.

Sebelum memulai

Untuk memecahkan masalah konfigurasi Cloud NAT, Anda harus memiliki hal berikut:

  • Peran identitas dan akses yang diperlukan. Minta Admin Project IAM Anda untuk memberi Anda salah satu atau kedua peran berikut:
    • Cloud NAT Viewer (cloud-nat-viewer): Peran ini menawarkan akses hanya baca ke resource Cloud NAT. Peran ini membantu Anda mulai mendiagnosis masalah.
    • Cloud NAT Developer (cloud-nat-developer): Peran ini memberikan izin yang diperlukan bagi operator aplikasi untuk Membuat, Membaca, Memperbarui, dan Menghapus (CRUD) objek Cloud NAT dalam project yang ditetapkan kepada mereka. Peran ini memungkinkan Anda melakukan banyak perbaikan yang dijelaskan di halaman ini.
    • Peran tambahan mungkin diperlukan untuk beberapa tindakan diagnostik dan perbaikan tertentu.

Diagnostik awal

Sebelum mempelajari kode error, pastikan resource dasar ada dan dapat dijangkau.

Perintah:

kubectl get cloudnatgateway GATEWAY_NAME -n PROJECT_NAMESPACE -o yaml

Ganti kode berikut:

  • GATEWAY_NAME: Nama resource CloudNatGateway.
  • PROJECT_NAMESPACE: Namespace project Anda.

Periksa Kondisi Status: Gateway yang responsif harus memiliki semua kondisi berikut yang ditetapkan ke True:

  • Ready: Status kesehatan global.
  • SubnetsReady: Konfigurasi kumpulan IP valid.
  • PerimeterConfigurationReady: Infrastruktur jaringan upstream dikonfigurasi.
  • EgressRoutesReady: Kebijakan perutean untuk pod Anda aktif.

Jika salah satunya adalah False, periksa kolom reason dan message dalam output status dan lihat tabel di bagian berikut.

Referensi dan perbaikan kode error

Kode error yang ditampilkan oleh kubectl get cloudnatgateway termasuk dalam tiga kategori utama.

Error subnet (SubnetsReady adalah False)

Kondisi ini menunjukkan masalah pada kumpulan alamat IP yang ditetapkan ke gateway.

Kode Error Artinya Langkah-Langkah Perbaikan
CloudNATSelectorFieldOverlapsCode Konflik Konfigurasi. workloadSelector gateway ini cocok dengan workload yang sama dengan gateway lain di project Anda. Traffic tidak dapat dirutekan secara deterministik.
  1. Cantumkan semua gateway Cloud NAT di project Anda: kubectl get cloudnatgateway
  2. Bandingkan workloadSelector gateway ini dengan gateway lainnya.
  3. Ubah label sehingga tidak ada satu Pod/VM yang dipilih oleh lebih dari satu gateway.
CloudNATSubnetRefsFieldInvalidCode

Subnet Tidak Valid. Subnet yang ditentukan di subnetRefs tidak dapat digunakan. Alasan umum:

  • Subnet tidak ada.
  • Subnet tidak dalam status Ready.
  • Subnet bukan jenis Leaf.
  1. Pastikan subnet ada: kubectl get subnet <SUBNET_NAME>
  2. Periksa apakah status subnet adalah Ready.
  3. Pastikan subnet type adalah Leaf (Cloud NAT tidak dapat menggunakan subnet Root atau Loopback).
CloudNATSubnetAlreadyInUseCode Konflik Subnet. Subnet yang Anda minta sudah "dimiliki" oleh gateway Cloud NAT lain. Subnet hanya dapat dipasang ke satu gateway dalam satu waktu.
  1. Pilih subnet lain untuk gateway ini.
  2. Atau, hapus subnet dari gateway lain terlebih dahulu.
UNETAPIServerErrorCode Error Sistem. Pengontrol tidak dapat berkomunikasi dengan server API untuk memvalidasi subnet. Tindakan: Masalah ini kemungkinan bersifat sementara. Jika masalah berlanjut, hubungi Administrator Platform Anda.

Error konfigurasi perimeter (PerimeterConfigurationReady adalah False)

Kondisi ini mencerminkan status gateway perimeter.

Kode Error Artinya Langkah-Langkah Perbaikan
NET-E0305 Konflik Konfigurasi. (Sama seperti di atas). Pemilih yang tumpang-tindih mencegah sistem menghitung grup pemilihan rute yang benar.
  1. Cantumkan semua gateway Cloud NAT di project Anda: kubectl get cloudnatgateway
  2. Bandingkan workloadSelector gateway ini dengan gateway lainnya.
  3. Ubah label sehingga tidak ada satu Pod/VM yang dipilih oleh lebih dari satu gateway.
NET-E0301 Resource Habis / Kegagalan Node. Sistem telah membuat konfigurasi, tetapi tidak dapat menetapkan IP egress Anda ke node fisik yang responsif. Hal ini biasanya berarti subnet kehabisan IP atau node gateway tidak aktif.
  1. Periksa penggunaan [Subnet](/distributed-cloud/hosted/docs/latest/gdcag/platform/pa-user/subnets-overview) Anda. Apakah penuh?
  2. Jika Subnet memiliki IP gratis dan berstatus Ready, hal ini menunjukkan kegagalan infrastruktur sisi platform (misalnya, tidak ada node gateway responsif yang tersedia). Tindakan: Hubungi Administrator Platform.
NET-E0001 Error Sistem. Kegagalan komunikasi pengontrol. Tindakan: Hubungi Administrator Platform.

Error rute egress (EgressRoutesReady adalah False)

Kondisi ini mencerminkan status kebijakan perutean di dalam cluster.

Kode Error Artinya Langkah-Langkah Perbaikan
NET-E0305 Konflik Konfigurasi. (Sama seperti di atas).
  1. Cantumkan semua gateway Cloud NAT di project Anda: kubectl get cloudnatgateway
  2. Bandingkan workloadSelector gateway ini dengan gateway lainnya.
  3. Ubah label sehingga tidak ada satu Pod/VM yang dipilih oleh lebih dari satu gateway.
NET-E0304 Kegagalan Pemrograman. Sistem gagal memprogram aturan pemilihan rute (BPF) untuk IP gateway spesifik Anda.

Tindakan: Ini adalah error pemrograman internal atau inkonsistensi status.

  1. Coba buat update kecil pada Gateway (misalnya, edit label) untuk memicu rekonsiliasi.
  2. Jika masalah berlanjut, hubungi Administrator Platform.

Masalah umum lainnya

Jika status Gateway adalah Ready: True, tetapi traffic masih gagal, periksa kesalahan konfigurasi umum berikut:

Izin level project tidak ada

Project Anda harus diizinkan secara eksplisit untuk melakukan egress traffic.

  • Periksa: Apakah resource Project Anda memiliki label networking.gdc.goog/enable-default-egress-allow-to-outside-the-org: "true"?
  • Perbaikan: Minta Admin Project Anda untuk menerapkan label ini.

Anotasi VM tidak ada (Khusus Virtual Machine)

VM mengabaikan jalur egress Pod standar dan memerlukan petunjuk eksplisit untuk menggunakan Cloud NAT.

  • Periksa: Apakah objek VirtualMachineExternalAccess (VMEA) untuk VM Anda memiliki anotasi egress.networking.gke.io/use-cloud-nat: "true"?
  • Perbaikan: Tambahkan anotasi ke objek VMEA.

Egress node cluster standar

Jika Anda menjalankan Cluster Standard, node itu sendiri memerlukan izin untuk egress.

  • Periksa: Apakah objek Cluster memiliki label cluster.gdc.goog/enable-node-egress-to-outside-the-org: "true"?
  • Perbaikan: Minta Admin Platform Anda untuk memberi label pada objek Cluster.

Tabrakan NAT Keluar Default versus Cloud NAT

Error konfigurasi umum terjadi saat workload dikonfigurasi untuk menggunakan mekanisme NAT Egress Default lama, sekaligus dipilih oleh Gateway Cloud NAT. Kombinasi ini menghasilkan tabrakan saat bidang data menerima petunjuk perutean yang bertentangan, sehingga menyebabkan paket hilang atau perilaku perutean non-deterministik.

Mendiagnosis tabrakan Pod

Untuk Pod, NAT Egress Default biasanya diaktifkan dengan menambahkan label tertentu. Pod tidak boleh memiliki label ini sekaligus ditargetkan oleh Gateway Cloud NAT.

  1. Mengidentifikasi Pod Target: Dapatkan label Pod yang mengalami masalah konektivitas.

    kubectl get pod <POD_NAME> -n <NAMESPACE> --show-labels
    
  2. Periksa Label yang Bertentangan:

    • Pemilihan Cloud NAT: Apakah label Pod cocok dengan workloadSelector dari CloudNatGateway mana pun di namespace?
    • Label Egress Default: Apakah Pod memiliki label egress.networking.gke.io/enabled: "true"?

    Kondisi: Jika KEDUANYA benar, Anda mengalami tabrakan.

  3. Penyelesaian: Hapus label egress default lama dari Pod (atau Deployment/StatefulSet induknya) agar Cloud NAT dapat mengambil alih kontrol eksklusif.

Mendiagnosis tabrakan VM

Untuk Virtual Machine, mekanismenya berbeda. VM dengan objek VirtualMachineExternalAccess (VMEA) sering kali dikonfigurasi untuk akses default. Untuk menggunakan Cloud NAT, mereka harus secara eksplisit memilih ikut serta dengan menambahkan anotasi untuk menonaktifkan jalur default dan mengaktifkan jalur Cloud NAT.

  1. Identifikasi VMEA: Temukan objek VirtualMachineExternalAccess yang terkait dengan VM.

    kubectl get vmea -n <NAMESPACE>
    
  2. Periksa Anotasi yang Tidak Ada:

    • Pemilihan Cloud NAT: Apakah label VM cocok dengan CloudNatGateway?
    • Anotasi Opt-in: Periksa VMEA untuk anotasi egress.networking.gke.io/use-cloud-nat: "true".

    Kondisi: Jika VM cocok dengan gateway, tetapi TIDAK MEMILIKI anotasi ini, traffic akan bertabrakan dengan sistem egress default.

  3. Penyelesaian: Tambahkan anotasi ke objek VMEA.

    kubectl annotate vmea <VMEA_NAME> -n <NAMESPACE> egress.networking.gke.io/use-cloud-nat="true"