istio 1.10学习笔记09: Istio流量管理之设置请求超时和熔断
前面幾節(jié)內(nèi)容我們學習了Istio API資源對象中的虛擬服務(wù)VirtualService, 目標規(guī)則DestinationRule, Gateway。 使用它們可以實現(xiàn)將集群外部流量(http或tcp)接入到服務(wù)網(wǎng)格內(nèi)部,可以進行一些常見的流量管理功能如: 設(shè)置請求路由、故障注入、流量轉(zhuǎn)移(http或tcp)等。 本節(jié)我們學習使用istio進行流量管理的另外兩個常見功能:設(shè)置請求超時和熔斷。
設(shè)置請求超時
對HTPP服務(wù)的請求超時,可以通過虛擬服務(wù)的路由規(guī)則中的timeout字段來指定。默認請求下這個配置是禁用的。 下面基于bookinfo應(yīng)用完成這個測試。
本測試將reviews服務(wù)的超時設(shè)置為1秒,為了便于觀察測試結(jié)果,還將使用istio的故障注入功能為對ratings服務(wù)注入2秒的延遲故障。
首先執(zhí)行下面的命令初始化bookinfo應(yīng)用各服務(wù)的路由規(guī)則:
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
修改reviews服務(wù)的虛擬服務(wù),將對reviews服務(wù)的請求全都路由到v2版本:
kubectl apply -f - <<eof apiversion:="" networking.istio.io="" v1alpha3="" kind:="" virtualservice="" metadata:="" name:="" reviews="" spec:="" hosts:="" -="" http:="" route:="" destination:="" host:="" subset:="" v2="" eof
對ratings服務(wù)進行故障注入,注入2秒的延遲:
kubectl apply -f - <<eof apiversion:="" networking.istio.io="" v1alpha3="" kind:="" virtualservice="" metadata:="" name:="" ratings="" spec:="" hosts:="" -="" http:="" fault:="" delay:="" percent:="" 100="" fixeddelay:="" 2s="" route:="" destination:="" host:="" subset:="" v1="" eof
此時使用我們之前配置好的Istio Gateway入口訪問bookinfo應(yīng)用https://bookinfo.example.com/productpage,會發(fā)現(xiàn)bookinfo應(yīng)用運行正常(顯示了評級的星型符號),但是每次刷新頁面,都會有2秒的延遲。
因為reviews:v2版本的服務(wù)是通過調(diào)用ratings服務(wù)獲取評級信息的,默認reviews服務(wù)默認是沒有設(shè)置請求超時的,所以它會等待ratings服務(wù)中注入的2秒延遲,每次刷新頁面也就有了2秒的延遲。
由于productpage服務(wù)中存在硬編碼重試,即遇到錯誤時會重試1次,下面我們將對review服務(wù)的調(diào)用設(shè)置一個0.5秒的超時:
kubectl apply -f - <<eof apiversion:="" networking.istio.io="" v1alpha3="" kind:="" virtualservice="" metadata:="" name:="" reviews="" spec:="" hosts:="" -="" http:="" route:="" destination:="" host:="" subset:="" v2="" timeout:="" 0.5s="" eof
此時再刷新/productpage頁,會有1秒的延遲,且頁面中的書籍評級信息出現(xiàn)錯誤Error fetching product reviews! 。這是因為這個請求的調(diào)用鏈如下productpage(出現(xiàn)請求超時錯誤時重試1次) --> reviews(請求超時設(shè)置為0.5秒) ---> ratings(注入了2秒的延遲)。可以看出通過設(shè)置對reviews服務(wù)的請求超時,實現(xiàn)了微服務(wù)治理中設(shè)置請求超時的功能,這完全是在服務(wù)網(wǎng)格中實現(xiàn)的,沒有侵入微服務(wù)的業(yè)務(wù)邏輯。 在服務(wù)治理中通過設(shè)置請求超時,可以避免大量請求長時間占用資源。
熔斷
熔斷熔斷是創(chuàng)建彈性微服務(wù)的重要模式,熔斷可以使應(yīng)用程序具備應(yīng)對來自故障、潛在峰值和其他未知網(wǎng)絡(luò)因素的能力。 熔斷機制是應(yīng)對雪崩效應(yīng)的一種微服務(wù)鏈路保護機制。服務(wù)雪崩是指當調(diào)用鏈中的某個環(huán)節(jié),特別是服務(wù)提供方不可用時,將會導致上游環(huán)節(jié)不可用,并最終將這個影響擴大到整個系統(tǒng)中,導致整個系統(tǒng)的不可用。
下面將演示istio中流量管理的熔斷功能。
首先部署用于測試的httpbin應(yīng)用,將其部署在k8s的default namespace內(nèi),因為default命名空間在前面部署bookinfo應(yīng)用時已經(jīng)開啟了istio sidecar的自動注入功能,所以這里直接部署httpbin應(yīng)用即可:
kubectl apply -f samples/httpbin/httpbin.yaml
httpbin.yaml的內(nèi)容如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: httpbin
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
service: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
version: v1
template:
metadata:
labels:
app: httpbin
version: v1
spec:
serviceAccountName: httpbin
containers:
- image: docker.io/kennethreitz/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
ports:
- containerPort: 80
再次看一下下圖中istio中虛擬服務(wù)和目標規(guī)則的關(guān)系,熔斷器的配置需要配置在目標規(guī)則上。
接下來創(chuàng)建一個目標規(guī)則,在調(diào)用httpbin時設(shè)置了熔斷器:
kubectl apply -f - <<eof apiversion:="" networking.istio.io="" v1alpha3="" kind:="" destinationrule="" metadata:="" name:="" httpbin="" spec:="" host:="" trafficpolicy:="" connectionpool:="" tcp:="" maxconnections:="" 1="" http:="" http1maxpendingrequests:="" maxrequestsperconnection:="" outlierdetection:="" consecutive5xxerrors:="" interval:="" 1s="" baseejectiontime:="" 3m="" maxejectionpercent:="" 100="" eof=""
在httpbin的目標規(guī)則的trafficPolicy中,定義了maxConnections: 1和http1MaxPendingRequests: 1。這表示如果并發(fā)的連接和請求數(shù)超過一個,在istio-proxy中進行進一步的請求和連接時,后續(xù)請求和連接將被阻止。
接下來在k8s的default命名空間內(nèi)部署httpbin的客戶端程序fortio。fortio是專門用來做負載測試的,它可以控制連接數(shù)、并發(fā)數(shù)以及發(fā)送HTTP請求的延遲。 因為default命名空間在前面部署bookinfo應(yīng)用時已經(jīng)開啟了istio sidecar的自動注入功能,所以這里直接部署即可:
kubectl apply -f samples/httpbin/sample-client/fortio-deploy.yaml
fortio-deploy.yaml的內(nèi)容如下:
apiVersion: v1
kind: Service
metadata:
name: fortio
labels:
app: fortio
service: fortio
spec:
ports:
- port: 8080
name: http
selector:
app: fortio
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: fortio-deploy
spec:
replicas: 1
selector:
matchLabels:
app: fortio
template:
metadata:
annotations:
# This annotation causes Envoy to serve cluster.outbound statistics via 15000/stats
# in addition to the stats normally served by Istio. The Circuit Breaking example task
# gives an example of inspecting Envoy stats.
sidecar.istio.io/statsInclusionPrefixes: cluster.outbound,cluster_manager,listener_manager,http_mixer_filter,tcp_mixer_filter,server,cluster.xds-grpc
labels:
app: fortio
spec:
containers:
- name: fortio
image: fortio/fortio:latest_release
imagePullPolicy: Always
ports:
- containerPort: 8080
name: http-fortio
- containerPort: 8079
name: grpc-ping
進入fortio的pod中測試一下,下面的命令將從fortio中向httpbin發(fā)一次請求,如果返回200請求成功則說明fortio部署完成,可以進行接下來的熔斷測試:
FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio /usr/bin/fortio -- load -curl http://httpbin:8000/get
下面在fortio中向httpbin發(fā)送并發(fā)數(shù)為2的連接(-c 2),請求20次(-n 20):
FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get
......
Code 200 : 13 (65.0 %)
Code 503 : 7 (35.0 %)
......
可以看到有35%的請求被熔斷器攔截,返回了503錯誤。而HTTP503錯誤表示服務(wù)不可用,通常造成這種情況的原因是由于服務(wù)器停機維護或者已超載,返回這個狀態(tài)碼也是十分合適的。
接下來將并發(fā)連接數(shù)提高到3個,請求20次:
FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get
Code 200 : 2 (10.0 %)
Code 503 : 18 (90.0 %)
可以看到只有10%的請求成功,有90%的請求被熔斷器攔截。
參考
https://istio.io/latest/zh/docs/tasks/traffic-management/request-timeouts/https://istio.io/latest/docs/tasks/traffic-management/circuit-breaking/https://istio.io/latest/zh/docs/tasks/traffic-management/circuit-breaking/
總結(jié)
以上是生活随笔為你收集整理的istio 1.10学习笔记09: Istio流量管理之设置请求超时和熔断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新款 iPad Pro 和 Apple
- 下一篇: 升级iOS 12.1后iPhone X