K8s中存在兩種類型的探針:liveness probe和readiness probe。
liveness probe(存活探針)
用于判斷容器是否存活,即Pod是否為running狀態(tài),如果LivenessProbe探針探測到容器不健康,則kubelet將kill掉容器,并根據(jù)容器的重啟策略是否重啟。如果一個容器不包含LivenessProbe探針,則Kubelet認(rèn)為容器的LivenessProbe探針的返回值永遠(yuǎn)成功。
有時應(yīng)用程序可能因?yàn)槟承┰颍ê蠖朔?wù)故障等)導(dǎo)致暫時無法對外提供服務(wù),但應(yīng)用軟件沒有終止,導(dǎo)致K8S無法隔離有故障的pod,調(diào)用者可能會訪問到有故障的pod,導(dǎo)致業(yè)務(wù)不穩(wěn)定。K8S提供livenessProbe來檢測應(yīng)用程序是否正常運(yùn)行,并且對相應(yīng)狀況進(jìn)行相應(yīng)的補(bǔ)救措施。
注意,liveness探測失敗并一定不會重啟pod,pod是否會重啟由你的restart policy 控制。
readiness probe(就緒探針)
用于判斷容器是否啟動完成,即容器的Ready是否為True,可以接收請求,如果ReadinessProbe探測失敗,則容器的Ready將為False,控制器將此Pod的Endpoint從對應(yīng)的service的Endpoint列表中移除,從此不再將任何請求調(diào)度此Pod上,直到下次探測成功。通過使用Readiness探針,Kubernetes能夠等待應(yīng)用程序完全啟動,然后才允許服務(wù)將流量發(fā)送到新副本。
比如使用tomcat的應(yīng)用程序來說,并不是簡單地說tomcat啟動成功就可以對外提供服務(wù)的,還需要等待spring容器初始化,數(shù)據(jù)庫連接沒連上等等。對于spring boot應(yīng)用,默認(rèn)的actuator帶有/health接口,可以用來進(jìn)行啟動成功的判斷。
每類探針都支持三種探測方法:
- exec:通過執(zhí)行命令來檢查服務(wù)是否正常,針對復(fù)雜檢測或無HTTP接口的服務(wù),命令返回值為0則表示容器健康。
- httpGet:通過發(fā)送http請求檢查服務(wù)是否正常,返回200-399狀態(tài)碼則表明容器健康。
- tcpSocket:通過容器的IP和Port執(zhí)行TCP檢查,如果能夠建立TCP連接,則表明容器健康。
探針探測的結(jié)果有以下三者之一:
- Success:Container通過了檢查。
- Failure:Container未通過檢查。
- Unknown:未能執(zhí)行檢查,因此不采取任何措施。
Pod重啟策略:
- Always: 總是重啟
- OnFailure: 如果失敗就重啟
- Never: 永遠(yuǎn)不重啟
例子
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
探針(Probe)有許多可選字段,可以用來更加精確的控制Liveness和Readiness兩種探針的行為。這些參數(shù)包括:
- initialDelaySeconds:容器啟動后第一次執(zhí)行探測是需要等待多少秒。
- periodSeconds:執(zhí)行探測的頻率。默認(rèn)是10秒,最小1秒。
- timeoutSeconds:探測超時時間。默認(rèn)1秒,最小1秒。
- successThreshold:探測失敗后,最少連續(xù)探測成功多少次才被認(rèn)定為成功。默認(rèn)是1。對于liveness必須是1。最小值是1。
- failureThreshold:探測成功后,最少連續(xù)探測失敗多少次才被認(rèn)定為失敗。默認(rèn)是3。最小值是1。