Memecahkan masalah Cloud NAT

Panduan ini membantu Anda mendiagnosis alasan workload (Pod atau VM) tidak dapat mengakses jaringan eksternal menggunakan Cloud NAT. Sebagai developer, Anda terutama berinteraksi dengan resource CloudNatGateway. Status resource ini adalah sumber kebenaran 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 IAM Project Anda untuk memberi Anda salah satu atau kedua peran berikut:
    • Pelihat Cloud NAT (cloud-nat-viewer): Peran ini menawarkan akses hanya baca ke resource Cloud NAT. Peran ini akan membantu Anda memulai mendiagnosis masalah.
    • Developer Cloud NAT (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. Dengan peran ini, Anda dapat melakukan banyak perbaikan yang dijelaskan di halaman ini.
    • Peran tambahan mungkin diperlukan untuk beberapa langkah dan perbaikan diagnostik 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 berfungsi baik 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 pemilihan rute 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 dikelompokkan ke 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. Mencantumkan 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 pun Pod/VM yang dipilih oleh lebih dari satu gateway.
CloudNATSubnetRefsFieldInvalidCode

Subnet tidak valid. Subnet yang ditentukan dalam subnetRefs tidak dapat digunakan. Alasan umum:

  • Subnet tidak ada.
  • Subnet tidak dalam status Ready.
  • Subnet bukan berjenis Leaf.
  1. Pastikan subnet ada: kubectl get subnet <SUBNET_NAME>
  2. Periksa 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 dilampirkan 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 Salah (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 perutean yang benar.
  1. Mencantumkan 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 pun Pod/VM yang dipilih oleh lebih dari satu gateway.
NET-E0301 Kehabisan Resource / Kegagalan Node. Sistem telah membuat konfigurasi, tetapi tidak dapat menetapkan IP keluar Anda ke node fisik yang berfungsi dengan baik. Hal ini biasanya berarti subnet kehabisan IP atau node gateway tidak berfungsi.
  1. Periksa penggunaan [Subnet](/distributed-cloud/hosted/docs/latest/gdch/platform/pa-user/subnets-overview) Anda. Apakah sudah penuh?
  2. Jika Subnet memiliki IP kosong dan berstatus Ready, hal ini menunjukkan kegagalan infrastruktur sisi platform (misalnya, tidak ada node gateway yang responsif). Tindakan: Hubungi Administrator Platform.
NET-E0001 Error Sistem. Kegagalan komunikasi pengontrol. Tindakan: Hubungi Administrator Platform.

Error rute keluar (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. Mencantumkan 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 pun Pod/VM yang dipilih oleh lebih dari satu gateway.
NET-E0304 Kegagalan Pemrograman. Sistem gagal memprogram aturan perutean (BPF) untuk IP gateway spesifik Anda.

Tindakan: Ini adalah error pemrograman internal atau inkonsistensi status.

  1. Coba lakukan pembaruan 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 diberi otorisasi secara eksplisit untuk mengirim traffic keluar.

  • 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 melewati jalur keluar 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.

Traffic keluar node cluster standar

Jika Anda menjalankan Cluster Standar, node itu sendiri memerlukan izin untuk keluar.

  • 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.

Konflik NAT Keluar Default versus Cloud NAT

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

Mendiagnosis bentrokan Pod

Untuk Pod, Egress NAT Default biasanya diaktifkan dengan menambahkan label tertentu. Pod tidak dapat memiliki label ini sekaligus menjadi target Cloud NAT Gateway.

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

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

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

    Kondisi: Jika KEDUA kondisi benar, Anda mengalami tabrakan.

  3. Penyelesaian: Hapus label keluar default lama dari Pod (atau Deployment/StatefulSet induknya) untuk mengizinkan Cloud NAT mengambil alih kontrol eksklusif.

Mendiagnosis konflik VM

Untuk Virtual Machine, mekanismenya berbeda. VM dengan objek VirtualMachineExternalAccess (VMEA) sering dikonfigurasi untuk akses default. Untuk menggunakan Cloud NAT, mereka harus memilih untuk ikut serta secara eksplisit 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. Memeriksa Anotasi yang Tidak Ada:

    • Pemilihan Cloud NAT: Apakah label VM cocok dengan CloudNatGateway?
    • Anotasi dengan Persetujuan Pengguna: 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 berkonflik dengan sistem keluar default.

  3. Penyelesaian: Tambahkan anotasi ke objek VMEA.

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