對(duì)于Pod的健康狀態(tài)檢測(cè)释牺,kubernetes提供了兩類探針(Probe)來執(zhí)行對(duì)Pod的健康狀態(tài)檢測(cè):
liveness probe(存活探針)
用于判斷容器是否存活更米,即Pod是否為running狀態(tài)肥缔,如果LivenessProbe探針探測(cè)到容器不健康虽缕,則kubelet將kill掉容器刷钢,并根據(jù)容器的重啟策略是否重啟,如果一個(gè)容器不包含LivenessProbe探針,則Kubelet認(rèn)為容器的LivenessProbe探針的返回值永遠(yuǎn)成功。readiness probe(就緒探針)
用于判斷容器是否啟動(dòng)完成云石,即容器的Ready是否為True,可以接收請(qǐng)求研乒,如果ReadinessProbe探測(cè)失敗汹忠,則容器的Ready將為False,控制器將此Pod的Endpoint從對(duì)應(yīng)的service的Endpoint列表中移除雹熬,從此不再將任何請(qǐng)求調(diào)度此Pod上宽菜,直到下次探測(cè)成功。
每類探針都支持三種探測(cè)方法
- exec:通過執(zhí)行命令來檢查服務(wù)是否正常竿报,針對(duì)復(fù)雜檢測(cè)或無HTTP接口的服務(wù)铅乡,命令返回值為0則表示容器健康。
- httpGet:通過發(fā)送http請(qǐng)求檢查服務(wù)是否正常烈菌,返回200-399狀態(tài)碼則表明容器健康阵幸。
- tcpSocket:通過容器的IP和Port執(zhí)行TCP檢查,如果能夠建立TCP連接僧界,則表明容器健康侨嘀。
每種方式都可以定義在readiness 或者liveness 中。比如定義readiness 中http get 就是意思說如果我定義的這個(gè)path的http get 請(qǐng)求返回200-400以外的http code 就把我從所有有我的服務(wù)里面刪了吧捂襟,如果定義在liveness里面就是把我kill 了。
注意欢峰,liveness不會(huì)重啟pod葬荷,pod是否會(huì)重啟由你的restart policy 控制涨共。
探針探測(cè)的結(jié)果有以下三者之一
- Success:Container通過了檢查。
- Failure:Container未通過檢查宠漩。
- Unknown:未能執(zhí)行檢查举反,因此不采取任何措施。
重啟策略
- Always: 總是重啟
- OnFailure: 如果失敗就重啟
- Never: 永遠(yuǎn)不重啟
LivenessProbe探針配置
示例一: 通過exec方式做健康探測(cè)
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
在該配置文件中扒吁,對(duì)容器執(zhí)行l(wèi)ivenessProbe檢查火鼻,periodSeconds字段指定kubelet每5s執(zhí)行一次檢查,檢查的命令為cat /tmp/healthy雕崩,initialDelaySeconds字段告訴kubelet應(yīng)該在執(zhí)行第一次檢查之前等待5秒魁索,
如果命令執(zhí)行成功,則返回0盼铁,那么kubelet就認(rèn)為容器是健康的粗蔚,如果為非0,則Kubelet會(huì)Kill掉容器并根據(jù)重啟策略來決定是否需要重啟(kubernetes默認(rèn)為POD配置的重啟策略為Always)
示例二: 通過HTTP方式做健康探測(cè)
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness # 官方用戶測(cè)試的demo鏡像
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
在配置文件中饶火,使用k8s.gcr.io/liveness鏡像鹏控,創(chuàng)建出一個(gè)Pod,其中periodSeconds字段指定kubelet每3秒執(zhí)行一次探測(cè)肤寝,initialDelaySeconds字段告訴kubelet延遲等待3秒当辐,探測(cè)方式為向容器中運(yùn)行的服務(wù)發(fā)送HTTP GET請(qǐng)求,請(qǐng)求8080端口下的/healthz, 任何大于或等于200且小于400的代碼表示成功鲤看。任何其他代碼表示失敗缘揪。
httpGet探測(cè)方式有如下可選的控制字段:
- host:要連接的主機(jī)名,默認(rèn)為Pod IP刨摩,可以在http request head中設(shè)置host頭部寺晌。
- scheme: 用于連接host的協(xié)議,默認(rèn)為HTTP澡刹。
- path:http服務(wù)器上的訪問URI呻征。
- httpHeaders:自定義HTTP請(qǐng)求headers,HTTP允許重復(fù)headers罢浇。
- port: 容器上要訪問端口號(hào)或名稱
示例三:通過TCP方式做健康探測(cè)
Kubelet將嘗試在指定的端口上打開容器上的套接字陆赋,如果能建立連接,則表明容器健康嚷闭。
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
TCP檢查方式和HTTP檢查方式非常相似攒岛,示例中兩種探針都使用了,在容器啟動(dòng)5秒后胞锰,kubelet將發(fā)送第一個(gè)readinessProbe探針灾锯,這將連接到容器的8080端口,如果探測(cè)成功嗅榕,則該P(yáng)od將被標(biāo)識(shí)為ready顺饮,10秒后吵聪,kubelet將進(jìn)行第二次連接.除此之后,此配置還包含了livenessProbe探針兼雄,在容器啟動(dòng)15秒后吟逝,kubelet將發(fā)送第一個(gè)livenessProbe探針,仍然嘗試連接容器的8080端口赦肋,如果連接失敗則重啟容器块攒。
ReadinessProbe探針配置
ReadinessProbe探針的使用場(chǎng)景l(fā)ivenessProbe稍有不同,有的時(shí)候應(yīng)用程序可能暫時(shí)無法接受請(qǐng)求佃乘,比如Pod已經(jīng)Running了囱井,但是容器內(nèi)應(yīng)用程序尚未啟動(dòng)成功,在這種情況下恕稠,如果沒有ReadinessProbe琅绅,則Kubernetes認(rèn)為它可以處理請(qǐng)求了,然而此時(shí)鹅巍,我們知道程序還沒啟動(dòng)成功是不能接收用戶請(qǐng)求的千扶,所以不希望kubernetes把請(qǐng)求調(diào)度給它,則使用ReadinessProbe探針骆捧。
ReadinessProbe和livenessProbe可以使用相同探測(cè)方式澎羞,只是對(duì)Pod的處置方式不同,ReadinessProbe是將Pod IP:Port從對(duì)應(yīng)的EndPoint列表中刪除敛苇,而livenessProbe則Kill容器并根據(jù)Pod的重啟策略來決定作出對(duì)應(yīng)的措施妆绞。
ReadinessProbe探針探測(cè)容器是否已準(zhǔn)備就緒,如果未準(zhǔn)備就緒則kubernetes不會(huì)將流量轉(zhuǎn)發(fā)給此Pod枫攀。
ReadinessProbe探針與livenessProbe一樣也支持exec括饶、httpGet、TCP的探測(cè)方式来涨,配置方式相同图焰,只不過是將livenessProbe字段修改為ReadinessProbe。
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
配置探針(Probe)相關(guān)屬性
探針(Probe)有許多可選字段蹦掐,可以用來更加精確的控制Liveness和Readiness兩種探針的行為(Probe):
- initialDelaySeconds:Pod啟動(dòng)后延遲多久才進(jìn)行檢查技羔,單位:秒。
- periodSeconds:檢查的間隔時(shí)間卧抗,默認(rèn)為10藤滥,單位:秒。
- timeoutSeconds:探測(cè)的超時(shí)時(shí)間社裆,默認(rèn)為1拙绊,單位:秒。
- successThreshold:探測(cè)失敗后認(rèn)為成功的最小連接成功次數(shù),默認(rèn)為1时呀,在Liveness探針中必須為1张漂,最小值為1晶默。
- failureThreshold:探測(cè)失敗的重試次數(shù)谨娜,重試一定次數(shù)后將認(rèn)為失敗,在readiness探針中磺陡,Pod會(huì)被標(biāo)記為未就緒趴梢,默認(rèn)為3,最小值為1币他。
參考
https://blog.sctux.com/2018/12/18/kubernetes-liveness/
https://blog.51cto.com/newfly/2137136