K8S Istio 流量管理之熔斷

熔斷是創建彈性微服務應用的重要特性,使用熔斷可以對併發連接太多,請求過頻等做出主動防禦,避免服務鏈條因單一故障問題而出現雪崩效應。

因熔斷設置針對的是具體的目標主機,所以 Istio 使用 Destination Rule 來進行配置。

本文使用 Istio 自帶的 httpbin 樣例來設定熔斷配置,然後使用 fortio 客戶端模擬併發請求來觸發熔斷。

1 httpbin 樣例部署

httpbin 是一個專門用來做 HTTP 請求測試的服務。

使用 samples 下自帶的部署腳本將其部署。

cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/httpbin/httpbin.yaml

2 fortio 客戶端部署

fortio 是一個專門用來做 HTTP 及 gRPC 測試的客戶端。

使用 samples 下自帶的部署腳本將其部署。

cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/httpbin/sample-client/fortio-deploy.yaml

查看 Pod,其已部署完成。

$ kubectl get pods -n istio-demo | grep fortio

在該 Pod 執行命令,對 httpbin 發起請求,響應顯示請求成功。

$ kubectl exec fortio-deploy-576dbdfbc4-8gr9c -c fortio -n istio-demo -- /usr/bin/fortio curl -quiet http://httpbin:8000/get

HTTP/1.1 200 OK
server: envoy
date: Tue, 29 Dec 2020 00:57:53 GMT
content-type: application/json
content-length: 628
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 3

{
  "args"{}, 
  "headers"{
    "Content-Length""0", 
    "Host""httpbin:8000", 
    "User-Agent""fortio.org/fortio-1.11.3", 
    "X-B3-Parentspanid""5eaef1e4a496b17b", 
    "X-B3-Sampled""1", 
    "X-B3-Spanid""39a6ff187e9d25f3", 
    "X-B3-Traceid""cb07253ba49f9fb05eaef1e4a496b17b", 
    "X-Envoy-Attempt-Count""1", 
    "X-Forwarded-Client-Cert""By=spiffe://cluster.local/ns/istio-demo/sa/httpbin;Hash=d7126b5e272db10e8d7fc2e5a68d724fa01b7bd4fbbe3b21c830156d8ac0c647;Subject=\"\";URI=spiffe://cluster.local/ns/istio-demo/sa/default"
  }, 
  "origin""127.0.0.1", 
  "url""http://httpbin:8000/get"
}

設定併發連接數爲 2(-c 2),一次發送 20 個請求(-n 20),報告顯示 Code 均爲 200。

$ kubectl exec fortio-deploy-576dbdfbc4-8gr9c -c fortio -n istio-demo -- /usr/bin/fortio load -c 2 -qps 0 -n 20 http://httpbin:8000/get

...
Code 200 : 20 (100.0 %)
...

3 熔斷測試

對 httpbin 配置 Destination Rule,設置熔斷參數。

$ kubectl apply -n istio-demo -f - <<EOF
heredoc> apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutiveErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100
heredoc> EOF

重新使用 fortio 客戶端進行測試:設定併發連接數爲 2(-c 2),一次發送 20 個請求(-n 20),報告顯示 25.0% 的請求返回 Code 503。

$ kubectl exec fortio-deploy-576dbdfbc4-8gr9c -c fortio -n istio-demo -- /usr/bin/fortio load -c 2 -qps 0 -n 20 http://httpbin:8000/get

...
Code 200 : 15 (75.0 %)
Code 503 : 5 (25.0 %)
...

進入 fortio 的istio-proxy Sidecar,查看pilot-agent狀態,顯示有 5 個請求發生溢出。

$ kubectl exec fortio-deploy-576dbdfbc4-8gr9c -c istio-proxy -n istio-demo -- pilot-agent request GET stats | grep httpbin | grep pending

cluster.outbound|8000||httpbin.istio-demo.svc.cluster.local.upstream_rq_pending_overflow: 5

此即說明觸發了 httpbin 的熔斷設置。

4 環境清理

測試完成,使用如下命令對 httpbin 及 fortio 進行卸載,刪除臨時 destinationrule。

$ kubectl delete -n istio-demo -f samples/httpbin/httpbin.yaml
$ kubectl delete -n istio-demo -f samples/httpbin/sample-client/fortio-deploy.yaml
$ kubectl delete destinationrule/httpbin -n istio-demo

總結本文,首先介紹了 Istio 支持在 Destination Rule 上配置熔斷,然後對 httpbin 樣例配置了熔斷,並使用 fortio 客戶端對其進行了測試。

轉自:

leileiluoluo.com/posts/istio-circuit-breaking.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/7I-63JMJQXlHZ76TOqxOYw