Menyelesaikan masalah proxy di Anthos Service Mesh
Dokumen ini menjelaskan masalah umum Anthos Service Mesh dan cara menyelesaikannya. Jika Anda memerlukan bantuan tambahan, lihat Mendapatkan dukungan.
Koneksi Ditolak saat mencapai endpoint dengan Istio
Anda mungkin sesekali mengalami error koneksi ditolak (ECONNREFUSED
)
dengan komunikasi dari cluster Anda ke endpoint, misalnya Memorystore
Redis, CloudSQL, atau layanan eksternal apa pun yang perlu dijangkau oleh
beban kerja aplikasi Anda.
Hal ini dapat terjadi saat beban kerja aplikasi Anda dimulai lebih cepat daripada
penampung istio-proxy (Envoy
) dan mencoba menjangkau endpoint eksternal. Karena pada tahap ini istio-init (initContainer
) telah dieksekusi, ada aturan iptables yang mengalihkan semua traffic keluar ke Envoy
. Karena istio-proxy belum siap, aturan iptables akan mengalihkan traffic ke proxy file bantuan yang belum dimulai, sehingga aplikasi akan mendapatkan error ECONNREFUSED
.
Langkah-langkah berikut menjelaskan cara memeriksa apakah ini adalah error yang Anda alami:
Periksa log stackdriver dengan Filter berikut untuk mengidentifikasi pod mana yang mengalami masalah.
Contoh berikut menunjukkan pesan error yang umum:
Error: failed to create connection to feature-store redis, err=dial tcp 192.168.9.16:19209: connect: connection refused [ioredis] Unhandled error event: Error: connect ECONNREFUSED
Telusuri kemunculan masalah. Jika Anda menggunakan Stackdriver lama, gunakan
resource.type="container"
.resource.type="k8s_container" textPayload:"$ERROR_MESSAGE$"
Luaskan kemunculan terakhir untuk mendapatkan nama pod, lalu catat
pod_name
di bagianresource.labels
.Dapatkan kemunculan masalah pertama untuk pod tersebut:
resource.type="k8s_container" resource.labels.pod_name="$POD_NAME$"
Contoh output:
E 2020-03-31T10:41:15.552128897Z post-feature-service post-feature-service-v1-67d56cdd-g7fvb failed to create connection to feature-store redis, err=dial tcp 192.168.9.16:19209: connect: connection refused post-feature-service post-feature-service-v1-67d56cdd-g7fvb
Catat stempel waktu error pertama untuk pod ini.
Gunakan filter berikut untuk melihat peristiwa startup pod.
resource.type="k8s_container" resource.labels.pod_name="$POD_NAME$"
Contoh output:
I 2020-03-31T10:41:15Z spec.containers{istio-proxy} Container image "docker.io/istio/proxyv2:1.3.3" already present on machine spec.containers{istio-proxy} I 2020-03-31T10:41:15Z spec.containers{istio-proxy} Created container spec.containers{istio-proxy} I 2020-03-31T10:41:15Z spec.containers{istio-proxy} Started container spec.containers{istio-proxy} I 2020-03-31T10:41:15Z spec.containers{APP-CONTAINER-NAME} Created container spec.containers{APP-CONTAINER-NAME} W 2020-03-31T10:41:17Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:26Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:28Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:31Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:58Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy}
Gunakan stempel waktu error dan peristiwa startup istio-proxy untuk mengonfirmasi bahwa error terjadi saat
Envoy
belum siap.Jika error terjadi saat penampung istio-proxy belum siap, wajar saja untuk mendapatkan error yang menolak koneksi. Pada contoh sebelumnya, pod mencoba terhubung ke Redis segera setelah
2020-03-31T10:41:15.552128897Z
, tetapi istio-proxy oleh2020-03-31T10:41:58Z
masih gagal dalam pemeriksaan kesiapan.Meskipun penampung istio-proxy dimulai terlebih dahulu, penampung tersebut mungkin belum siap cukup cepat sebelum aplikasi mencoba terhubung ke endpoint eksternal.
Jika ini adalah masalah yang Anda alami, maka lanjutkan dengan langkah-langkah pemecahan masalah berikut.
Menganotasi konfigurasi di level pod. Ini hanya tersedia pada level pod, bukan pada level global.
annotations: proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
Ubah kode aplikasi agar memeriksa apakah
Envoy
sudah siap sebelum mencoba membuat permintaan lain ke layanan eksternal. Misalnya, saat aplikasi dimulai, mulai loop yang membuat permintaan ke endpoint kondisi istio-proxy dan hanya berlanjut setelah diperoleh 200. Endpoint kondisi istio-proxy adalah sebagai berikut:http://localhost:15020/healthz/ready
Kondisi race selama injeksi sespan antara vault dan istio
Saat menggunakan vault
untuk pengelolaan secret, terkadang vault
memasukkan file bantuan
sebelum istio
, yang menyebabkan Pod tersebut terjebak dalam status Init
. Jika hal ini terjadi, Pod yang dibuat akan macet dalam status Init setelah memulai ulang deployment apa pun atau men-deploy yang baru. Contoh:
E 2020-03-31T10:41:15.552128897Z
post-feature-service post-feature-service-v1-67d56cdd-g7fvb failed to create
connection to feature-store redis, err=dial tcp 192.168.9.16:19209: connect:
connection refused post-feature-service post-feature-service-v1-67d56cdd-g7fvb
Masalah ini disebabkan oleh kondisi race, baik Istio maupun vault
memasukkan file bantuan dan Istio harus menjadi yang terakhir melakukan hal ini, proxy istio
tidak berjalan selama container init. Penampung init istio
menyiapkan aturan iptables untuk mengalihkan semua traffic ke proxy. Karena belum berjalan, aturan tersebut
tidak akan beralih ke apa pun sehingga akan memblokir semua traffic. Inilah alasan penampung init harus
menjadi yang terakhir, sehingga proxy aktif dan berjalan segera setelah aturan iptables
disiapkan. Sayangnya, urutannya tidak deterministik, jadi jika Istio dimasukkan
terlebih dahulu, urutannya akan rusak.
Untuk memecahkan masalah ini, izinkan alamat IP vault
agar traffic yang mengarah ke IP Vault tidak dialihkan ke Envoy Proxy yang belum siap, sehingga akan memblokir komunikasi. Untuk melakukannya, anotasi baru
bernama excludeOutboundIPRanges
harus ditambahkan.
Untuk Anthos Service Mesh terkelola, hal ini hanya dapat dilakukan pada Deployment atau level Pod dalam spec.template.metadata.annotations
, misalnya:
apiVersion: apps/v1
kind: Deployment
...
...
...
spec:
template:
metadata:
annotations:
traffic.sidecar.istio.io/excludeOutboundIPRanges:
Untuk Anthos Service Mesh dalam cluster, ada opsi untuk menetapkannya sebagai global dengan IstioOperator di spec.values.global.proxy.excludeIPRanges
, misalnya:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
values:
global:
proxy:
excludeIPRanges: ""
Setelah menambahkan anotasi, mulai ulang beban kerja Anda.