使用ASM路由級熔斷功能
ASM支持通過編寫VirtualService和DestinationRule等資源,實現(xiàn)微服務的無侵入的流量治理能力,包括流量路由、限流、熔斷、鏡像流量等功能。本文介紹如何使用ASM路由級熔斷功能。
前提條件
已下載本文所需配置文件,具體請參見配置文件。
已創(chuàng)建ASM專業(yè)版實例,且版本為v1.13.4及以上。具體操作,請參見創(chuàng)建ASM實例。
已添加集群到ASM實例。具體操作,請參見添加集群到ASM實例。
已部署入口網(wǎng)關(guān)。具體操作,請參見創(chuàng)建入口網(wǎng)關(guān)。
已創(chuàng)建Bookinfo和Nginx服務。具體操作,請參見在ASM實例關(guān)聯(lián)的集群中部署應用。
已通過kubectl連接ASM實例。具體操作,請參見通過控制面kubectl訪問Istio資源。
已部署網(wǎng)關(guān)規(guī)則。具體操作,請參見管理網(wǎng)關(guān)規(guī)則。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: bookinfo-gateway namespace: default spec: selector: istio: ingressgateway servers: - hosts: - bf2.example.com port: name: http number: 80 protocol: http
已創(chuàng)建虛擬服務。具體操作,請參見管理虛擬服務。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: bookinfo namespace: default spec: gateways: - bookinfo-gateway hosts: - bf2.example.com http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products name: productpage-route-name1 route: - destination: host: productpage port: number: 9080 - match: - uri: prefix: /httpbin name: httpbin-route-name1 rewrite: uri: / route: - destination: host: httpbin.foo.svc.cluster.local port: number: 80
已安裝流量加壓工具。具體操作,請參見hey。
背景信息
ASM支持在流量策略中配置熔斷功能,在網(wǎng)絡訪問超出熔斷配置時能夠拒絕請求。在DestinationRule資源中,TrafficPolicy
字段下有以下兩個熔斷配置項:
ConnectionPoolSettings
:為服務配置連接的數(shù)量。例如控制請求的最大數(shù)量,掛起請求,重試或者超時。OutlierDetection
:用于從負載均衡池中剔除不健康的實例。
社區(qū)Istio提供的DestinationRule熔斷配置如下,更多信息,請參見destination-rule。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 100
社區(qū)Istio提供的熔斷功能,Envoy通過連接池實現(xiàn)對上游集群的限流熔斷,通過周期性的動態(tài)異常檢測來確定上游集群中的某些主機是否異常。如果發(fā)現(xiàn)異常,則將該主機從連接池中隔離出去。這本質(zhì)上是針對上游主機整體的熔斷。有以下兩個缺點:
僅支持服務級別熔斷,不支持某個API進行限流熔斷。
在路由規(guī)則后起作用,無法做到流量分發(fā)之前進行限流熔斷。
基于以上問題,ASM在數(shù)據(jù)面Envoy側(cè)進行了Filter鏈的擴展,通過com.aliyun.break filter
支持路由級熔斷能力,控制面通過 ASMCircuitBreaker
進行用戶側(cè)的透出。
本文以Bookinfo和Httpbin為例模擬慢請求和錯誤請求。其中,Bookinfo部署在default命名空間,Httpbin服務部署在foo命名空間,ingressgateway網(wǎng)關(guān)部署在istio-system命名空間,Httpbin單獨部署在foo命名空間的測試后端服務,目的是為了驗證熔斷的開啟范圍。
適用場景
ASM路由級熔斷功能適用于ASM網(wǎng)關(guān),支持HTTP和GRPC協(xié)議。您可以在ASMCircuitBreaker YAML文件中添加istioGateway相關(guān)配置,本文以/httpbin
對應路由名稱為httpbin-route-name1
配置熔斷規(guī)則為例進行說明。
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
部分字段說明如下。關(guān)于ASMCircuitBreaker字段的詳細說明,請參見ASMCircuitBreaker CRD說明。
字段 | 說明 |
| 作用于網(wǎng)關(guān)。 |
| 當請求響應的錯誤比例超過60%(最少請求3次時),觸發(fā)熔斷。 |
| 當慢請求次數(shù)超過10次時,觸發(fā)熔斷。 說明 慢請求是指請求響應時間RT(Reaction time)超出 |
| 每次熔斷的時長定義為90s。 |
配置并驗證熔斷規(guī)則
本文對bf2.example.com:80
這個VirtualHost下的某條路由進行限流配置,路由名稱為httpbin-route-name1
。
使用以下內(nèi)容,創(chuàng)建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
執(zhí)行以下命令,創(chuàng)建ASMCircuitBreaker。
kubectl apply -f asmcircuitbreaker-test-gw.yaml
執(zhí)行以下命令,模擬請求響應1s延遲或Httpbin響應500錯誤(連續(xù)請求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!
,說明請求被熔斷。執(zhí)行以下命令,訪問Bookinfo服務的
/productpage
接口。curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/productpage -v
在Productpage頁面返回
HTTP 200
響應,說明請求未被熔斷。