Pemutusan sirkuit adalah mekanisme manajemen lalu lintas yang melindungi sistem dari kerusakan lebih lanjut akibat kegagalan atau beban berlebih. Dalam layanan Java tradisional, framework seperti Resilience4j dapat digunakan untuk mengimplementasikan pemutusan sirkuit. Istio memungkinkan implementasi pemutusan sirkuit di tingkat jaringan tanpa perlu integrasi kode aplikasi pada setiap layanan. Anda dapat mengonfigurasi kolom connectionPool untuk menerapkan pemutusan sirkuit, meningkatkan stabilitas dan keandalan sistem serta melindungi layanan dari permintaan abnormal.
Prasyarat
Kluster Container Service for Kubernetes (ACK) telah ditambahkan ke instance Service Mesh (ASM). Untuk informasi lebih lanjut, lihat Tambahkan kluster ke instance ASM.
Pengaturan connectionPool
Sebelum mengaktifkan fitur pemutusan sirkuit, buat aturan tujuan untuk mengonfigurasi pemutusan sirkuit pada layanan tujuan yang diinginkan. Untuk detail tentang kolom dalam aturan tujuan, lihat Destination Rule.
Kolom connectionPool mendefinisikan parameter terkait pemutusan sirkuit. Tabel berikut menjelaskan parameter dari kolom connectionPool.
Parameter | Tipe | Diperlukan | Deskripsi | Nilai default |
| int32 | Tidak | Jumlah maksimum koneksi HTTP1 atau TCP ke host tujuan. Batasan jumlah koneksi berlaku pada proxy sidecar di kedua sisi klien dan server. Pod klien tunggal tidak dapat memulai lebih dari jumlah koneksi yang dikonfigurasi ke server. Server tunggal tidak dapat menerima lebih dari jumlah koneksi yang dikonfigurasi. Jumlah koneksi yang dapat diterima oleh layanan aplikasi di server dihitung menggunakan rumus berikut: min(Jumlah pod klien, jumlah pod server) × maxConnections. | 2³²-1 |
| int32 | Tidak | Jumlah maksimum permintaan yang akan diantrekan saat menunggu koneksi kolam koneksi siap. | 1024 |
| int32 | Tidak | Jumlah maksimum permintaan aktif ke layanan backend. | 1024 |
Parameter ini bekerja dengan jelas dalam skenario sederhana dengan satu klien dan satu instance layanan tujuan. Dalam lingkungan Kubernetes, satu instance setara dengan pod. Namun, dalam lingkungan produksi, skenario berikut lebih umum:
Satu instance klien dan beberapa instance layanan tujuan
Beberapa instance klien dan satu instance layanan tujuan
Beberapa instance klien dan beberapa instance layanan tujuan
Dalam skenario yang berbeda, sesuaikan nilai-nilai parameter ini berdasarkan kebutuhan bisnis untuk memastikan kolam koneksi dapat beradaptasi dengan lingkungan beban tinggi dan kompleks serta memberikan performa dan keandalan yang baik. Bagian berikut menyediakan contoh konfigurasi kolam koneksi dalam skenario sebelumnya untuk membantu Anda memahami batasan konfigurasi pada klien dan server. Kemudian, Anda dapat mengonfigurasi kebijakan pemutusan sirkuit yang sesuai untuk lingkungan produksi.
Contoh konfigurasi
Dalam topik ini, dua skrip Python dibuat: satu untuk layanan tujuan (server) dan lainnya untuk layanan pemanggil (klien).
Skrip server membuat aplikasi Flask dengan satu titik akhir pada rute root. Saat mengakses rute root, server tidur selama 5 detik lalu mengembalikan string
"Hello World!"dalam format JSON.Skrip klien memanggil titik akhir server dengan mengirimkan 10 permintaan secara paralel sekaligus, lalu tidur sejenak sebelum mengirimkan batch berikutnya dari 10 permintaan. Skrip melakukan ini dalam loop tak terbatas. Untuk memastikan semua pod klien mengirimkan batch 10 permintaan pada waktu yang sama ketika beberapa pod klien berjalan, batch 10 permintaan dikirimkan pada detik ke-0, ke-20, dan ke-40 setiap menit (menurut waktu sistem).
Menyebarkan aplikasi sampel
Buat file YAML dengan konten berikut lalu jalankan perintah
kubectl apply -f ${nama file YAML}.yamluntuk menyebarkan aplikasi sampel.Jalankan perintah berikut untuk melihat pod klien dan server:
kubectl get po |grep circuitOutput yang diharapkan:
circuit-breaker-sample-client-d4f64d66d-fwrh4 2/2 Running 0 1m22s circuit-breaker-sample-server-6d6ddb4b-gcthv 2/2 Running 0 1m22s
Jika tidak ada batasan yang didefinisikan dalam aturan tujuan, server dapat menangani 10 permintaan bersamaan dari klien. Oleh karena itu, kode respons yang dikembalikan oleh server selalu 200. Blok kode berikut menunjukkan log klien:
----------Info----------
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.016539812088013
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.012614488601685
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.015984535217285
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.015599012374878
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.012874364852905
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.018714904785156
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.010422468185425
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.012431621551514
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.011001348495483
Status: 200, Start: 02:39:20, End: 02:39:25, Waktu Berlalu: 5.01432466506958Konfigurasikan kolom connectionPool
Untuk mengaktifkan pemutusan sirkuit untuk layanan tujuan menggunakan teknologi mesh layanan, cukup definisikan aturan tujuan yang sesuai untuk layanan tersebut.
Gunakan konten berikut untuk membuat aturan tujuan untuk layanan tujuan sampel. Untuk informasi lebih lanjut, lihat Kelola aturan tujuan. Aturan tujuan ini membatasi jumlah koneksi TCP ke layanan tujuan menjadi 5.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: circuit-breaker-sample-server
spec:
host: circuit-breaker-sample-server
trafficPolicy:
connectionPool:
tcp:
maxConnections: 5Skenario 1: Satu pod klien dan satu pod untuk layanan tujuan
Mulai pod klien dan pantau log.
Disarankan untuk memulai ulang klien guna mendapatkan hasil statistik yang lebih intuitif. Log berikut dapat diamati:
----------Info---------- Status: 200, Start: 02:49:40, End: 02:49:45, Waktu Berlalu: 5.0167787075042725 Status: 200, Start: 02:49:40, End: 02:49:45, Waktu Berlalu: 5.011920690536499 Status: 200, Start: 02:49:40, End: 02:49:45, Waktu Berlalu: 5.017078161239624 Status: 200, Start: 02:49:40, End: 02:49:45, Waktu Berlalu: 5.018405437469482 Status: 200, Start: 02:49:40, End: 02:49:45, Waktu Berlalu: 5.018689393997192 Status: 200, Start: 02:49:40, End: 02:49:50, Waktu Berlalu: 10.018936395645142 Status: 200, Start: 02:49:40, End: 02:49:50, Waktu Berlalu: 10.016417503356934 Status: 200, Start: 02:49:40, End: 02:49:50, Waktu Berlalu: 10.019930601119995 Status: 200, Start: 02:49:40, End: 02:49:50, Waktu Berlalu: 10.022735834121704 Status: 200, Start: 02:49:40, End: 02:49:55, Waktu Berlalu: 15.02303147315979Log menunjukkan bahwa semua permintaan berhasil. Namun, hanya lima permintaan dalam setiap batch yang direspons dalam waktu sekitar 5 detik. Permintaan lainnya direspons dalam 10 detik atau lebih. Ini menunjukkan bahwa penggunaan hanya
tcp.maxConnectionsmenghasilkan permintaan berlebih yang diantrekan, menunggu koneksi dibebaskan. Secara default, jumlah permintaan yang dapat diantrekan adalah 2³² - 1.Gunakan konten berikut untuk memperbarui aturan tujuan agar hanya memungkinkan satu permintaan tertunda. Untuk informasi lebih lanjut, lihat Kelola aturan tujuan.
Untuk mewujudkan pemutusan sirkuit (fail-fast), atur
http.http1MaxPendingRequestsuntuk membatasi jumlah permintaan yang dapat diantrekan. Nilai default parameter http1MaxPendingRequests adalah 1024. Jika nilainya diatur menjadi 0, maka akan kembali ke nilai default. Oleh karena itu, atur nilainya setidaknya menjadi 1.apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: circuit-breaker-sample-server spec: host: circuit-breaker-sample-server trafficPolicy: connectionPool: tcp: maxConnections: 5 http: http1MaxPendingRequests: 1Mulai ulang pod klien untuk mendapatkan statistik yang benar dan pantau log.
Log sampel:
----------Info---------- Status: 503, Start: 02:56:40, End: 02:56:40, Waktu Berlalu: 0.005339622497558594 Status: 503, Start: 02:56:40, End: 02:56:40, Waktu Berlalu: 0.007254838943481445 Status: 503, Start: 02:56:40, End: 02:56:40, Waktu Berlalu: 0.0044133663177490234 Status: 503, Start: 02:56:40, End: 02:56:40, Waktu Berlalu: 0.008964776992797852 Status: 200, Start: 02:56:40, End: 02:56:45, Waktu Berlalu: 5.018309116363525 Status: 200, Start: 02:56:40, End: 02:56:45, Waktu Berlalu: 5.017424821853638 Status: 200, Start: 02:56:40, End: 02:56:45, Waktu Berlalu: 5.019804954528809 Status: 200, Start: 02:56:40, End: 02:56:45, Waktu Berlalu: 5.01643180847168 Status: 200, Start: 02:56:40, End: 02:56:45, Waktu Berlalu: 5.025975227355957 Status: 200, Start: 02:56:40, End: 02:56:50, Waktu Berlalu: 10.01716136932373Log menunjukkan bahwa empat permintaan segera dibatasi, lima permintaan dikirim ke layanan tujuan, dan satu permintaan diantrekan.
Jalankan perintah berikut untuk melihat jumlah koneksi aktif yang didirikan oleh proxy Istio klien dengan pod layanan tujuan:
kubectl exec $(kubectl get pod --selector app=circuit-breaker-sample-client --output jsonpath='{.items[0].metadata.name}') -c istio-proxy -- curl -X POST http://localhost:15000/clusters | grep circuit-breaker-sample-server | grep cx_activeOutput yang diharapkan:
outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local::172.20.192.124:9080::cx_active::5Output menunjukkan bahwa lima koneksi aktif didirikan antara proxy Istio klien dan pod layanan tujuan.
Skenario 2: Satu pod klien dan beberapa pod untuk layanan tujuan
Bagian ini memverifikasi apakah batas koneksi diterapkan pada tingkat pod atau tingkat layanan. Anggaplah ada satu pod klien dan tiga pod untuk layanan tujuan.
Jika batas koneksi diterapkan pada tingkat pod, setiap pod layanan tujuan memiliki maksimal lima koneksi.
Dalam hal ini, tidak ada pembatasan atau pengantrean yang diamati karena jumlah koneksi maksimum yang diizinkan adalah 15 (3 pod dikalikan dengan 5 koneksi per pod). Karena hanya 10 permintaan yang dikirim sekaligus, semua permintaan harus berhasil dan direspons dalam waktu sekitar 5 detik.
Jika batas koneksi diterapkan pada tingkat layanan, tidak peduli berapa banyak pod yang berjalan untuk layanan tujuan, total maksimum lima koneksi yang diizinkan.
Dalam hal ini, empat permintaan segera dibatasi, lima permintaan dikirim ke layanan tujuan, dan satu permintaan diantrekan.
Jalankan perintah berikut untuk menskalakan penyebaran layanan tujuan menjadi tiga replika:
kubectl scale deployment/circuit-breaker-sample-server --replicas=3Mulai ulang pod klien dan pantau log.
Log sampel:
----------Info---------- Status: 503, Start: 03:06:20, End: 03:06:20, Waktu Berlalu: 0.011791706085205078 Status: 503, Start: 03:06:20, End: 03:06:20, Waktu Berlalu: 0.0032286643981933594 Status: 503, Start: 03:06:20, End: 03:06:20, Waktu Berlalu: 0.012153387069702148 Status: 503, Start: 03:06:20, End: 03:06:20, Waktu Berlalu: 0.011871814727783203 Status: 200, Start: 03:06:20, End: 03:06:25, Waktu Berlalu: 5.012892484664917 Status: 200, Start: 03:06:20, End: 03:06:25, Waktu Berlalu: 5.013102769851685 Status: 200, Start: 03:06:20, End: 03:06:25, Waktu Berlalu: 5.016939163208008 Status: 200, Start: 03:06:20, End: 03:06:25, Waktu Berlalu: 5.014261484146118 Status: 200, Start: 03:06:20, End: 03:06:25, Waktu Berlalu: 5.01246190071106 Status: 200, Start: 03:06:20, End: 03:06:30, Waktu Berlalu: 10.021712064743042Log menunjukkan pembatasan dan pengantrean serupa seperti yang ditunjukkan dalam blok kode sebelumnya, yang berarti meningkatkan jumlah instance layanan tujuan tidak meningkatkan batas koneksi untuk klien. Ini menunjukkan bahwa batas koneksi diterapkan pada tingkat layanan.
Jalankan perintah berikut untuk melihat jumlah koneksi aktif yang didirikan oleh proxy Istio klien dengan pod layanan tujuan:
kubectl exec $(kubectl get pod --selector app=circuit-breaker-sample-client --output jsonpath='{.items[0].metadata.name}') -c istio-proxy -- curl -X POST http://localhost:15000/clusters | grep circuit-breaker-sample-server | grep cx_activeOutput yang diharapkan:
outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local::172.20.192.124:9080::cx_active::2 outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local::172.20.192.158:9080::cx_active::2 outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local::172.20.192.26:9080::cx_active::2Output menunjukkan bahwa proxy Istio klien mendirikan dua koneksi aktif dengan setiap pod layanan tujuan. Total enam, bukan lima, koneksi didirikan. Seperti disebutkan dalam dokumentasi Envoy dan Istio, proxy memungkinkan beberapa toleransi dalam hal jumlah koneksi.
Skenario 3: Beberapa pod klien dan satu pod untuk layanan tujuan
Jalankan perintah berikut untuk menyesuaikan jumlah replika untuk layanan tujuan dan klien:
kubectl scale deployment/circuit-breaker-sample-server --replicas=1 kubectl scale deployment/circuit-breaker-sample-client --replicas=3Mulai ulang pod klien dan pantau log.
Log menunjukkan bahwa jumlah kesalahan 503 pada setiap klien meningkat. Sistem hanya mengizinkan lima permintaan bersamaan dari ketiga pod klien.
Lihat log proxy klien.
Anda dapat melihat dua jenis log berbeda untuk permintaan yang dibatasi. Kode kesalahan 503 dikembalikan untuk permintaan tersebut. Log menunjukkan bahwa bidang
RESPONSE_FLAGSmemiliki dua nilai:UOdanURX.UO: menunjukkan limpahan upstream (pemutusan sirkuit).URX: menunjukkan bahwa permintaan ditolak karena kondisi pengulangan untuk permintaan HTTP upstream tidak terpenuhi atau jumlah maksimum percobaan koneksi TCP telah tercapai.
Berdasarkan nilai bidang lainnya dalam log, seperti
DURATION,UPSTREAM_HOST, danUPSTREAM_CLUSTER, kita dapat menyimpulkan lebih lanjut sebagai berikut:Permintaan dengan flag
UOdibatasi secara lokal oleh proxy klien, dan permintaan dengan flagURXditolak oleh proxy layanan tujuan.Verifikasi kebenaran kesimpulan pada langkah sebelumnya dan periksa log proxy layanan tujuan.
Seperti yang diharapkan, kode respons 503 muncul dalam log proxy layanan tujuan. Itulah alasan mengapa log proxy klien berisi
"response_code":"503"dan"response_flags":"URX".
Secara keseluruhan, proxy klien mengirimkan permintaan sesuai dengan batas bahwa hingga lima koneksi diizinkan untuk setiap pod, dan membatasi atau mengantrekan permintaan berlebih menggunakan flag respons UO. Ketiga proxy klien dapat mengirimkan hingga 15 permintaan paralel di awal batch. Namun, hanya lima permintaan yang dapat berhasil dikirim karena proxy layanan tujuan juga membatasi jumlah koneksi menjadi lima. Proxy layanan tujuan hanya menerima lima permintaan dan membatasi sisanya. Permintaan yang dibatasi ditandai oleh flag URX dalam log proxy klien.
Gambar berikut menunjukkan bagaimana permintaan dikirim dari beberapa pod klien ke satu pod layanan tujuan dalam skenario sebelumnya.
Skenario 4: Beberapa pod untuk klien dan layanan tujuan
Saat meningkatkan jumlah replika layanan tujuan, tingkat keberhasilan keseluruhan permintaan naik karena setiap proxy layanan tujuan mengizinkan lima permintaan paralel. Dengan cara ini, pembatasan pada proxy klien dan proxy layanan tujuan dapat diamati.
Jalankan perintah berikut untuk meningkatkan jumlah replika layanan tujuan menjadi 2 dan jumlah replika klien menjadi 3:
kubectl scale deployment/circuit-breaker-sample-server --replicas=2 kubectl scale deployment/circuit-breaker-sample-client --replicas=3Anda dapat melihat bahwa 10 permintaan berhasil dari total 30 permintaan yang dihasilkan oleh semua 3 proxy klien dalam satu batch.
Jalankan perintah berikut untuk meningkatkan jumlah replika layanan tujuan menjadi 3:
kubectl scale deployment/circuit-breaker-sample-server --replicas=3Anda dapat melihat bahwa 15 permintaan berhasil.
Jalankan perintah berikut untuk meningkatkan jumlah replika layanan tujuan menjadi 4:
kubectl scale deployment/circuit-breaker-sample-server --replicas=3Setelah jumlah replika layanan tujuan ditingkatkan dari 3 menjadi 4, Anda masih melihat hanya 15 permintaan yang berhasil. Batas pada proxy klien berlaku untuk seluruh layanan tujuan tanpa memperhatikan jumlah replika yang dimiliki layanan tujuan. Oleh karena itu, terlepas dari jumlah replika yang dimiliki layanan tujuan, setiap proxy klien dapat mengirimkan maksimal lima permintaan bersamaan ke layanan tujuan.
Operasi terkait
Lihat metrik terkait pemutusan sirkuit kolam koneksi
Pemutusan sirkuit kolam koneksi diimplementasikan dengan membatasi jumlah maksimum koneksi TCP ke host tujuan. Saat pemutusan sirkuit terjadi, serangkaian metrik terkait dihasilkan. Metrik ini membantu Anda menentukan apakah pemutusan sirkuit terjadi. Tabel berikut menjelaskan beberapa metrik.
Metrik | Tipe | Deskripsi |
envoy_cluster_circuit_breakers_default_cx_open | Gauge | Menunjukkan apakah pemutusan sirkuit dipicu untuk kolam koneksi. Nilai 1 menunjukkan bahwa pemutusan sirkuit dipicu. Nilai 0 menunjukkan bahwa pemutusan sirkuit tidak dipicu. |
envoy_cluster_circuit_breakers_default_rq_pending_open | Gauge | Menunjukkan apakah jumlah permintaan yang akan diantrekan saat menunggu koneksi kolam koneksi siap telah melebihi nilai yang diberikan. Nilainya adalah 1 jika jumlah permintaan telah melebihi nilai yang diberikan. Nilainya adalah 0 jika jumlah permintaan belum melebihi nilai yang diberikan. |
Anda dapat mengonfigurasi proxyStatsMatcher untuk proxy sidecar untuk mengaktifkan proxy sidecar melaporkan metrik terkait pemutusan sirkuit. Kemudian, Anda dapat menggunakan Prometheus untuk mengumpulkan dan melihat metrik tersebut.
Konfigurasikan proxyStatsMatcher untuk mengaktifkan proxy sidecar melaporkan metrik terkait pemutusan sirkuit. Setelah memilih proxyStatsMatcher, pilih Regular Expression Match dan atur nilainya menjadi
.*circuit_breaker.*. Untuk informasi lebih lanjut, lihat Konfigurasikan proxyStatsMatcher.Redeploy Deployment untuk circuit-breaker-sample-server dan circuit-breaker-sample-client. Untuk informasi lebih lanjut, lihat Redeploy workloads.
Lengkapi konfigurasi pemutusan sirkuit kolam koneksi dan lakukan pengujian permintaan dengan mengikuti langkah-langkah sebelumnya.
Jalankan perintah berikut untuk melihat metrik terkait pemutusan sirkuit kolam koneksi untuk layanan circuit-breaker-sample-client:
kubectl exec -it deploy/circuit-breaker-sample-client -c istio-proxy -- curl localhost:15090/stats/prometheus | grep circuit_breaker | grep circuit-breaker-sample-serverOutput yang diharapkan:
kubectl exec -it deploy/circuit-breaker-sample-client -c istio-proxy -- curl localhost:15090/stats/prometheus | grep circuit_breaker | grep circuit-breaker-sample-server envoy_cluster_circuit_breakers_default_cx_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 1 envoy_cluster_circuit_breakers_default_cx_pool_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_default_remaining_cx{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_default_remaining_cx_pools{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 18446744073709551613 envoy_cluster_circuit_breakers_default_remaining_pending{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 1 envoy_cluster_circuit_breakers_default_remaining_retries{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 4294967295 envoy_cluster_circuit_breakers_default_remaining_rq{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 4294967295 envoy_cluster_circuit_breakers_default_rq_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_default_rq_pending_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_default_rq_retry_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_high_cx_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_high_cx_pool_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_high_rq_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_high_rq_pending_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0 envoy_cluster_circuit_breakers_high_rq_retry_open{cluster_name="outbound|9080||circuit-breaker-sample-server.default.svc.cluster.local"} 0
Konfigurasikan pengumpulan metrik dan peringatan untuk pemutusan sirkuit kolam koneksi
Setelah mengonfigurasi metrik terkait pemutusan sirkuit kolam koneksi, Anda dapat mengonfigurasi pengfigurasi untuk mengumpulkan metrik ke Prometheus dan menetapkan aturan peringatan berdasarkan metrik utama. Dengan cara ini, peringatan dapat dihasilkan saat pemutusan sirkuit terjadi. Bagian berikut mendemonstrasikan cara mengonfigurasi pengumpulan metrik dan peringatan untuk pemutusan sirkuit kolam koneksi. Dalam contoh ini, Managed Service for Prometheus digunakan.
Dalam Managed Service for Prometheus, Anda dapat menghubungkan kluster pada data plane ke komponen Alibaba Cloud ASM atau meningkatkan komponen ke versi terbaru. Ini memastikan bahwa metrik terkait pemutusan sirkuit yang diekspos dapat dikumpulkan oleh Managed Service for Prometheus. Untuk informasi lebih lanjut tentang cara mengintegrasikan komponen ke ARMS, lihat Kelola komponen. (Jika Anda telah mengonfigurasi instance Prometheus yang dikelola sendiri untuk mengumpulkan metrik instance ASM dengan merujuk ke Pantau instance ASM menggunakan instance Prometheus yang dikelola sendiri, Anda tidak perlu melakukan langkah ini.)
Buat aturan peringatan untuk pemutusan sirkuit kolam koneksi. Untuk informasi lebih lanjut, lihat Gunakan pernyataan PromQL kustom untuk membuat aturan peringatan. Contoh berikut mendemonstrasikan cara menentukan parameter utama untuk mengonfigurasi aturan peringatan. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter lainnya, lihat dokumentasi sebelumnya.
Parameter | Contoh | Deskripsi |
Pernyataan PromQL Kustom | (sum by(cluster_name, pod_name,namespace) (envoy_cluster_circuit_breakers_default_cx_open)) != 0 | Dalam contoh, metrik envoy_cluster_circuit_breakers_default_cx_open diquery untuk menentukan apakah pemutusan sirkuit sedang terjadi di kolam koneksi kluster saat ini. Berdasarkan nama host layanan upstream dan nama pod yang melaporkan metrik, Anda dapat menentukan lokasi di mana pemutusan sirkuit terjadi. |
Pesan Peringatan | Pemutusan sirkuit terjadi untuk kolam koneksi. Jumlah koneksi TCP yang didirikan oleh proxy sidecar telah mencapai batas atas. Namespace: {{$labels.namespace}}, Pod tempat pemutusan sirkuit untuk kolam koneksi terjadi:{{$labels.pod_name}}, Informasi tentang layanan upstream: {{ $labels.cluster_name }} | Informasi peringatan dalam contoh menunjukkan pod tempat pemutusan sirkuit untuk kolam koneksi terjadi, layanan upstream ke mana pod tersebut terhubung, dan namespace ke mana pod tersebut milik. |
Batasan pada konfigurasi kolam koneksi
Tabel berikut menjelaskan batasan pada konfigurasi kolom connectionPool pada klien dan layanan tujuan.
Peran | Deskripsi |
Klien | Setiap proxy klien menerapkan batas secara independen. Jika batas jumlah permintaan adalah 100, setiap proxy klien dapat memiliki 100 permintaan yang tertunda sebelum pembatasan lokal diterapkan. Jika N klien memanggil layanan tujuan, jumlah maksimum permintaan tertunda yang didukung adalah hasil kali 100 dan N. Batas pada proxy klien berlaku untuk seluruh layanan tujuan, bukan untuk satu replika layanan tujuan. Bahkan jika layanan tujuan berjalan dalam 200 pod aktif, maksimal 100 permintaan diizinkan. |
Layanan tujuan | Batas berlaku untuk setiap proxy layanan tujuan. Jika layanan berjalan dalam 50 pod aktif, setiap pod dapat memiliki hingga 100 permintaan tertunda yang dikirim dari proxy klien sebelum pembatasan dipicu dan kode respons 503 dikembalikan. |