Pod健康檢查和服務(wù)可用性
Kubernetes 對 Pod 的健康狀態(tài)可以通過兩類探針來檢查:LivenessProbe 和ReadinessProbe矾兜,kubelet定期執(zhí)行這兩類探針來診斷容器的健康狀況
(1) LivenessProbe探針:用于判斷容器是否存活(Running狀態(tài))损趋,如果LivenessProbe探針探測到容器不健康,則kubelet將殺掉該容器椅寺,并根據(jù)容器的重啟策略做相應(yīng)的處理浑槽。如果一個容器不包含LivenessProbe探針,那么kubelet認(rèn)為該容器的LivenessProbe探針返回的值永遠(yuǎn)是Success返帕。
(2) ReadinessProbe探針:用于判斷容器服務(wù)是否可用(Ready狀態(tài))桐玻,達(dá)到Ready狀態(tài)的Pod才可以接收請求。對于被Service管理的Pod荆萤,Service與Pod Endpoint的關(guān)聯(lián)關(guān)系也將基于Pod是否Ready進(jìn)行設(shè)置镊靴。如果在運(yùn)行過程中Ready狀態(tài)變?yōu)镕alse,則系統(tǒng)自動將其從Service的后端Endpoint列表中隔離出去链韭,后續(xù)再把恢復(fù)到Ready狀態(tài)的Pod加回后端Endpoint列表偏竟。這樣就能保證客戶端在訪問Service時不會被轉(zhuǎn)發(fā)到服務(wù)不可用的Pod實(shí)例上。
LivenessProbe和ReadinessProbe均可配置以下三種實(shí)現(xiàn)方式敞峭。
(1)ExecAction:在容器內(nèi)部執(zhí)行一個命令踊谋,如果該命令的返回碼為0,則表明容器健康旋讹。
在下面的例子中殖蚕,通過執(zhí)行“cat /tmp/health”命令來判斷一個容器運(yùn)行是否正常轿衔。在該P(yáng)od運(yùn)行后,將在創(chuàng)建/tmp/health文件10s后刪除該文件睦疫,而LivenessProbe健康檢查的初始探測時間(initialDelaySeconds)為15s害驹,探測結(jié)果是Fail,將導(dǎo)致kubelet殺掉該容器并重啟它:
---
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 15
(2)TCPSocketAction:通過容器的IP地址和端口號執(zhí)行TCP檢查蛤育,如果能夠建立TCP連接宛官,則表明容器健康。
在下面的例子中缨伊,通過與容器內(nèi)的localhost:80建立TCP連接進(jìn)行健康檢查:
---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-healthcheck
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 30
timeoutSeconds: 1
(3)HTTPGetAction:通過容器的IP地址摘刑、端口號及路徑調(diào)用HTTP Get方法进宝,如果響應(yīng)的狀態(tài)碼大于等于200且小于400刻坊,則認(rèn)為容器健康。
在下面的例子中党晋,kubelet定時發(fā)送HTTP請求到localhost:80/_status/healthz來進(jìn)行容器應(yīng)用的健康檢查:
---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-healthcheck
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /_status/healthz
port: 80
initialDelaySeconds: 30
timeoutSeconds: 1
對于每種探測方式谭胚,都需要設(shè)置initialDelaySeconds和timeoutSeconds兩個參數(shù),它們的含義分別如下未玻。
- initialDelaySeconds:啟動容器后進(jìn)行首次健康檢查的等待時間灾而,單位為s。
- timeoutSeconds:健康檢查發(fā)送請求后等待響應(yīng)的超時時間扳剿,單位為s旁趟。當(dāng)超時發(fā)生時,kubelet會認(rèn)為容器已經(jīng)無法提供服務(wù)庇绽,將會重啟該容器锡搜。
Kubernetes的ReadinessProbe機(jī)制可能無法滿足某些復(fù)雜應(yīng)用對容器內(nèi)服務(wù)可用狀態(tài)的判斷,所以Kubernetes從1.11版本開始瞧掺,引入Pod Ready++特性對Readiness探測機(jī)制進(jìn)行擴(kuò)展耕餐,在1.14版本時達(dá)到GA穩(wěn)定版,稱其為Pod Readiness Gates辟狈。
通過Pod Readiness Gates機(jī)制肠缔,用戶可以將自定義的ReadinessProbe探測方式設(shè)置在Pod上,輔助Kubernetes設(shè)置Pod何時達(dá)到服務(wù)可用狀態(tài)(Ready)哼转。為了使自定義的ReadinessProbe生效明未,用戶需要提供一個外部的控制器(Controller)來設(shè)置相應(yīng)的Condition狀態(tài)。
Pod的Readiness Gates在Pod定義中的ReadinessGate字段進(jìn)行設(shè)置壹蔓。下面的例子設(shè)置了一個類型為www.example.com/feature-1的新Readiness Gate:
新增的自定義Condition的狀態(tài)(status)將由用戶自定義的外部控制器設(shè)置趟妥,默認(rèn)值為False。Kubernetes將在判斷全部readinessGates條件都為True時庶溶,才設(shè)置Pod為服務(wù)可用狀態(tài)(Ready為True)