Service Mesh (ASM) trafik planlama paketi, belirli bir hizmete yönlendirilen trafik için genel kısıtlama, kullanıcıya özel kısıtlama, ani trafik pencereleri ve özel istek belirteci tüketim oranları gibi gelişmiş kısıtlama özellikleri sunar. RateLimitingPolicy kullanarak kullanıcıya özel kısıtlama uygulayabilirsiniz.
Genel bilgiler
ASM trafik planlama paketinin kısıtlama ilkeleri token bucket algoritmasını kullanır. Sistem sabit bir hızda belirteçler oluşturur ve paket kapasitesine ulaşana kadar bunları bir belirteç paketine ekler. Hizmetler arasındaki istekler paketten belirteç tüketir. Yeterli sayıda belirteç varsa istek işlenir. Belirteç yetersiz kalırsa istek sıraya alınabilir veya reddedilebilir. Bu yaklaşım, ortalama veri iletim hızının belirteç oluşturma hızını aşmamasını sağlarken belirli ölçüde ani trafike izin verir.
Ön koşullar
Sürümü 1.21.6.83 veya üzeri olan ASM örneğinize bir Container Service for Kubernetes (ACK) yönetilen kümesi eklenmiştir. Daha fazla bilgi için bkz. ASM örneğine küme ekleme.
kubectl kullanarak ACK kümesine bağlandınız. Daha fazla bilgi için bkz. kubectl kullanarak ACK kümesine bağlanma.
ASM trafik planlama paketi etkinleştirildi. Daha fazla bilgi için bkz. ASM trafik planlama paketini etkinleştirme.
ACK kümesindeki default ad alanı için otomatik sidecar proxy enjeksiyonu etkinleştirildi. Daha fazla bilgi için bkz. Global ad alanlarını yönetme.
ingressgateway adında bir giriş ağ geçidi oluşturuldu ve 80 bağlantı noktası etkinleştirildi. Daha fazla bilgi için bkz. Giriş ağ geçidi oluşturma.
Hazırlıklar
Örnek HTTPBin ve sleep hizmetlerini dağıtın ve sleep hizmetinin HTTPBin hizmetine erişip erişemediğini kontrol edin.
-
Aşağıdaki içeriği içeren bir httpbin.yaml dosyası oluşturun:
-
HTTPBin hizmetini dağıtmak için aşağıdaki komutu çalıştırın:
kubectl apply -f httpbin.yaml -n default -
Aşağıdaki içeriği içeren bir sleep.yaml dosyası oluşturun:
-
sleep hizmetini dağıtmak için aşağıdaki komutu çalıştırın:
kubectl apply -f sleep.yaml -n default -
sleep pod'una erişmek için aşağıdaki komutu çalıştırın:
kubectl exec -it deploy/sleep -- sh -
HTTPBin hizmetine istek göndermek için aşağıdaki komutu çalıştırın:
curl -I http://httpbin:8000/headersBeklenen çıktı:
HTTP/1.1 200 OK server: envoy date: Tue, 26 Dec 2023 07:23:49 GMT content-type: application/json content-length: 353 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 1200 OK yanıtı, erişimin başarılı olduğunu gösterir.
Adım 1: RateLimitingPolicy kullanarak bir kısıtlama ilkesi oluşturun
kubectl kullanarak ASM örneğine bağlanın. Daha fazla bilgi için bkz. Kontrol düzleminde kubectl üzerinden Istio kaynaklarına erişme.
-
Aşağıdaki içeriği içeren bir ratelimitingpolicy.yaml dosyası oluşturun:
apiVersion: istio.alibabacloud.com/v1 kind: RateLimitingPolicy metadata: name: ratelimit namespace: istio-system spec: rate_limiter: bucket_capacity: 2 fill_amount: 2 parameters: interval: 30s limit_by_label_key: http.request.header.user_id selectors: - agent_group: default control_point: ingress service: httpbin.default.svc.cluster.localAşağıdaki tabloda bazı alanlar açıklanmaktadır. Daha fazla bilgi için bkz. RateLimitingPolicy alan referansı.
Alan
Açıklama
fill_amount
interval alanında belirtilen her zaman aralığında pakete eklenen belirteç sayısıdır. Bu örnekte değer 2'dir; bu, her aralıktan sonra iki belirtecin eklendiği anlamına gelir.
interval
Belirteçlerin belirteç paketine eklendiği aralıktır. Bu örnekte değer 30s'dir; bu, her 30 saniyede bir iki belirtecin eklendiği anlamına gelir.
bucket_capacity
Belirteç paketindeki maksimum belirteç sayısıdır. İstek oranı doldurma hızından düşük olduğunda, belirteçlerbucket_capacitydeğerine ulaşana kadar birikir. Daha yüksek birbucket_capacitydeğeri, belirli ölçüde ani trafike izin verir. Bu örnekte değer fill_amount ile aynı şekilde 2'dir, dolayısıyla ani trafiğe izin verilmez.
limit_by_label_key
Kısıtlama ilkesi için istekleri gruplandırmada kullanılan etiket anahtarıdır. Farklı etiket değerlerine sahip istekler bağımsız belirteç paketleri kullanılarak ayrı ayrı kısıtlanır. Bu örnekte,http.request.header.user_idistekleriuser_idistek üstbilgisine göre gruplandırarak kullanıcıya özel kısıtlamayı simüle eder. Bu örnek, farklı kullanıcılardan gelen isteklerin farklıused_idistek üstbilgilerine sahip olduğunu varsayar.
selectors
Kısıtlama ilkesinin uygulandığı hizmetlerdir. Bu örnekte,service: httpbin.default.svc.cluster.localkısıtlamayıhttpbin.default.svc.cluster.localhizmetine uygular.
-
RateLimitingPolicy kullanarak bir kısıtlama ilkesi oluşturmak için aşağıdaki komutu çalıştırın:
kubectl apply -f ratelimitingpolicy.yaml
Adım 2: Kullanıcıya özel kısıtlama sonucunu doğrulayın
-
kubectl kullanarak ACK kümesine bağlanın ve ardından sleep hizmeti için bash kabuğunu başlatmak üzere aşağıdaki komutu çalıştırın:
kubectl exec -it deploy/sleep -- sh -
user1 olarak HTTPBin hizmetinin /headers yoluna art arda iki kez erişmek için aşağıdaki komutları çalıştırın:
curl -H "user_id: user1" httpbin:8000/headers -v curl -H "user_id: user1" httpbin:8000/headers -vBeklenen çıktı:
< HTTP/1.1 429 Too Many Requests < retry-after: 14 < date: Mon, 17 Jun 2024 11:48:53 GMT < server: envoy < content-length: 0 < x-envoy-upstream-service-time: 1 < * Connection #0 to host httpbin left intact -
Önceki adımın yürütülmesinden sonraki 30 saniye içinde, user2 olarak HTTPBin hizmetinin /headers yoluna bir kez erişmek için aşağıdaki komutu çalıştırın:
curl -H "user_id: user2" httpbin:8000/headers -vBeklenen çıktı:
< HTTP/1.1 200 OK < server: envoy < date: Mon, 17 Jun 2024 12:42:17 GMT < content-type: application/json < content-length: 378 < access-control-allow-origin: * < access-control-allow-credentials: true < x-envoy-upstream-service-time: 5 < { "headers": { "Accept": "*/*", "Host": "httpbin:8000", "User-Agent": "curl/8.1.2", "User-Id": "user2", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=ddab183a1502e5ededa933f83e90d3d5266e2ddf87555fb3da1ad40dde3c722e;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep" } } * Connection #0 to host httpbin left intactÇıktı, aynı yola erişen user2 için kısıtlamanın tetiklenmediğini gösterir; bu da kullanıcıya özel kısıtlamanın beklendiği gibi çalıştığını doğrular.
İlgili konular
RateLimitingPolicy'nin etkili olup olmadığını Grafana'da doğrulayabilirsiniz. Grafana için Prometheus örneğinin ASM trafik planlama paketi ile yapılandırıldığından emin olun.
Bir RateLimitingPolicy panosu oluşturmak için aşağıdaki içeriği Grafana'ya aktarın.
Aşağıdaki görselde pano gösterilmektedir.
