原文鏈接: 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