默認(rèn)情況下庐船,kubernetes(以后簡稱k8s)當(dāng)pod中所有container一“啟動(dòng)”昆庇,就向其發(fā)送通信請求歇万,并在pod崩潰后重啟他們。通常來說這已經(jīng)夠好了勋陪。但是k8s提供了一種更直接明了的方式贪磺。
那就是readiness和liveness探測器。
1 HealthChecks 分類
健康檢查(health check)是用于檢測應(yīng)用實(shí)例是否正常工作诅愚,對應(yīng)用狀態(tài)的監(jiān)控缘挽,保障業(yè)務(wù)高可用的一種機(jī)制。
k8s健康檢測主要分為以下三種
1.存活性探測(Liveness probes) :主要是探測應(yīng)用是否還活著呻粹。如果檢測到應(yīng)用沒有存活就殺掉當(dāng)前pod并重啟;
2. 就緒性探測(Readiness probes):只要是探測應(yīng)用是否準(zhǔn)備好接受請求訪問,如果檢測應(yīng)用準(zhǔn)備好了苏研,就把請求流量放進(jìn)來等浊;反之,則把應(yīng)用節(jié)點(diǎn)從注冊中心拿掉摹蘑。
3. 啟動(dòng)探測(Startup Probes):對于舊應(yīng)用需要更長的啟動(dòng)時(shí)間筹燕,這時(shí)候既不想重啟應(yīng)用也不想讓請求訪問進(jìn)來,可以設(shè)置啟動(dòng)探測給足夠的啟動(dòng)時(shí)間保證應(yīng)用啟動(dòng)成功
1.1 Readiness
Readiness Probe的設(shè)計(jì)目的是讓Kubernetes明確知道Pod 何時(shí)已經(jīng)完全正版就緒衅鹿。在向POD發(fā)送請求通信之前,首先進(jìn)行Readiness Probe測試撒踪。如果測試沒有通過,Kubernetes 停止向其發(fā)送通信請求,直到測試通過大渤。
1.2 Liveness
Liveness Probe 是為了讓k8s知道pod是否存活(而不一定可用)制妄。如果POD死掉,則k8s會(huì)將其remove并啟動(dòng)一個(gè)新的POD 取而代之泵三。
1.3 啟動(dòng)探測
startupProbe: 指示容器中的應(yīng)用是否已經(jīng)啟動(dòng)耕捞。如果提供了啟動(dòng)探測(startup probe),則禁用所有其他探測烫幕,直到它成功為止俺抽。如果啟動(dòng)探測失敗,kubelet 將殺死容器较曼,容器服從其重啟策略進(jìn)行重啟磷斧。如果容器沒有提供啟動(dòng)探測,則默認(rèn)狀態(tài)為成功Success
可以自定義在pod啟動(dòng)時(shí)是否執(zhí)行這些檢測捷犹,如果不設(shè)置弛饭,則檢測結(jié)果均默認(rèn) 為通過,如果設(shè)置伏恐,則順序?yàn)閟tartupProbe>readinessProbe>livenessProbe
2 HealthCheck 工作原理
2.1 Readiness
當(dāng)POD剛剛開始啟動(dòng),對應(yīng)的服務(wù)并不一定完全啟動(dòng),正常提供服務(wù),默認(rèn)情況下Kubernetes會(huì)立刻向POD發(fā)送請求一旦進(jìn)程啟動(dòng)(但此刻服務(wù)不一定可用),因此運(yùn)用Readiness Probe孩哑,Kubernetes 會(huì)等待POD 完全ready后才會(huì)向其發(fā)送請求
2.2 Liveness
當(dāng)POD 因特殊狀況下一直處于掛起狀態(tài)且不能響應(yīng)任何請求,然后此時(shí)進(jìn)程卻存在,Kubernetes 會(huì)認(rèn)認(rèn)為服務(wù)一切正常并持續(xù)向掛起的POD發(fā)送請求.
若運(yùn)用Liveness Probe,Kubernetes 會(huì)發(fā)現(xiàn)該P(yáng)OD意見停止響應(yīng),進(jìn)而重啟異常的POD
3 Kubernetes Probe 類型
Kubernetes 支持三種方式來執(zhí)行探針
exec:在容器中執(zhí)行一個(gè)命令翠桦,如果命令退出碼返回0則表示探測成功横蜒,否則表示失敗
tcp:對指定的容IP及端口執(zhí)行一個(gè)TCP檢查胳蛮,如果端口是開放的則表示探測成功,否則表示失敗
http:對指定的容器IP丛晌、端口及路徑執(zhí)行一個(gè)HTTP Get請求仅炊,如果返回的狀態(tài)碼在 [200,400)之間則表示探測成功,否則表示失敗
3.1 HTTP Probe
基于HTTP的探測(HTTPGetAction)向目標(biāo)容器發(fā)起一個(gè)HTTP請求澎蛛,根據(jù)其相應(yīng)碼進(jìn)行結(jié)果判定抚垄,響應(yīng)碼如2xx或3xx時(shí)表示檢測通過。
#cat liveness-http.yaml
apiVersion : v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness-http
image: nginx
ports:
- name: http
containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/sh" ,"-c","echo liveness-http test > /usr/share/nginx/html/health"]
livenessProbe:
httpGet:
path: /health
port: http
scheme: HTTP
initialDelaySeconds: 30 #表示延遲30S開始第一次探測谋逻,默認(rèn)值是0呆馁,最小值是0
timeoutSeconds: 35 #表示每次探測的超時(shí)時(shí)間,35S后如果沒返回結(jié)果就認(rèn)為超時(shí)失敗毁兆,默認(rèn)值是1浙滤,最小值是1
periodSeconds: 30 #表示在探測失敗后,最小的連續(xù)成功被認(rèn)為是成功的气堕,默認(rèn)值是1纺腊,最小值是1
successThreshold: 1 #表示當(dāng)探測失敗時(shí),Kubernetes將在認(rèn)為失敗前嘗試failureThreshold次數(shù)茎芭。默認(rèn)值是3揖膜,最小值是1;Liveness認(rèn)為失敗的操作是重啟pod,而readiness認(rèn)為失敗的操作是把pod標(biāo)記為 Unready
failureThreshold: 3 #表示多久進(jìn)行一次探測梅桩,默認(rèn)是10S壹粟,最小值是1
3.2 TCP Probe
基于TCP的存活性探測(TCPSocketAction)用于向容器的特定端口發(fā)起TCP請求并嘗試建立連接,連接成功即為通過檢測摘投。
iveness-tcp.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-tcp
spec:
containers:
- name: liveness-tcp
image: nginx
ports:
- name: http
containerPort: 80
livenessProbe:
tcpSocket:
port: http
initialDelaySeconds: 50 # 延遲探測時(shí)間(秒) 【 在k8s第一次探測前等待秒 】
periodSeconds: 10 # 執(zhí)行探測頻率(秒) 【 每隔秒執(zhí)行一次 】
timeoutSeconds: 1 # 超時(shí)時(shí)間
uccessThreshold: 1 # 健康閥值
failureThreshold: 3 # 不健康閥值
3.3 exec Probe
exec類型的探針通過在目標(biāo)容器中執(zhí)行由用戶自定義的命令來判斷容器的監(jiān)控狀態(tài)煮寡,若命令狀態(tài)返回值為0則表示“成功”通過檢測,其他值則均為“失敗”狀態(tài)
#cat liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness-exec
name: liveness-exec
spec:
restartPolicy: OnFailure
containers:
- name: liveness-exec
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 5 #探測延時(shí)時(shí)長犀呼,第一次探測前等待5秒幸撕,默認(rèn)為0
periodSeconds: 5 #每5秒執(zhí)行一次liveness探測,默認(rèn)值10秒,最小1秒
timeoutSeconds: 2 #超長時(shí)長外臂,默認(rèn)為1s,最小值也為1s
failureThreshold: 3 #處于成功狀態(tài)時(shí)坐儿,探測操作至少連續(xù)多少次的失敗才被視為檢測不通過,默認(rèn)為3宋光,最小為1
3 啟動(dòng)探測(Startup Probes)
#cat startup-probe.yml
ports:
- name: liveness-port
containerPort: 8080
hostPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 1
periodSeconds: 10
startupProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 30
periodSeconds: 10
由于啟動(dòng)探測貌矿,應(yīng)用最多有5分鐘(30 * 10 = 300秒)來完成它的啟動(dòng)。一旦啟動(dòng)探測成功一次罪佳,活性探測(Livenees probes)將接管以提供對容器死鎖的快速響應(yīng)逛漫。如果啟動(dòng)探測從未成功,容器將在300秒后被殺死赘艳,并遵循pod的重啟策略 restartPolicy
restartPolicy 主要有以下三種策略
Always: 當(dāng)容器終止退出后酌毡,總是重啟容器克握,默認(rèn)策略
Onfailure: 當(dāng)容器異常退出后(退出碼非0)時(shí),才重啟容器
Never: 當(dāng)容器終止退出時(shí)枷踏,不重啟容器
每次探測都是以下三種結(jié)果之一:
成功:容器通過了探測
失斊邪怠:容器未通過探測
未知:容器探測失敗,不采取任何操作