1. 程式人生 > >idou老師教你學Istio 14:如何用K8S對Istio Service進行流量健康檢查

idou老師教你學Istio 14:如何用K8S對Istio Service進行流量健康檢查

必須 headers log 死鎖 所有 -exec 建立 應該 成功

Istio利用k8s的探針對service進行流量健康檢查,有兩種探針可供選擇,分別是liveness和readiness:

liveness探針用來偵測什麽時候需要重啟容器。比如說當liveness探針捕獲到程序運行時出現的一個死鎖,這種情況下重啟容器可以讓程序更容易可用。

readiness探針用來使容器準備好接收流量。當所有容器都ready時被視為pod此時ready。比如說用這種信號來控制一個後端服務,當pod沒有到ready狀態時,服務會從負載均衡被移除。

使用場景:

liveness探針被用來移除異常的pod,不重啟pod就無法恢復的應用常使用liveness探針。比如前文提到的死鎖,進程會一直處於活躍狀態,k8s會認為正常並繼續發送流量。但使用liveness探針之後會發現應用已經不再處理請求,繼而重啟異常pod。

readiness探針被用來控制流量進入pod。比如應用程序需要加載一個大的文件或者需要啟動後進行一些配置。但默認只要容器進程啟動完成就會有流量發送過來。使用readiness探針會一直等待直到完成所有加載或配置再讓流量進入。

兩種探針的配置相似,區別在於使用livenessProbe還是readinessProbe字段

探針配置參數:

探針有以下幾個參數:

initialDelaySeconds:容器啟動之後到啟動探針之間的時延

periodSeconds:探針的循環執行時間,最小單位為1秒

timeoutSeconds:探針超時時間,默認值1秒

successThreshold: 成功閾值數,失敗之後最小的連續成功信號數,liveness必須是1

failureThreshold:失敗閾值數,當探針失敗之後,在放棄之前k8s嘗試重新執行探針次數,如果是liveness探針放棄意味著重啟容器,readiness探針意味著pod標記為unready,默認值為3次。

HTTP探針還有以下額外的參數:

host: 所連接主機名,默認值是pod IP

scheme: HTTP或者HTTPS

path: 訪問HTTP 服務器的路徑

httpHeaders: 訪問HTTP的報頭

port:訪問容器的端口

探針可以進行三種操作:

命令行:在容器中執命令行操作,exit 0為成功狀態

HTTP請求:向容器發送HTTP GET請求,如果返回值為200-400之間為成功狀態

TCP 請求:向指定端口發送TCP請求,如果該端口開放監聽,則為成功

下面我們來演示以下健康檢查的操作:

命令行操作

首先準備busybox鏡像,設置如下的yaml配置文件:

技術分享圖片

在配置文件中我們設置了一個liveness探針,在容器啟動之後的5s,每隔5s去執行一下訪問/tmp/healthy這個文件的操作,如果操作成功返回0,則為容器健康,如果返回值不為0, 會重啟容器。

當容器啟動之後會執行:

touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600

前30s會建立/tmp/healthy文件,30s之後刪除,此時訪問會返回錯誤.

使用kubectl create -f ./your-exec-liveness.yaml建立pod
技術分享圖片

在30s之內通過kubectl describe pod liveness-exec來查看pod狀態,為健康:

技術分享圖片

在30s之後查看pod的狀態,發現無法訪問文件,返回不健康:

技術分享圖片

之後查看pod的狀態,pod的重啟次數為1,此時通過liveness探針檢測到不健康狀態已經重啟pod。

技術分享圖片

如果使用readiness探針,需要修改上文your-exec-liveness.yaml的紅框字段:

技術分享圖片

通過與上文相同的方法,在30s之前查看pod的狀態,為ready:

技術分享圖片

在30s之後查看pod狀態,readiness探針將應用容器置為unready, ready的容器是istio-proxy:

技術分享圖片

可以看到readiness探針並不會重啟容器。

HTTP請求

另一種使用liveness探針的方法是HTTP GET請求,可以用來監測網頁的運行狀態,我們用google liveness鏡像來進行演示:

技術分享圖片

這裏我們讓HTTP的服務器/healthz路徑前10s返回200 的OK狀態,10s之後返回狀態500。

設置如下的配置文件:

技術分享圖片

liveness探針會向容器的8080端口發送請求訪問/healthz, 在容器啟動3s之後每隔3s發送一次。我們建立pod並查看pod的運行狀態kubectl describe pod liveness-http:

技術分享圖片

會發現10s之後 liveness探針監測到了返回值是500,狀態標記為不健康。

TCP請求

兩種探針還可以共同使用,下面以TCP請求為例,TCP和HTTP連接類似。使用google的goproxy鏡像,該鏡像會在8080端口開放TCP socket連接,使用如下的配置文件:

技術分享圖片

我們用探針去訪問8000端口查看pod狀態;此時理論上應該無法連接:

技術分享圖片

可以看到readiness探針會每隔10s監測,無法訪問時會將pod置於unready狀態,liveness探針20s監測,無法成功則重啟pod。

通過以上演示我們了解了如何配置兩種探針和執行三種操作。通過合理的探針配置,可以實時監控Istio各個pod的運行狀態,提供方便的應用治理手段。

相關服務請訪問https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019

idou老師教你學Istio 14:如何用K8S對Istio Service進行流量健康檢查