正如前幾天提及 Kubernetes 可以偵測到 Pod 的生命週期去調整 Kubernetes Cluster 中其他物件的狀態。然而有些時候,**雖然 Pod 還在運行,但在 Pod 中的 web app container 可能因為某些原因已經停止運作,或是資源被其他 containers 佔用,導致我們送去的 request 無法正常回應。**幸好,Kubernetes 也幫我們想到這點了,它提供 Health Checks 協助我們去偵測 Pod 中的 containers 是否都還正常運作,確保服務本身也能正常運行。
今天的學習筆記內容如下:
小提醒:今天的程式碼都可以在 demo-health-checks 上找到。
在 Kubernetes ,有兩種常見的 health checks,
透過指令
去訪問 container發送一個 HTTP request
給 container若當我們設定的 health checks 偵測到異常時,Kubernetes 會 restart container,確保應用服務可正常運行(avaiable)。
在今天的實作中,我們將使用 my-deployment-with-health-checks.yaml 來創建一個 Deployment 物件,並透過定期發送一個 HTTP request 給 container
的方式,來判斷目前 web app container 是否還正常運作。
my-deployment-with-health-checks.yaml 內容如下,
apiVersion: apps/v1beta2 # for kubectl versions >= 1.9.0 use apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-deployment
template:
metadata:
labels:
app: my-deployment
spec:
containers:
- name: webapp
image: zxcvbnius/docker-demo
ports:
- name: webapp-port
containerPort: 3000
livenessProbe:
httpGet:
path: /
port: webapp-port
initialDelaySeconds: 15
periodSeconds: 15
timeoutSeconds: 30
successThreshold: 1
failureThreshold: 3
可以看到在 my-deployment-with-health-checks.yaml 中多了 livenessProbe
設定。
在 livenessProbe 中我們可以做以下設定,
httpGet.path
設定 health checks 要訪問的路徑
httpGet.port
指定我們要訪問的 port,這裡 port number 是 3000
initialDelaySeconds
設定當 service 剛啟動時,要延遲幾秒再開始做 health check
periodSeconds
代表每隔幾秒訪問一次,預設值為 10秒
successThreshold
可以設置訪問幾次就代表目前 service 還正常運行
failureThreshold
代表 service 回傳不如預期時,在 Kubernetes 放棄該 container 之前,會嘗試的次數,預設為3
次。
通常在實際場景中(Production Environment),我們會有一個專門來回應 health check 的 endpoint,例如
/health
來確認 application 是否正常運作。
在暸解 livenessProbe
的各個設定之後,我們可以在終端機輸入 kubectl create
指令,創建一個名為 hello-deployment
的物件。
$ kubectl create -f ./my-deployment-with-health-checks.yaml
deployment "hello-deployment" created
接著,透過 kubectl get
來查看 hello-deployment
,
$ kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-deployment 3 3 3 3 23s
以及 Pods
的狀態 ,
我們可以使用 kubectl describe
看其中一個 Pod 的詳細資料,以 hello-deployment-6b56dd6494-mx5jk
為例
$ kubectl describe pod hello-deployment-6b56dd6494-mx5jk
可以在 Liveness
的欄位裡面,清楚看到目前 health check 的設定狀態。當 container 無法正常回應 health check 時,Kubernetes 就會視為該 container 失去功能並重啟。
雖然今日的學習筆記只有分享,如何設置 定期訪問的 http reqeust
,然而 使用指令或 TCP 定期訪問服務
也是 health check 常見的方式。若有興趣的讀者,不妨參考 官網提供的範例 ,相信也會有所收穫!