原文鏈接: http://idcsec.com/2019/03/14/k8s-deployment健康檢查/
進程健康檢查
健康檢查最簡單的方式就是檢查進程的狀態。Kubelet 不斷的詢問 Docker daemon 這個容器進程是否還在運行,如果沒有,這個容器就會被重啟。目前在所有 Kubernetes 的案例中,這種健康檢查是一直開啟的。對與 Kubernetes 中所有運行的容器都是生效的。然而,在很多場景中這個低級別的健康檢查是沒有作用的:比如進程也一直在運行,但是從應用的角度看,代碼已經死鎖,而且不會有正確的響應。
Pod健康檢測機制
LivenessProbe探針:
用於判斷容器是否存活,即Pod是否為running狀態,如果LivenessProbe探針探測到容器不健康,則kubelet將kill掉容器,並根據容器的重啟策略是否重啟,如果一個容器不包含LivenessProbe探針,則Kubelet認為容器的LivenessProbe探針的返回值永遠成功。
ReadinessProbe探針:
用於判斷容器是否正常提供服務,即容器的Ready是否為True,是否可以接收請求,如果ReadinessProbe探測失敗,則容器的Ready將為False,控制器將此Pod的Endpoint從對應的service的Endpoint列表中移除,從此不再將任何請求調度此Pod上,直到下次探測成功。(剔除此pod不參與接收請求)
目前,有三種類型的應用健康檢查你可以選擇:
- exec:通過執行命令來檢查服務是否正常,回值為0則表示容器健康
- httpGet方式:通過發送http請求檢查服務是否正常,返回200-399狀態碼則表明容器健康
- tcpSocket:通過容器的IP和Port執行TCP檢查,如果能夠建立TCP連接,則表明容器健康
探測的結果有以下三者之一:
- Success:Container通過了檢查。
- Failure:Container未通過檢查。
- Unknown:未能執行檢查,因此不采取任何措施。
本環境使用httpGet方式
案例:
containers:
- name: nginx
image: nginx
readinessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 15
timeoutSeconds: 2
livenessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 180
timeoutSeconds: 2
periodSeconds: 15
----------
- initialDelaySeconds:容器啟動后第一次執行探測是需要等待多少秒。
- periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
- timeoutSeconds:探測超時時間。默認1秒,最小1秒。
- successThreshold:探測失敗后,最少連續探測成功多少次才被認定為成功。默認是1。對於liveness必須是1。最小值是1。
- failureThreshold:探測成功后,最少連續探測失敗多少次才被認定為失敗。默認是3。最小值是1。
httpGet探測方式有如下可選的控制字段
host:要連接的主機名,默認為Pod IP,可以在http request head中設置host頭部。
httpHeaders:
– name: X-Custom-Header
value: Awesome
scheme: 用於連接host的協議,默認為HTTP。
path:http服務器上的訪問URI。
httpHeaders:自定義HTTP請求headers,HTTP允許重復headers。
port: 容器上要訪問端口號或名稱
對於LivenessProbe和ReadinessProbe用法都一樣,擁有相同的參數和相同的監測方式。
當前對每一個Container都可以設置不同的restartpolicy,有三種值可以設置:
Always : 只要container退出就重新啟動
OnFailure : 當container非正常退出后重新啟動
Never : 從不進行重新啟動
restartPolicy: [Always|Never|OnFailure]//重啟策略
如果restartpolicy沒有設置,那么默認值是Always。如果container需要重啟,僅僅是通過kubelet在當前節點進行container級別的重啟。
如果要使用ReadinessProbe只需要將livenessProbe修改為readinessProbe即可
tcp 端口
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
timeoutSeconds: 1
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
timeoutSeconds: 1
exec
readinessProbe:
exec:
command: ["python", "health_check.py", "server=-addr=:80"]
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
exec:
command: ["python", "health_check.py", "server=-addr=:80"]
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
exec:
command:
- wget
- --quiet
- --tries=1
- --timeout=4
- --spider
- http://localhost:8080/readyz
timeoutSeconds: 5
initialDelaySeconds: 5
periodSeconds: 5