默認情況下,kubernetes(以后簡稱k8s)當pod中所有container一“啟動”,就向其發(fā)送通信請求,并在pod崩潰后重啟他們。通常來說這已經(jīng)夠好了。但是k8s提供了一種更直接明了的方式。
那就是readiness和liveness探測器。
1 HealthChecks 分類
健康檢查(health check)是用于檢測應(yīng)用實例是否正常工作,對應(yīng)用狀態(tài)的監(jiān)控,保障業(yè)務(wù)高可用的一種機制。
k8s健康檢測主要分為以下三種
1.存活性探測(Liveness probes) :主要是探測應(yīng)用是否還活著。如果檢測到應(yīng)用沒有存活就殺掉當前pod并重啟;
2. 就緒性探測(Readiness probes):只要是探測應(yīng)用是否準備好接受請求訪問,如果檢測應(yīng)用準備好了,就把請求流量放進來;反之,則把應(yīng)用節(jié)點從注冊中心拿掉。
3. 啟動探測(Startup Probes):對于舊應(yīng)用需要更長的啟動時間,這時候既不想重啟應(yīng)用也不想讓請求訪問進來,可以設(shè)置啟動探測給足夠的啟動時間保證應(yīng)用啟動成功
1.1 Readiness
Readiness Probe的設(shè)計目的是讓Kubernetes明確知道Pod 何時已經(jīng)完全正版就緒。在向POD發(fā)送請求通信之前,首先進行Readiness Probe測試。如果測試沒有通過,Kubernetes 停止向其發(fā)送通信請求,直到測試通過。

1.2 Liveness
Liveness Probe 是為了讓k8s知道pod是否存活(而不一定可用)。如果POD死掉,則k8s會將其remove并啟動一個新的POD 取而代之。

1.3 啟動探測
startupProbe: 指示容器中的應(yīng)用是否已經(jīng)啟動。如果提供了啟動探測(startup probe),則禁用所有其他探測,直到它成功為止。如果啟動探測失敗,kubelet 將殺死容器,容器服從其重啟策略進行重啟。如果容器沒有提供啟動探測,則默認狀態(tài)為成功Success
可以自定義在pod啟動時是否執(zhí)行這些檢測,如果不設(shè)置,則檢測結(jié)果均默認 為通過,如果設(shè)置,則順序為startupProbe>readinessProbe>livenessProbe
2 HealthCheck 工作原理
2.1 Readiness
當POD剛剛開始啟動,對應(yīng)的服務(wù)并不一定完全啟動,正常提供服務(wù),默認情況下Kubernetes會立刻向POD發(fā)送請求一旦進程啟動(但此刻服務(wù)不一定可用),因此運用Readiness Probe,Kubernetes 會等待POD 完全ready后才會向其發(fā)送請求
2.2 Liveness
當POD 因特殊狀況下一直處于掛起狀態(tài)且不能響應(yīng)任何請求,然后此時進程卻存在,Kubernetes 會認認為服務(wù)一切正常并持續(xù)向掛起的POD發(fā)送請求.
若運用Liveness Probe,Kubernetes 會發(fā)現(xiàn)該POD意見停止響應(yīng),進而重啟異常的POD
3 Kubernetes Probe 類型
Kubernetes 支持三種方式來執(zhí)行探針
exec:在容器中執(zhí)行一個命令,如果命令退出碼返回0則表示探測成功,否則表示失敗
tcp:對指定的容IP及端口執(zhí)行一個TCP檢查,如果端口是開放的則表示探測成功,否則表示失敗
http:對指定的容器IP、端口及路徑執(zhí)行一個HTTP Get請求,如果返回的狀態(tài)碼在 [200,400)之間則表示探測成功,否則表示失敗
3.1 HTTP Probe
基于HTTP的探測(HTTPGetAction)向目標容器發(fā)起一個HTTP請求,根據(jù)其相應(yīng)碼進行結(jié)果判定,響應(yīng)碼如2xx或3xx時表示檢測通過。
#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開始第一次探測,默認值是0,最小值是0
timeoutSeconds: 35 #表示每次探測的超時時間,35S后如果沒返回結(jié)果就認為超時失敗,默認值是1,最小值是1
periodSeconds: 30 #表示在探測失敗后,最小的連續(xù)成功被認為是成功的,默認值是1,最小值是1
successThreshold: 1 #表示當探測失敗時,Kubernetes將在認為失敗前嘗試failureThreshold次數(shù)。默認值是3,最小值是1;Liveness認為失敗的操作是重啟pod,而readiness認為失敗的操作是把pod標記為 Unready
failureThreshold: 3 #表示多久進行一次探測,默認是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 # 延遲探測時間(秒) 【 在k8s第一次探測前等待秒 】
periodSeconds: 10 # 執(zhí)行探測頻率(秒) 【 每隔秒執(zhí)行一次 】
timeoutSeconds: 1 # 超時時間
uccessThreshold: 1 # 健康閥值
failureThreshold: 3 # 不健康閥值
3.3 exec Probe
exec類型的探針通過在目標容器中執(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 #探測延時時長,第一次探測前等待5秒,默認為0
periodSeconds: 5 #每5秒執(zhí)行一次liveness探測,默認值10秒,最小1秒
timeoutSeconds: 2 #超長時長,默認為1s,最小值也為1s
failureThreshold: 3 #處于成功狀態(tài)時,探測操作至少連續(xù)多少次的失敗才被視為檢測不通過,默認為3,最小為1
3 啟動探測(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
由于啟動探測,應(yīng)用最多有5分鐘(30 * 10 = 300秒)來完成它的啟動。一旦啟動探測成功一次,活性探測(Livenees probes)將接管以提供對容器死鎖的快速響應(yīng)。如果啟動探測從未成功,容器將在300秒后被殺死,并遵循pod的重啟策略 restartPolicy
restartPolicy 主要有以下三種策略
Always: 當容器終止退出后,總是重啟容器,默認策略
Onfailure: 當容器異常退出后(退出碼非0)時,才重啟容器
Never: 當容器終止退出時,不重啟容器
每次探測都是以下三種結(jié)果之一:
成功:容器通過了探測
失?。喝萜魑赐ㄟ^探測
未知:容器探測失敗,不采取任何操作
4 liveness和readiness對比及區(qū)別
