Memecahkan masalah kehilangan paket Cloud NAT dari cluster


Halaman ini menunjukkan cara menyelesaikan masalah terkait hilangnya paket Cloud NAT dari cluster Google Kubernetes Engine (GKE) native VPC dengan node pribadi yang diaktifkan.

VM node di cluster GKE native VPC dengan node pribadi tidak memiliki alamat IP eksternal. Artinya, klien di internet tidak dapat terhubung ke alamat IP node. Anda dapat menggunakan Cloud NAT untuk mengalokasikan alamat IP dan port eksternal yang memungkinkan cluster dengan node pribadi membuat koneksi publik.

Jika VM node kehabisan alokasi port eksternal dan alamat IP dari Cloud NAT, paket tidak akan terkirim. Untuk menghindari hal ini, Anda dapat mengurangi frekuensi paket keluar atau meningkatkan alokasi port dan alamat IP sumber Cloud NAT yang tersedia. Bagian berikut menjelaskan cara mendiagnosis dan memecahkan masalah kehilangan paket dari Cloud NAT dalam konteks cluster GKE dengan node pribadi.

Mendiagnosis paket hilang

Bagian berikut menjelaskan cara mencatat paket yang tidak terkirim ke dalam log menggunakan Cloud Logging, dan mendiagnosis penyebab paket hilang menggunakan Cloud Monitoring.

Mencatat paket yang tidak terkirim

Anda dapat mencatat paket yang tidak terkirim dengan kueri berikut di Cloud Logging:

resource.type="nat_gateway"
resource.labels.region=REGION
resource.labels.gateway_name=GATEWAY_NAME
jsonPayload.allocation_status="DROPPED"

Ganti kode berikut:

  • REGION: nama region tempat cluster berada.
  • GATEWAY_NAME: nama gateway Cloud NAT.

Perintah ini menampilkan daftar semua paket yang tidak dikirimkan oleh gateway Cloud NAT, tetapi tidak mengidentifikasi penyebabnya.

Memantau penyebab paket hilang

Untuk mengidentifikasi penyebab paket yang tidak terkirim, buat kueri Observer metrik di Cloud Monitoring. Paket tidak terkirim karena salah satu dari tiga alasan berikut:

  • OUT_OF_RESOURCES
  • ENDPOINT_INDEPENDENT_CONFLICT
  • NAT_ALLOCATION_FAILED

Untuk mengidentifikasi paket yang tidak terkirim karena kode error OUT_OF_RESOURCES atau ENDPOINT_ALLOCATION_FAILED, gunakan kueri berikut:

fetch nat_gateway
  metric 'router.googleapis.com/nat/dropped_sent_packets_count'
  filter (resource.gateway_name == GATEWAY_NAME)
  align rate(1m)
  every 1m
  group_by [metric.reason],
    [value_dropped_sent_packets_count_aggregate:
       aggregate(value.dropped_sent_packets_count)]

Jika Anda mengidentifikasi paket yang tidak terkirim karena alasan ini, lihat Paket yang tidak terkirim dengan alasan: kehabisan resource dan Paket yang tidak terkirim dengan alasan: konflik independen endpoint untuk mendapatkan saran pemecahan masalah.

Untuk mengidentifikasi paket yang tidak terkirim karena kode error NAT_ALLOCATION_FAILED, gunakan kueri berikut:

fetch nat_gateway
  metric 'router.googleapis.com/nat/nat_allocation_failed'
  group_by 1m,
    [value_nat_allocation_failed_count_true:
       count_true(value.nat_allocation_failed)]
  every 1m

Jika Anda mengidentifikasi paket yang dihapus karena alasan ini, lihat Perlu mengalokasikan lebih banyak alamat IP.

Menyelidiki konfigurasi Cloud NAT

Jika kueri sebelumnya menampilkan hasil yang kosong, dan Pod GKE tidak dapat berkomunikasi dengan alamat IP eksternal, gunakan tabel berikut untuk membantu Anda memecahkan masalah konfigurasi:

Konfigurasi Pemecahan masalah
Cloud NAT dikonfigurasi untuk hanya diterapkan ke rentang alamat IP utama subnet. Jika Cloud NAT dikonfigurasi hanya untuk rentang alamat IP utama subnet, paket yang dikirim dari cluster ke alamat IP eksternal harus memiliki alamat IP node sumber. Dalam konfigurasi Cloud NAT ini:
  • Pod dapat mengirim paket ke alamat IP eksternal jika tujuan alamat IP eksternal tersebut tunduk pada penyamaran IP. Saat men-deploy ip-masq-agent, pastikan daftar nonMasqueradeCIDRs tidak berisi alamat IP dan port tujuan. Paket yang dikirim ke tujuan tersebut pertama kali dikonversi menjadi alamat IP node sumber sebelum diproses oleh Cloud NAT.
  • Agar Pod dapat terhubung ke semua alamat IP eksternal dengan konfigurasi Cloud NAT ini, pastikan bahwa ip-masq-agent di-deploy dan bahwa daftar nonMasqueradeCIDRs hanya berisi rentang alamat IP node dan Pod cluster. Paket yang dikirim ke tujuan di luar cluster pertama-tama dikonversi menjadi alamat IP node sumber sebelum diproses oleh Cloud NAT.
  • Untuk mencegah agar Pod tidak mengirim paket ke beberapa alamat IP eksternal, Anda harus memblokir alamat tersebut secara eksplisit agar tidak disamarkan. Saat ip-masq-agent di-deploy, tambahkan alamat IP eksternal yang ingin Anda blokir ke daftar nonMasqueradeCIDRs. Saat meninggalkan node, paket yang dikirim ke tujuan tersebut masih memiliki sumber alamat IP Pod aslinya. Alamat IP Pod berasal dari rentang alamat IP sekunder subnet cluster. Dalam konfigurasi ini, Cloud NAT tidak akan beroperasi pada rentang sekunder tersebut.
Cloud NAT dikonfigurasi untuk hanya diterapkan ke rentang alamat IP sekunder subnet yang digunakan untuk IP Pod.

Jika Cloud NAT dikonfigurasi hanya untuk rentang alamat IP sekunder subnet yang digunakan oleh IP Pod cluster, paket yang dikirim dari cluster ke alamat IP eksternal harus memiliki alamat IP Pod sumber. Dalam konfigurasi Cloud NAT ini:

  • Penggunaan agen penyamaran IP menyebabkan paket kehilangan alamat IP Pod sumbernya saat diproses oleh Cloud NAT. Untuk mempertahankan alamat IP Pod sumber, tentukan rentang alamat IP tujuan dalam daftar nonMasqueradeCIDRs. Dengan ip-masq-agent yang di-deploy, setiap paket yang dikirim ke tujuan dalam daftar nonMasqueradeCIDRs akan mempertahankan alamat IP Pod sumbernya sebelum diproses oleh Cloud NAT.
  • Agar Pod dapat terhubung ke semua alamat IP eksternal dengan konfigurasi Cloud NAT ini, pastikan ip-masq-agent di-deploy dan daftar nonMasqueradeCIDRs sebanyak mungkin (0.0.0.0/0 menentukan semua tujuan alamat IP). Paket yang dikirim ke semua tujuan mempertahankan alamat IP Pod sumber sebelum diproses oleh Cloud NAT.

Mengurangi kehilangan paket

Setelah mendiagnosis penyebab kehilangan paket, pertimbangkan untuk menggunakan rekomendasi berikut untuk mengurangi kemungkinan masalah tersebut terjadi lagi di masa mendatang:

  • Konfigurasikan gateway Cloud NAT untuk menggunakan alokasi port dinamis dan meningkatkan jumlah maksimum port per VM.

  • Jika Anda menggunakan alokasi port statis, tingkatkan jumlah port minimum per VM.

  • Kurangi frekuensi paket keluar aplikasi Anda. Saat membuat beberapa koneksi keluar ke port dan alamat IP dengan tujuan yang sama, aplikasi dapat dengan cepat memakai semua koneksi yang dapat dibuat Cloud NAT ke tujuan tersebut menggunakan jumlah alamat sumber NAT dan tupel port sumber yang dialokasikan.

    Untuk mengetahui detail tentang cara Cloud NAT menggunakan alamat sumber NAT dan port sumber untuk membuat koneksi, termasuk batasan jumlah koneksi simultan ke tujuan, lihat Port dan koneksi.

    Untuk mengurangi frekuensi koneksi keluar dari aplikasi, gunakan kembali koneksi terbuka. Metode umum untuk menggunakan kembali koneksi mencakup penggabungan koneksi, multiplexing koneksi menggunakan protokol seperti HTTP/2, atau membuat koneksi persisten yang digunakan kembali untuk beberapa permintaan. Untuk mengetahui informasi selengkapnya, lihat Port dan Koneksi.

Langkah selanjutnya

Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.