通過目標規則配置離群檢測,可以使服務網格在給定的一段時間長度內觀察服務響應發生錯誤的次數。如果服務的某個端點的錯誤次數超過給定閾值,則將此服務端點標記為不健康,并將此端點移出服務的可用端點列表(即驅逐此端點)。后續請求將不再發往此端點,持續一段時間。本文介紹如何配置離群驅逐檢測。
前提條件
已完成準備工作,并部署httpbin服務和sleep服務。具體操作,請參見準備工作。
功能介紹
服務網格的離群驅逐檢測簡要過程如下:
當有請求發往服務時,服務網格會記錄一段時間內服務每個端點響應的錯誤數量(響應碼為5xx的HTTP響應被視為錯誤),這段時間的長度由驅逐檢查間隔(
interval
)規定。當錯誤數量超過一定的閾值時,將觸發離群驅逐,將此服務端點標記為不健康,并將此端點移出服務的可用端點列表,這個閾值由主機驅逐前連續錯誤數(
consecutiveErrors
)規定。說明如果驅逐此端點后,可用的服務端點占總服務端點占比將低于一個給定占比,則不會驅逐此服務端點,這個占比由被驅逐主機的最大占比(maxEjectionPercent)規定。
服務端點被驅逐后,將在一個給定的基礎時長內不會再收到請求,這段時間結束后驅逐結束,服務端點將重新回到可用的服務端點列表。若此服務端點第二次因連續返回5xx錯誤被驅逐,則第二次被驅逐的時間將是2倍的基礎時長(第三次被驅逐時間為3次基礎時長,以此類推)。這個基礎時長由主機被驅逐的最短時長(
baseEjectionTime
)規定。
操作步驟
為httpbin服務配置目標規則,實現對httpbin服務的離群驅逐檢測。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在目標規則頁面,單擊創建,進行如下配置,單擊預覽,確認YAML內容無誤后,單擊確認,然后單擊創建。
預覽的YAML如下。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: httpbin namespace: default labels: {} spec: host: httpbin.default.svc.cluster.local trafficPolicy: outlierDetection: consecutiveErrors: 1 interval: 1s baseEjectionTime: 15s maxEjectionPercent: 100
驗證離群驅逐是否生效。
在ACK集群對應的KubeConfig環境下,執行以下命令。
kubectl -n legacy exec -it deploy/sleep -- curl httpbin.legacy:8000/status/502 -I
預期輸出:
HTTP/1.1 502 Bad Gateway server: envoy date: xxx, xx xxx 202x xx:xx:xx GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 4
由于配置了在1s內產生一次錯誤響應即判斷服務端點被驅逐,且被驅逐主機的最大占比為100%,此時httpbin服務唯一的端點已經被驅逐,再次訪問服務將不可用。
在15s內再次執行以下命令。
kubectl -n legacy exec -it deploy/sleep -- curl httpbin.legacy:8000/status/502 -I
預期輸出:
HTTP/1.1 503 Service Unavailable content-length: 19 content-type: text/plain date: xxx, xx xxx 202x xx:xx:xx GMT server: envoy
預期輸出表明訪問httpbin服務的
/status/502
路徑,服務不再返回502錯誤碼,而是返回503 Service Unavailable
,表明httpbin服務所有的端點都已被驅逐,離群驅逐生效。