idou老師教你學Istio 14:如何用K8S對Istio Service進行流量健康檢查
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進行流量健康檢查