ASM支援通過編寫VirtualService和DestinationRule等資源,實現微服務的無侵入的流量治理能力,包括流量路由、限流、熔斷、鏡像流量等功能。本文介紹如何使用ASM路由級熔斷功能。
前提條件
已下載本文所需設定檔,具體請參見設定檔。
已建立ASM專業版執行個體,且版本為v1.13.4及以上。具體操作,請參見建立ASM執行個體。
已添加叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
已部署入口網關。具體操作,請參見建立入口網關。
已建立Bookinfo和Nginx服務。具體操作,請參見在ASM執行個體關聯的叢集中部署應用。
已通過kubectl串連ASM執行個體。具體操作,請參見通過控制面kubectl訪問Istio資源。
已部署網關規則。具體操作,請參見管理網關規則。
已建立虛擬服務。具體操作,請參見管理虛擬服務。
已安裝流量加壓工具。具體操作,請參見hey。
背景資訊
ASM支援在流量策略中配置熔斷功能,在網路訪問超出熔斷配置時能夠拒絕請求。在DestinationRule資源中,TrafficPolicy
欄位下有以下兩個熔斷配置項:
ConnectionPoolSettings
:為服務配置串連的數量。例如控制請求的最大數量,掛起請求,重試或者逾時。OutlierDetection
:用於從負載平衡池中剔除不健康的執行個體。
社區Istio提供的DestinationRule熔斷配置如下,更多資訊,請參見destination-rule。
社區Istio提供的熔斷功能,Envoy通過串連池實現對上遊叢集的限流熔斷,通過周期性的動態異常檢測來確定上遊叢集中的某些主機是否異常。如果發現異常,則將該主機從串連池中隔離出去。這本質上是針對上遊主機整體的熔斷。有以下兩個缺點:
僅支援服務等級熔斷,不支援某個API進行限流熔斷。
在路由規則後起作用,無法做到流量分發之前進行限流熔斷。
基於以上問題,ASM在資料面Envoy側進行了Filter鏈的擴充,通過com.aliyun.break filter
支援路由級熔斷能力,控制面通過 ASMCircuitBreaker
進行使用者側的透出。
本文以Bookinfo和Httpbin為例類比慢請求和錯誤請求。其中,Bookinfo部署在default命名空間,Httpbin服務部署在foo命名空間,ingressgateway網關部署在istio-system命名空間,Httpbin單獨部署在foo命名空間的測試後端服務,目的是為了驗證熔斷的開啟範圍。
適用情境
ASM路由級熔斷功能適用於ASM網關,支援HTTP和GRPC協議。您可以在ASMCircuitBreaker YAML檔案中添加istioGateway相關配置,本文以/httpbin
對應路由名稱為httpbin-route-name1
配置熔斷規則為例進行說明。
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMCircuitBreaker
metadata:
name: ingressgateway
namespace: istio-system
spec:
workloadSelector:
labels:
app: istio-ingressgateway
isGateway: true
configs:
- match:
vhost:
name: "bf2.example.com"
port: 80
route:
name_match: nginx-route-name1
breaker_config:
slow_request_rt: 0.1s
break_duration: 90s
window_size: 10s
max_slow_requests: 10
min_request_amount: 3
error_percent:
value: 60
custom_response:
header_to_add:
x-envoy-circuitbreak: "true"
body: "hello, break!"
status_code: 499
部分欄位說明如下。關於ASMCircuitBreaker欄位的詳細說明,請參見ASMCircuitBreaker CRD說明。
欄位 | 說明 |
| 作用於網關。 |
| 當請求響應的錯誤比例超過60%(最少請求3次時),觸發熔斷。 |
| 當慢請求次數超過10次時,觸發熔斷。 說明 慢請求是指請求回應時間RT(Reaction time)超出 |
| 每次熔斷的時間長度定義為90s。 |
配置並驗證熔斷規則
本文對bf2.example.com:80
這個VirtualHost下的某條路由進行限流配置,路由名稱為httpbin-route-name1
。
使用以下內容,建立asmcircuitbreaker-test-gw.yaml檔案。
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMCircuitBreaker metadata: name: ingressgateway namespace: istio-system spec: workloadSelector: labels: app: istio-ingressgateway isGateway: true configs: - match: vhost: name: "bf2.example.com" port: 80 route: name_match: httpbin-route-name1 breaker_config: slow_request_rt: 0.1s break_duration: 90s window_size: 10s max_slow_requests: 10 min_request_amount: 3 error_percent: value: 60 custom_response: header_to_add: x-envoy-overload: "true" body: "hello, break!" status_code: 499
執行以下命令,建立ASMCircuitBreaker。
kubectl apply -f asmcircuitbreaker-test-gw.yaml
執行以下命令,類比請求響應1s延遲或Httpbin響應500錯誤(連續請求10次左右)。
類比請求響應1s延遲:
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/delay/1 -v
類比Httpbin響應500錯誤:
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/status/500 -v
預期輸出:
< HTTP/1.1 499 Unknown < Content-Length: 12 < Content-Type: text/plain < x-envoy-overload: true < Date: Thu, 13 Jan 2022 03:03:09 GMT < Server: istio-envoy < Hello,Break!
由預期輸出得到,返回
Hello,Break!
,說明請求被熔斷。執行以下命令,訪問Bookinfo服務的
/productpage
介面。curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/productpage -v
在Productpage頁面返回
HTTP 200
響應,說明請求未被熔斷。