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

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配置文件:

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

在配置文件中我們設置了一個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
idou老師教你學Istio 14:如何用K8S對Istio Service進行流量健康檢查

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

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

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

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

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

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

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

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

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

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

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

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

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

HTTP請求

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

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

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

設置如下的配置文件:

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

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

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

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

TCP請求

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

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

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章