Dokumen ini memberikan petunjuk dan prosedur diagnostik untuk mendiagnosis masalah jaringan di cluster Google Kubernetes Engine (GKE) menggunakan kemampuan observasi GKE Dataplane V2, Hubble, dan Cloud Monitoring.
Untuk ringkasan arsitektur dan praktik terbaik konseptual, lihat Praktik terbaik untuk kemampuan pengamatan jaringan.
Pohon keputusan pemecahan masalah dan konsep inti
Sebelum meninjau prosedur, gunakan matriks keputusan berikut untuk mengidentifikasi tingkat stack jaringan GKE yang kemungkinan menyebabkan masalah Anda, dan buka bagian yang sesuai.
| Gejala atau pertanyaan diagnostik | Tingkat yang dicurigai | Prosedur yang direkomendasikan |
|---|---|---|
Pod gagal me-resolve domain eksternal atau Layanan Kubernetes internal (waktu tunggu DNS habis, NXDOMAIN, SERVFAIL). |
Tingkat 1: Pod dan Service (DNS) | Mendiagnosis kegagalan resolusi DNS |
| Layanan tidak dapat berkomunikasi; waktu tunggu koneksi habis atau paket dihentikan di antara Pod. | Tingkat 1: Pod dan Layanan (Kebijakan atau paket yang terputus) | Mendiagnosis paket yang terputus dan pemblokiran NetworkPolicy |
Replika workload memiliki beban traffic yang tidak merata, atau Pod mencatat tingkat reset TCP (RST) yang tinggi. |
Tingkat 1: Pod dan Layanan (Load balancing atau transport) | Mendiagnosis ketidakseimbangan traffic dan reset TCP |
| Latensi umum, waktu tunggu habis sesekali, atau memulai ulang CNI di seluruh node. | Tingkat 2: Node dan CNI (Kernel) | Triage untuk latensi tingkat node dan hambatan CNI |
| Pod tidak dapat menjangkau resource di luar GKE (Cloud SQL, API eksternal, atau VPC lainnya). | Tingkat 3: VPC dan perutean | Mengisolasi masalah konektivitas GKE versus VPC atau eksternal |
| Memerlukan simulasi jalur otomatis untuk memverifikasi apakah aturan firewall, rute, atau NetworkPolicy memblokir traffic. | Tingkat 3: VPC dan perutean (Simulasi) | Mendiagnosis konektivitas menggunakan Uji Konektivitas |
| Perlu mengidentifikasi workload mana yang mengirim traffic ke internet dan menjalani NAT. | Tingkat 4: Gateway eksternal dan biaya | Mengidentifikasi traffic NAT (keluar ke internet) |
| Biaya transfer data antar-zona yang tinggi atau perlu memvisualisasikan pengguna yang paling banyak menggunakan data tanpa menulis kueri SQL. | Tingkat 4: Gateway eksternal dan biaya | Menganalisis biaya dan performa traffic cluster menggunakan Flow Analyzer |
Konsep jaringan inti
Jika Anda baru mengenal Kubernetes atau Google Cloud jaringan, ingatlah konsep inti berikut:
- eBPF (Extended Berkeley Packet Filter): teknologi sistem operasi yang memungkinkan program pemantauan dan perutean yang aman dijalankan langsung di dalam kernel Linux. GKE Dataplane V2 menggunakan eBPF untuk merutekan paket dan menerapkan NetworkPolicy dengan overhead performa minimal.
- Penyamaran IP (SNAT): proses penulisan ulang alamat IP sumber paket. Saat Pod GKE (yang memiliki alamat IP pribadi) berkomunikasi dengan internet atau resource VPC eksternal, GKE menyamarkan (menulis ulang) alamat IP Pod ke alamat IP node sehingga sistem eksternal mengetahui cara merutekan balasan.
- Pelacakan koneksi (Conntrack): fitur kernel yang melacak semua koneksi
jaringan aktif. Di cluster GKE Dataplane V2, pelacakan ini dibagi
antara dua tabel: conntrack kernel Linux standar (yang digunakan oleh
ip-masq-agent) dan tabel conntrack yang dikelola Cilium dan GKE Dataplane V2 yang disimpan dalam peta eBPF. Jika node menangani terlalu banyak koneksi serentak, salah satu tabel pelacakan ini dapat terisi penuh (kelelahan conntrack), sehingga menyebabkan node secara diam-diam membuang paket baru. - Hubble: mesin kemampuan observasi untuk GKE Dataplane V2. Alat ini berjalan di atas eBPF dan memberikan visibilitas real-time ke alur traffic, paket yang terputus, dan evaluasi NetworkPolicy.
Tingkat 1: Kemampuan observasi Pod dan Layanan (Aplikasi)
Tingkat Pod dan Service mencakup komunikasi jaringan antara Pod, Service, dan DNS cluster. Masalah di tingkat ini biasanya muncul sebagai waktu tunggu koneksi aplikasi habis, kegagalan resolusi nama, atau distribusi beban yang tidak merata.
Mendiagnosis kegagalan resolusi DNS
Tinjau cakupan diagnostik dan prasyarat sebelum memecahkan masalah DNS:
- Area fokus: komunikasi antara Pod dan CoreDNS atau NodeLocal DNSCache, latensi DNS, waktu tunggu resolusi DNS upstream, dan validasi NetworkPolicy FQDN.
- Prasyarat: Metrik GKE Dataplane V2 diaktifkan; akses
kubectl. - Kompatibilitas CNI: GKE Dataplane V2 (Advanced Datapath) dan CNI GKE standar.
- Gejala: Pod mencatat
dial tcp: lookup <domain>: i/o timeout,NXDOMAIN, atau latensi terputus-putus pada panggilan API keluar. - Tujuan: menentukan apakah kegagalan DNS berasal dari dalam cluster
(saturasi
kube-dnsatau NodeLocal DNSCache), NetworkPolicy yang memblokir port UDP atau TCP 53, atau penurunan kualitas jaringan upstream.
Langkah 1: Pemeriksaan jangkauan dasar
Sebelum memecahkan masalah lapisan DNS, verifikasi apakah tujuan dapat dijangkau secara langsung menggunakan alamat IP-nya dari dalam Pod yang terpengaruh:
# 1. Test raw IP reachability (bypasses DNS entirely)
kubectl exec -it my-pod -n default -- curl -v --connect-timeout 5 http://10.240.0.10:8080
# 2. Test domain resolution
kubectl exec -it my-pod -n default -- curl -v --connect-timeout 5 http://my-service.default.svc.cluster.local:8080
- Jika koneksi IP berhasil, tetapi domain gagal: masalahnya terisolasi di lapisan resolusi DNS. Lanjutkan ke Langkah 2.
- Jika keduanya gagal: masalahnya adalah perutean tingkat jaringan atau penerapan kebijakan. Lanjutkan ke Mendiagnosis penurunan paket dan pemblokiran NetworkPolicy.
Memeriksa pengisian awal DNS FQDN NetworkPolicy
Jika cluster Anda menggunakan NetworkPolicy berbasis FQDN (FQDNNetworkPolicy), verifikasi
bahwa nama domain diizinkan secara eksplisit. Jika Pod membuat kueri domain eksternal yang tidak diisi sebelumnya di cache proxy DNS GKE Dataplane V2 atau diizinkan oleh kebijakan, GKE Dataplane V2 akan memblokir traffic keluar ke alamat IP yang di-resolve:
# Verify whether UDP or TCP port 53 egress is permitted in the Pod's namespace
kubectl get networkpolicy -n default -o yaml | grep -A 5 -B 2 "port: 53"
Langkah 2: Periksa metrik DNS di Cloud Monitoring
GKE mengekspos metrik DNS bawaan di Cloud Monitoring dengan awalan
kubernetes.io/networking/dns/.
Untuk memeriksa metrik DNS di Cloud Monitoring, lakukan hal berikut:
- Di konsol Google Cloud , buka Cloud Monitoring > Dashboards.
- Pilih dasbor GKE DNS Observability - Cluster View yang telah ditentukan sebelumnya (atau buka Metrics Explorer dan filter
kubernetes.io/networking/dns/). - Evaluasi sinyal utama berikut (untuk NodeLocal DNSCache, ganti
kubednsdengannode_local_dnsdi jalur metrik):
| Nama metrik | Nilai minimum peringatan | Akar masalah |
|---|---|---|
kubernetes.io/networking/dns/kubedns/max_concurrent_rejected_request_count |
> 0 | Batas kueri serentak tercapai. kube-dns atau NodeLocal DNSCache membatalkan kueri. |
kubernetes.io/networking/dns/kubedns/dns_request_latencies |
p99 > 100 md | Latensi resolusi DNS end-to-end yang tinggi di kube-dns atau NodeLocal DNSCache. |
kubernetes.io/networking/dns/kubedns/forwarding_request_latencies |
p99 > 100 md | Latensi atau saturasi server DNS upstream. |
Urutan triase performa dan waktu tunggu DNS
Ikuti urutan triase ini untuk mendiagnosis latensi DNS, cache miss, dan waktu tunggu habis upstream:
- Periksa rasio cache ditemukan: kueri
kubernetes.io/networking/dns/kubedns/dns_cache_request_count(ataunode_local_dns/dns_cache_request_count) dikelompokkan menurut labelcache_status. Jikacache_status="hit"rendah dancache_status="miss"tinggi, aplikasi mungkin mengeluarkan kueri non-FQDN (sepertimy-service, bukanmy-service.default.svc.cluster.local), sehingga menyebabkan penelusuran jalur di semua entri dalam/etc/resolv.conf. - Mengevaluasi latensi upstream: nilai tinggi
forwarding_request_latenciesmenunjukkan masalah pada server DNS upstream (misalnya, DNS lokal perusahaan yang dijangkau melalui Cloud Interconnect atau Cloud VPN, atau batas Cloud DNS). Mengaudit penggantian DNS kustom: periksa
kube-dnsConfigMap kustom untuk stub atau penerusan upstream yang salah dikonfigurasi:kubectl get configmap kube-dns -n kube-system -o yaml
Langkah 3: Streaming traffic DNS langsung dengan Hubble CLI
Gunakan alias helper Hubble CLI untuk memeriksa permintaan dan respons DNS live yang di-streaming dari kernel node:
# 1. Ensure the helper alias is set in your terminal session
alias gke-hubble="kubectl exec -it -n gke-managed-dpv2-observability deployment/hubble-relay -c hubble-cli -- hubble"
# 2. Observe live DNS (Port 53) traffic for a specific Pod
gke-hubble observe --pod default/my-pod --port 53
Langkah 4: Validasi perbaikan
Jika penolakan kueri serentak terjadi, terapkan NodeLocal DNSCache untuk menyerap pencarian DNS frekuensi tinggi langsung di node tanpa mencapai batas kube-dns di seluruh cluster:
# Verify NodeLocal DNSCache DaemonSet is running
kubectl get daemonset node-local-dns -n kube-system
Mendiagnosis paket yang terputus dan pemblokiran NetworkPolicy
Tinjau cakupan diagnostik dan prasyarat sebelum menyelidiki penurunan paket dan penolakan kebijakan:
- Area fokus: penurunan traffic antara objek Pod atau antara objek Pod dan Service, penerapan NetworkPolicy, alasan penurunan eBPF kernel.
- Prasyarat: Kemampuan Observasi Flow GKE Dataplane V2 diaktifkan; logging NetworkPolicy dikonfigurasi.
- Kompatibilitas CNI: Hanya GKE Dataplane V2.
- Gejala: upaya koneksi aplikasi gagal dengan
Connection timed outatauConnection reset by peer. - Sasaran: menentukan alasan pasti NetworkPolicy atau eBPF yang membuang paket tanpa perubahan coba-coba pada kebijakan keamanan.
Langkah 1: Pantau metrik penurunan Hubble
Saat GKE Dataplane V2 melepaskan paket, GKE Dataplane V2 akan memancarkan metrik hubble_drop_total yang diberi tag dengan alasan pelepasan dan metadata sumber serta tujuan. Untuk memantau metrik pelepasan Hubble, lakukan hal berikut:
Jika belum dikonfigurasi, deploy resource
PodMonitoringGoogle Cloud Managed Service for Prometheus untuk menyalin metrik Hubble:apiVersion: monitoring.googleapis.com/v1 kind: PodMonitoring metadata: name: hubble-metrics namespace: gke-managed-dpv2-observability spec: selector: matchLabels: k8s-app: cilium endpoints: - port: hubble-metrics interval: 30sJalankan kueri berikut di Cloud Monitoring > Metrics Explorer untuk melihat penurunan menurut alasan:
sum by (reason) (rate(hubble_drop_total[5m])) > 0Menafsirkan kode
reasonumum:Policy denied: NetworkPolicy Kubernetes secara eksplisit atau implisit memblokir koneksi.CT: Map insertion failed: tabel pelacakan koneksi (conntrack) sudah penuh.Unsupported L3 protocol: paket non-IPv4 atau IPv6 atau header yang rusak.
Langkah 2: Periksa log NetworkPolicy di Cloud Logging
Logging NetworkPolicy mengekspor log JSON terstruktur untuk semua keputusan kebijakan. Untuk mengirim kueri log NetworkPolicy di Cloud Logging, lakukan hal berikut:
- Di konsol Google Cloud , buka Cloud Logging > Logs Explorer.
Jalankan kueri berikut:
resource.type="k8s_node" log_name:"projects/PROJECT_ID/logs/events" jsonPayload.connection.verdict="DENY" jsonPayload.src.pod_name="my-source-pod"Periksa payload JSON:
jsonPayload.drop_reason: menunjukkan alasan paket dihentikan.jsonPayload.policies: mencantumkan NetworkPolicy yang dievaluasi. Jika daftar kosong ditampilkan dengan putusanDENY, namespace beroperasi dalam mode penolakan default dan tidak ada kebijakan yang mengizinkan traffic.
Jika tidak ada log NetworkPolicy yang muncul, verifikasi bahwa logging diaktifkan di resource kustom NetworkLogging cluster. Misalnya, periksa apakah kolom
spec.cluster.deny.log ditetapkan ke true:
kubectl get networklogging default -o yaml
Langkah 3: Lacak penurunan live dengan Hubble CLI
Streaming rilis langsung secara langsung dengan menggunakan Hubble CLI untuk memeriksa paket real-time:
gke-hubble observe --verdict DROPPED --namespace default --follow
Contoh output:
TIMESTAMP SOURCE DESTINATION TYPE VERDICT
10:14:22.102 default/frontend default/backend:80 to-stack DROPPED (Policy denied by NetworkPolicy: backend-deny-all)
Output menunjukkan NetworkPolicy yang tepat yang memblokir traffic
(backend-deny-all).
Langkah 4: Periksa kehabisan conntrack
Jika alasan penurunan menunjukkan CT: Map insertion failed:
Periksa log agen GKE Dataplane V2 untuk mengetahui saturasi tabel conntrack:
kubectl logs -n kube-system daemonset/anetd -c cilium-agent --tail=100 | grep "Conntrack table full"Periksa ukuran maksimum tabel conntrack pada node yang terpengaruh:
kubectl exec -it -n kube-system daemonset/anetd -c cilium-agent -- cilium status --all-controllers | grep -i conntrackJika tabel conntrack penuh, lakukan penskalaan horizontal pada beban kerja Anda di lebih banyak node atau kurangi kecepatan koneksi dari Pod klien.
Mendiagnosis ketidakseimbangan traffic dan reset TCP
Tinjau cakupan diagnostik dan prasyarat sebelum memecahkan masalah ketidakseimbangan traffic dan reset koneksi:
- Area fokus: ketidakseimbangan load balancing, kegagalan handshake TCP, penghentian koneksi secara tiba-tiba.
- Prasyarat: Metrik GKE Dataplane V2 diaktifkan.
- Kompatibilitas CNI: GKE Dataplane V2.
- Gejala: replika Pod tertentu menerima traffic berlebih, sementara replika lainnya tetap tidak aktif; aplikasi klien mencatat
connection reset by peerataubroken pipe. - Sasaran: menentukan apakah ketidakseimbangan traffic disebabkan oleh kelekatan koneksi di lapisan transport (OSI Layer 4, TCP) versus lapisan aplikasi (OSI Layer 7, HTTP/2 atau gRPC), dan mengidentifikasi sumber paket TCP RST.
Langkah 1: Bandingkan alur traffic tingkat Pod
Untuk menentukan apakah traffic didistribusikan secara merata di seluruh replika, lakukan hal berikut:
Di Cloud Monitoring, kueri jumlah aliran ingress di semua Pod dalam Deployment:
sum by (pod) (rate(pod_flow_ingress_flows_count{destination_workload="my-service"}[5m]))Mengevaluasi distribusi traffic di seluruh Pod. Jika satu Pod menerima sebagian besar traffic, selidiki penggunaan ulang koneksi atau sesi persisten:
- gRPC atau HTTP/2: koneksi TCP yang berjalan lama menyebabkan semua permintaan melalui satu aliran TCP ke satu Pod backend. Perutean Layanan Kubernetes lapisan transpor (OSI Layer 4, TCP) tidak dapat menyeimbangkan permintaan di dalam koneksi HTTP/2 yang sudah dibuat.
- Afinitas Sesi ClientIP: verifikasi apakah Layanan dikonfigurasi dengan
sessionAffinity: ClientIP. - Layanan Headless: klien dapat menyelesaikan DNS satu kali dan menyimpan alamat IP tunggal secara permanen.
Langkah 2: Analisis metrik reset TCP
Reset TCP (RST) menghentikan koneksi dengan segera. ICMP ini dipancarkan oleh kernel sistem operasi saat endpoint menerima paket untuk port yang tidak diketahui, atau saat aplikasi menutup koneksi dengan data yang belum dibaca dalam buffer.
Jalankan kueri MQL berikut di Cloud Monitoring:
fetch prometheus_target
| metric 'prometheus.googleapis.com/hubble_tcp_flags_total/counter'
| filter (metric.flag == 'RST')
| align rate(1m)
| every 1m
| group_by [metric.source, metric.destination, metric.traffic_direction], sum(val())
Tinjau hasil kueri untuk menentukan sumber reset:
- RST keluar (traffic_direction=
egress): Pod lokal membuat reset. Periksa apakah aplikasi Pod mengalami error, mencapai batas koneksinya, atau secara aktif menolak koneksi. - RST masuk (traffic_direction=
ingress): peer jarak jauh (database eksternal, API, atau Pod jarak jauh) mengirim reset. Periksa kondisi server tujuan dan status firewall.
Langkah 3: Streaming reset TCP secara langsung
Gunakan Hubble CLI untuk merekam handshake reset langsung:
gke-hubble observe --type trace --verdict FORWARDED --tcp-flags RST --namespace default
Langkah 4: Perbaikan dan solusi yang dapat ditindaklanjuti
Terapkan langkah-langkah perbaikan berikut, bergantung pada penyebab ketidakseimbangan traffic atau reset TCP:
- Untuk kelekatan koneksi gRPC atau lapisan aplikasi (OSI Layer 7):
- Deploy Cloud Service Mesh untuk mengaktifkan load balancing tingkat permintaan (OSI Layer 7) di lapisan aplikasi.
- Konfigurasi batas koneksi sisi klien atau waktu tunggu keep-alive (misalnya, gRPC
MAX_CONNECTION_AGEdanMAX_CONNECTION_AGE_GRACE) untuk memaksa pembentukan ulang koneksi secara berkala.
- Untuk afinitas IP Layanan: hapus
service.spec.sessionAffinitykecuali jika status aplikasi benar-benar memerlukannya. - Untuk caching DNS Service headless: pastikan runtime aplikasi (seperti
JVM
networkaddress.cache.ttl) tidak menyimpan hasil DNS dalam cache tanpa batas waktu. - Untuk overflow antrean backlog aplikasi: saat antrean
pendengar aplikasi penuh, kernel Linux akan membuang paket SYN yang masuk atau mengirim TCP
RST. Lakukan penskalaan replika Pod atau tingkatkan backlog pendengar aplikasi
(
somaxconn).
Tingkat 2: Kemampuan observasi Node dan CNI (Kernel)
Tingkat node dan CNI mencakup kernel Linux host, program eBPF, dan antarmuka jaringan node. Hambatan di tingkat ini memengaruhi semua beban kerja yang berjalan di node yang terpengaruh.
Pemeriksaan integritas sistem: Mendeteksi patching anetd yang tidak sah
GKE Dataplane V2 berjalan sebagai DaemonSet terkelola (anetd) di namespace kube-system. Di Cloud Logging, Anda dapat mengkueri log audit Kubernetes untuk mendeteksi apakah pengguna yang tidak sah atau skrip otomatis telah menerapkan patch atau memulai ulang anetd:
protoPayload.methodName="io.k8s.core.v1.daemonsets.patch" OR
protoPayload.methodName="io.k8s.core.v1.daemonsets.update"
protoPayload.resourceName="namespaces/kube-system/daemonsets/anetd"
Jika patching yang tidak sah terdeteksi, kembalikan DaemonSet ke konfigurasi default atau picu pembuatan ulang node pool untuk memulihkan status terkelola.
Triage untuk latensi tingkat node dan hambatan CNI
Tinjau cakupan diagnostik dan prasyarat sebelum mendiagnosis latensi tingkat node dan hambatan kernel:
- Area fokus: latensi kernel host, paket yang terputus di antarmuka VM, saturasi agen eBPF GKE Dataplane V2, kelelahan conntrack.
- Prasyarat: Metrik VM Compute Engine diaktifkan;
kubectlakses. - Kompatibilitas CNI: GKE Dataplane V2 dan CNI GKE standar.
- Gejala: traffic lintas node mengalami lonjakan latensi atau penurunan acak, sementara traffic intra-node tetap normal.
- Tujuan: membedakan antara throttling jaringan VM host, penurunan kernel Linux, dan hambatan tingkat CNI.
Langkah 1: Membedakan masalah di luar GKE dengan masalah di dalam GKE
Jalankan uji dasar VM Compute Engine: Deploy VM Compute Engine mandiri di subnet VPC yang sama dengan node cluster GKE. Uji konektivitas dari VM ke tujuan target.
- Jika VM mandiri mengalami latensi atau kehilangan paket yang sama: masalahnya berada di luar GKE (firewall VPC, Cloud NAT, Cloud Interconnect, atau server eksternal). Lanjutkan ke Mengisolasi masalah konektivitas GKE versus VPC atau eksternal.
- Jika VM mandiri berkomunikasi secara normal, tetapi Pod GKE gagal: masalahnya ada di dalam GKE (eBPF tingkat node, conntrack, atau CNI). Lanjutkan ke Langkah 2.
Langkah 2: Membedakan masalah aplikasi dengan masalah tingkat node dan CNI
Untuk menentukan apakah latensi berasal dari aplikasi atau di tingkat node dan CNI, lakukan hal berikut:
Periksa saturasi resource aplikasi: Pastikan node tidak mengalami pembatasan CPU atau tekanan memori, yang menunda pemrosesan paket di ruang pengguna:
kubectl top nodes kubectl top pods -n defaultPeriksa jumlah conntrack kernel Linux: Periksa jumlah conntrack aktif di host:
# On a node where you have debugging access cat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_maxJika
nf_conntrack_countmendekatinf_conntrack_max, kernel host akan melepaskan paket TCP SYN baru.
Langkah 3: Verifikasi paket yang terputus di tingkat VM menggunakan telemetri Compute Engine
Google Cloud Compute Engine mengekspor metrik antarmuka jaringan tingkat VM ke Cloud Monitoring.
Di Cloud Monitoring > Metrics Explorer, lakukan kueri:
sum by (drop_reason) (rate(compute_googleapis_com:instance_network_dropped_packets_count[5m]))
FQ_CODEL_DROP: paket di-drop karena saturasi antrean Fair Queuing atau CoDel (batas bandwidth keluar VM terlampaui).FIREWALL_RULE_DROP: paket yang dihentikan oleh aturan firewall VPC.RATE_LIMIT_DROP: paket di-drop karena VM melampaui kuota paket per detik (PPS) maksimum antarmuka jaringannya.
Langkah 4: Menyelidiki penurunan tingkat kernel menggunakan eBPF
Jika metrik tingkat VM menunjukkan nol pelepasan, tetapi Pod GKE masih melepaskan paket, periksa agen GKE Dataplane V2 (anetd) untuk mengetahui pelepasan peta eBPF:
kubectl logs -n kube-system daemonset/anetd -c cilium-agent --tail=200 | grep -i "drop"
Cari ct-map-insertion-failed atau fib-lookup-failed.
Tingkat 3: Kemampuan pengamatan VPC dan Routing (Cloud Network)
Tingkat perutean VPC dan cloud menghubungkan node GKE ke layanan Google Cloud lain, jaringan lokal, dan internet. Kegagalan di sini biasanya berasal dari aturan firewall VPC, rute kustom, atau konfigurasi gateway.
Mengisolasi masalah konektivitas GKE versus VPC atau eksternal
Tinjau cakupan diagnostik dan prasyarat sebelum mengisolasi masalah jaringan eksternal dari kegagalan dalam cluster:
- Area fokus: isolasi batas antara perutean internal Kubernetes dan perutean cloud VPC.
- Prasyarat: gcloud CLI; izin untuk membuat Uji Konektivitas.
- Kompatibilitas CNI: semua cluster.
- Gejala: Pod gagal terhubung ke resource eksternal (misalnya, Cloud SQL, API lokal, atau endpoint pihak ketiga).
- Tujuan: dengan cepat menentukan apakah penurunan terjadi dalam node GKE atau di dalam Google Cloud VPC atau jaringan eksternal.
Langkah 1: Pengujian dasar VM Compute Engine
Untuk men-deploy VM dasar dan mengevaluasi apakah masalah berlanjut di luar GKE, lakukan hal berikut:
Deploy instance VM Compute Engine sementara di subnet dan zona VPC yang sama dengan node pool GKE Anda:
gcloud compute instances create gke-baseline-tester \ --zone=us-central1-a \ --subnet=gke-subnet \ --machine-type=e2-microHubungkan ke instance menggunakan SSH dan uji konektivitas ke tujuan:
curl -v --connect-timeout 5 https://api.example.comMengevaluasi hasilnya:
- Jika VM Compute Engine tidak dapat terhubung: masalahnya ada di VPC atau jaringan eksternal (aturan firewall, tabel perutean, kehabisan IP Cloud NAT, atau daftar yang diizinkan IP eksternal).
- Jika VM Compute Engine berhasil terhubung: masalahnya ada di dalam GKE (NetworkPolicy memblokir egress, CIDR Pod yang tidak di-masquerade, atau DNS tingkat container).
Langkah 2: Jalankan pengujian Uji Konektivitas sesuai permintaan
Jalankan pengujian Google Cloud Uji Konektivitas dari VM node ke tujuan:
gcloud network-management connectivity-tests create test-node-to-dest \
--source-instance=projects/PROJECT_ID/zones/us-central1-a/instances/gke-baseline-tester \
--destination-ip-address=203.0.113.10 \
--destination-port=443 \
--protocol=TCP
Periksa hasilnya di konsol Google Cloud untuk mengidentifikasi apakah aturan firewall atau rute VPC membatalkan traffic.
Mendiagnosis konektivitas menggunakan Uji Konektivitas
Uji Konektivitas menyimulasikan jalur paket di seluruh resource GKE dan VPC tanpa mengirim traffic langsung. Simulasi ini mengevaluasi resolusi DNAT Service ClusterIP-to-Pod, aturan ingress dan egress NetworkPolicy GKE Dataplane V2, serta penyamaran IP node (SNAT). Tinjau cakupan diagnostik dan prasyarat sebelum menjalankan simulasi jalur otomatis:
- Area fokus: simulasi jalur statis otomatis untuk Pod, Layanan, NetworkPolicy, dan rute VPC GKE.
- Prasyarat: Network Intelligence Center diaktifkan; Network Management API diaktifkan.
- Kompatibilitas CNI: GKE Dataplane V2 (analisis yang ditingkatkan).
- Gejala: konektivitas turun tanpa alasan yang jelas meskipun semua konfigurasi tampak valid saat diperiksa secara manual.
- Sasaran: mensimulasikan dan melacak jalur paket secara statis dari sumber Pod ke tujuan, mengidentifikasi baris kebijakan yang menyebabkan penurunan.
Skenario A: Memverifikasi apakah NetworkPolicy GKE memblokir pengumpulan metrik
Saat meng-scrape metrik dari Pod di namespace yang aman, pengumpul Google Cloud Managed Service for Prometheus mungkin diblokir oleh NetworkPolicy tolak-bawaan:
gcloud network-management connectivity-tests create test-gmp-to-pod \
--source-ip-address=10.0.0.15 \
--destination-gke-pod=projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/k8s/namespaces/prod/pods/backend-pod \
--destination-port=8080 \
--protocol=TCP
Periksa rekaman aktivitas pengujian di Google Cloud console. Jika pengujian berakhir pada langkah
GKE Network Policy evaluation dengan DROP, aturan ingress harus ditambahkan untuk
mengizinkan traffic dari Pod pengumpul.
Skenario B: Memverifikasi jangkauan ke Layanan GKE
Simulasikan keterjangkauan dari VM klien ke Layanan Kubernetes internal:
gcloud network-management connectivity-tests create test-vm-to-service \
--source-instance=projects/PROJECT_ID/zones/us-central1-a/instances/client-vm \
--destination-ip-address=10.96.0.100 \
--destination-port=80 \
--protocol=TCP
Rekaman aktivitas simulasi menunjukkan:
- Pencocokan rute VPC.
- Izinkan traffic keluar dan masuk firewall VPC.
- Tiba di node GKE.
- DNAT Service ke alamat IP Pod backend.
- Evaluasi Ingress NetworkPolicy pada Pod backend.
Skenario C: Mendiagnosis masalah keluar Pod ke internet
Jika Pod tidak dapat menjangkau API eksternal di internet:
Buat pengujian dari Pod ke alamat IP publik eksternal (seperti
8.8.8.8):gcloud network-management connectivity-tests create test-pod-to-internet \ --source-gke-pod=projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/k8s/namespaces/prod/pods/app-pod \ --destination-ip-address=8.8.8.8 \ --destination-port=53 \ --protocol=UDPPeriksa titik pelepasan:
- Dibatalkan di NetworkPolicy: Pod tidak memiliki NetworkPolicy keluar yang mengizinkan traffic ke
0.0.0.0/0. - Dihapus di Firewall VPC: aturan firewall VPC menolak traffic keluar dari subnet node.
- Dihapus di Cloud NAT atau Rute: subnet tidak memiliki rute default ke gateway internet atau Cloud NAT tidak dikonfigurasi untuk subnet.
- Dibatalkan di NetworkPolicy: Pod tidak memiliki NetworkPolicy keluar yang mengizinkan traffic ke
Tingkat 4: Observabilitas Gateway Eksternal dan Biaya (Internet dan NAT)
Tingkat gateway eksternal mengelola traffic keluar ke tujuan internet publik melalui Cloud NAT atau gateway eksternal. Kemampuan pengamatan di tingkat ini membantu mengidentifikasi workload dengan traffic keluar tinggi dan mengontrol biaya transfer data.
Mengidentifikasi traffic NAT (keluar ke internet)
Tinjau cakupan diagnostik dan prasyarat sebelum menganalisis traffic NAT dan internet keluar:
- Area fokus: traffic internet keluar, pemanfaatan port Cloud NAT, biaya transfer data eksternal.
- Prasyarat: Kemampuan Observasi Alur GKE Dataplane V2 diaktifkan.
- Kompatibilitas CNI: GKE Dataplane V2.
- Gejala: Error kehabisan port Cloud NAT atau biaya traffic keluar internet yang sangat tinggi dan tidak terduga.
- Tujuan: mengidentifikasi objek Pod dan Service GKE tertentu yang mengirimkan traffic ke endpoint internet eksternal.
Langkah 1: Pahami konsep "to-stack" dan "world" di GKE Dataplane V2
Di GKE Dataplane V2:
world: merepresentasikan tujuan apa pun di luar cluster GKE dan di luar VPC (internet publik).to-stack: menampilkan paket yang bertransisi dari antarmuka veth container eBPF ke stack jaringan Linux host untuk menjalani penyamaran IP (SNAT) sebelum mencapai Cloud NAT.
Langkah 2: Streaming dan filter traffic NAT dengan Hubble CLI
Streaming alur internet keluar langsung yang berasal dari cluster Anda:
# Stream egress flows heading to external internet ("world")
gke-hubble observe \
--traffic-direction egress \
--verdict FORWARDED \
--to-identity world \
--follow
Contoh output:
TIMESTAMP SOURCE DESTINATION TYPE VERDICT
10:25:01.120 default/worker-pod 142.250.190.46:443 to-stack FORWARDED
Untuk mengidentifikasi sumber traffic keluar teratas, Anda juga dapat menyalurkan output JSON Hubble ke
jq untuk menghitung aliran keluar eksternal menurut Pod:
timeout 60s gke-hubble observe \
--traffic-direction egress \
--verdict FORWARDED \
--to-identity world \
-o json | jq -r '.flow.source.namespace + "/" + .flow.source.pod_name' | sort | uniq -c | sort -nr | head -n 10
Langkah 3: Pantau traffic eksternal menggunakan metrik
Di Cloud Monitoring, lacak volume alur eksternal:
fetch prometheus_target
| metric 'prometheus.googleapis.com/pod_flow_egress_flows_count/counter'
| filter (metric.destination_identity == 'world')
| align rate(1m)
| every 1m
| group_by [metric.source_workload, metric.source_namespace], sum(val())
Menganalisis biaya dan performa traffic cluster menggunakan Flow Analyzer
Tinjau cakupan diagnostik dan prasyarat sebelum memvisualisasikan alur traffic dan biaya lintas zona:
- Area fokus: biaya transfer data lintas zona, top talker, visibilitas traffic antar-node tanpa kueri SQL.
- Prasyarat: Log Aliran VPC diaktifkan dengan
INCLUDE_ALL_METADATA; Visibilitas Intranode diaktifkan; Observability Analytics diaktifkan di bucket log. - Kompatibilitas CNI: semua cluster.
- Gejala: biaya transfer data antar-zona yang tinggi pada tagihan Google Cloud bulanan.
- Tujuan: mengidentifikasi secara visual workload GKE mana yang menghasilkan traffic lintas zona dan mengoptimalkan penempatan tanpa mengkueri log mentah.
Prasyarat
Untuk menggunakan Flow Analyzer untuk GKE:
- Log Aliran VPC: harus diaktifkan di subnet cluster dengan
metadata="INCLUDE_ALL_METADATA". - Visibilitas Intranode: harus diaktifkan di cluster agar traffic pod-ke-pod diekspos ke pipeline logging alur VPC.
- Log Analytics: bucket
_Defaultdi Cloud Logging harus diupgrade untuk menggunakan Observability Analytics.
Langkah 1: Identifikasi pembicara teratas GKE di Flow Analyzer
Untuk melihat beban kerja bervolume tinggi di Flow Analyzer, lakukan hal berikut:
- Di konsol Google Cloud , buka halaman Flow Analyzer.
- Klik Bucket sumber, lalu pilih bucket log yang menyimpan log alur Anda. Kecuali jika Anda telah merutekannya ke tempat lain, ini adalah bucket _Default.
- Di Traffic aggregation, pilih Source - Destination.
- Tetapkan rentang waktu untuk periode analisis Anda.
- Di bagian Atur alur menurut, pilih kolom Pod atau workload GKE.
- Klik Run new query. Diagram Highest data flows menunjukkan beban kerja mana yang memindahkan data paling banyak.
Langkah 2: Menganalisis biaya traffic antar-zona
Traffic lintas zona dikenai biaya transfer data. Untuk menemukan workload yang mengirimkan data lintas zona:
- Di bagian Atur alur menurut, pilih kolom zona sumber dan zona tujuan.
- Klik Run new query dan baca tabel All data flows. Baris dengan zona sumber dan tujuan yang berbeda adalah traffic lintas zona Anda. Filter Flow Analyzer cocok dengan nilai, sehingga Anda tidak dapat memfilter "tidak sama"; bandingkan pasangan zona dalam hasil.
- Luaskan pasangan zona bervolume tinggi untuk melihat workload GKE sumber dan tujuan yang mendasarinya.
Perbaikan:
- Terapkan
topologySpreadConstraintsataupodAffinityKubernetes untuk menempatkan layanan yang berkomunikasi di zona ketersediaan yang sama. - Aktifkan Topology Aware Routing (
service.kubernetes.io/topology-mode: Auto) di Layanan untuk menjaga traffic tetap berada dalam zona asal.
Langkah 3: Melihat perincian Observability Analytics (Untuk kueri SQL tingkat lanjut)
Dari Flow Analyzer, klik Lihat di Log Analytics untuk menjalankan kueri SQL terhadap data alur.
Kueri SQL berikut menghitung Pod lintas-zona yang paling banyak berkomunikasi:
SELECT
JSON_VALUE(json_payload.src_gke_details.pod.workload.workload_name) AS src_workload,
JSON_VALUE(json_payload.dest_gke_details.pod.workload.workload_name) AS dest_workload,
JSON_VALUE(json_payload.src_instance.zone) AS src_zone,
JSON_VALUE(json_payload.dest_instance.zone) AS dest_zone,
SUM(CAST(JSON_VALUE(json_payload.bytes_sent) AS INT64)) / 1024 / 1024 / 1024 AS total_gb_sent
FROM
`PROJECT_ID.global._Default._AllLogs`
WHERE
log_name LIKE '%vpc_flows%'
AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND JSON_VALUE(json_payload.src_instance.zone) != JSON_VALUE(json_payload.dest_instance.zone)
GROUP BY
1, 2, 3, 4
ORDER BY
total_gb_sent DESC
LIMIT 20;
Referensi Hubble CLI dan ringkasan kueri
Hubble CLI men-streaming dan memfilter data aliran jaringan live langsung dari buffer ring kernel GKE Dataplane V2.
Penyiapan: Buat alias helper
Karena Hubble berjalan di dalam bidang kontrol cluster, konfigurasikan alias shell untuk menjalankan perintah Hubble tanpa men-deploy biner lokal:
alias gke-hubble="kubectl exec -it -n gke-managed-dpv2-observability deployment/hubble-relay -c hubble-cli -- hubble"
Resep pemfilteran umum
| Memecahkan masalah sasaran | Perintah Hubble CLI |
|---|---|
| Mengamati semua paket yang di-drop secara real time di seluruh cluster | gke-hubble observe --verdict DROPPED --follow |
| Streaming semua traffic untuk Pod tertentu di namespace mana pun | gke-hubble observe --pod default/my-pod --follow |
| Memfilter traffic antara dua namespace tertentu | gke-hubble observe --from-namespace frontend --to-namespace backend |
| Mengisolasi traffic pada port tertentu (seperti Port 80) | gke-hubble observe --port 80 |
| Memeriksa kueri dan jawaban DNS langsung | gke-hubble observe --port 53 |
| Melihat reset TCP langsung (paket RST) | gke-hubble observe --type trace --verdict FORWARDED --tcp-flags RST |
| Mengalirkan semua traffic keluar yang menuju internet publik | gke-hubble observe --traffic-direction egress --to-identity world |
| Memeriksa traffic lapisan aplikasi HTTP (Lapisan 7 OSI) | gke-hubble observe --protocol http |
Pemfilteran lanjutan dengan negasi (--not)
Anda dapat mengecualikan traffic yang responsif atau bervolume tinggi yang diketahui untuk berfokus pada anomali:
# Observe drops, but exclude internal kube-system health probes and DNS
gke-hubble observe \
--verdict DROPPED \
--not --namespace kube-system \
--not --port 53
Pemformatan output dan integrasi jq
Untuk memproses rekaman alur secara terprogram, output dalam format JSON:
# Extract only source, destination, and drop reason from the last 100 flows
gke-hubble observe --verdict DROPPED -o json --last 100 | \
jq -r '[.time, .flow.source.pod_name, .flow.destination.pod_name, .flow.drop_reason_desc] | @tsv'
Batasan
Saat menggunakan Hubble CLI untuk pemecahan masalah langsung, perhatikan batasan teknis berikut:
- Buffer ring lokal node efemeral: Aliran Hubble disimpan dalam buffer ring dalam memori di setiap node. Selama peristiwa dengan traffic tinggi, log alur yang lebih lama akan ditimpa dalam hitungan detik. Untuk analisis historis, andalkan logging NetworkPolicy dan Log Aliran VPC di Cloud Logging.
- Tidak ada OR logis bawaan: Flag Hubble CLI mengevaluasi beberapa argumen menggunakan
AND logis. Untuk menelusuri beberapa kondisi (seperti Port 80 ATAU Port 443),
jalankan perintah terpisah atau filter output JSON menggunakan
jq.
Langkah berikutnya
- Praktik terbaik untuk kemampuan pengamatan jaringan
- Memecahkan masalah jaringan GKE
- Memecahkan masalah konektivitas di cluster Anda
- Tentang kemampuan observasi GKE Dataplane V2
- Memecahkan masalah data di Flow Analyzer