Memecahkan masalah kehilangan paket Cloud NAT dari cluster

Di cluster Google Kubernetes Engine (GKE) berbasis VPC, node tanpa alamat IP eksternal meningkatkan keamanan. Node ini menggunakan Cloud NAT untuk koneksi internet keluar. Kehilangan paket dapat terjadi jika VM Node kehabisan alokasi port dan alamat IP Cloud NAT, sering kali saat beban keluar tinggi, sehingga mengganggu traffic keluar.

Gunakan dokumen ini untuk mempelajari cara mencatat dan memantau paket yang tidak terkirim ke dalam log, menyelidiki konfigurasi Cloud NAT, dan menerapkan langkah-langkah untuk mengurangi kehilangan paket di masa mendatang.

Informasi ini penting bagi admin dan operator Platform serta administrator Jaringan yang mengelola cluster GKE dengan node tanpa akses internet dan mengandalkan Cloud NAT untuk konektivitas eksternal. Untuk mengetahui informasi selengkapnya tentang peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.

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 hilangnya paket

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 tidak terkirim dengan alasan: kehabisan resource dan Paket 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 di-drop 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-tama 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 terlebih dahulu 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, semua 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 sebesar 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 Anda mendiagnosis penyebab kehilangan paket, pertimbangkan untuk menggunakan rekomendasi berikut guna mengurangi kemungkinan masalah tersebut berulang di masa mendatang:

  • Konfigurasi 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 berikutnya