Pod健康檢測機(jī)制
對于Pod
的健康狀態(tài)檢測侮繁,kubernetes
提供了兩類探針(Probe)來執(zhí)行對Pod的健康狀態(tài)檢測:
-
LivenessProbe探針:
用于判斷容器是否存活翼馆,即Pod是否為running
狀態(tài)抽兆,如果LivenessProbe探針
探測到容器不健康,則kubele
t將kill
掉容器鲫剿,并根據(jù)容器的重啟策略是否重啟挂捅,如果一個容器不包含LivenessProbe
探針,則Kubelet
認(rèn)為容器的LivenessProbe
探針的返回值永遠(yuǎn)成功洪囤。
-
ReadinessProbe探針:
用于判斷容器是否啟動完成,即容器的Ready
是否為True
撕氧,可以接收請求瘤缩,如果ReadinessProbe探測
失敗,則容器的Ready
將為False
伦泥,控制器將此Pod
的Endpoint
從對應(yīng)的service
的Endpoint
列表中移除剥啤,從此不再將任何請求調(diào)度此Pod
上,直到下次探測成功不脯。
每類探針都支持三種探測方法:
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í)行檢查,因此不采取任何措施龙优。
LivenessProbe探針配置
示例一:通過exec方式做健康探測
exec-liveness.yaml
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
在該配置文件中羊异,對容器執(zhí)行livenessProbe
檢查,periodSeconds
字段指定kubelet每5s執(zhí)行一次檢查彤断,檢查的命令為cat /tmp/healthy
野舶,initialDelaySeconds
字段告訴kubelet
應(yīng)該在執(zhí)行第一次檢查之前等待5秒,
如果命令執(zhí)行成功宰衙,則返回0平道,那么kubelet就認(rèn)為容器是健康的,如果為非0供炼,則Kubelet會Kill掉容器并根據(jù)重啟策略來決定是否需要重啟一屋。
當(dāng)容器啟動時,它會執(zhí)行以下命令:
/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
對于容器的前30秒袋哼,有一個/tmp/healthy
文件冀墨。因此,在前30秒內(nèi)涛贯,該命令cat /tmp/healthy
返回成功代碼诽嘉。30秒后,cat /tmp/healthy
返回失敗代碼。
創(chuàng)建Pod:
kubectl create -f https://k8s.io/examples/pods/probe/exec-liveness.yaml
在30秒
內(nèi)虫腋,查看Pod事件
:
kubectl describe pod liveness-exec
輸出表明尚未探測到失敗
:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
24s 24s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker0
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "k8s.gcr.io/busybox"
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "k8s.gcr.io/busybox"
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined]
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e
35秒
后骄酗,再次查看Pod事件
:
kubectl describe pod liveness-exec
在輸出的中顯示探測失敗
,并且容器已被殺死
并重新創(chuàng)建
悦冀。
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
37s 37s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker0
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "k8s.gcr.io/busybox"
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "k8s.gcr.io/busybox"
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined]
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e
2s 2s 1 {kubelet worker0} spec.containers{liveness} Warning Unhealthy Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
再等30秒
趋翻,確認(rèn)Container已重新啟動
:
kubectl get pod liveness-exec
下面輸出中RESTARTS
的次數(shù)已增加:
AME READY STATUS RESTARTS AGE
liveness-exec 1/1 Running 1 1m
示例二:通過HTTP方式做健康探測
pods/probe/http-liveness.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
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)建出一個Pod
嘿歌,其中periodSeconds
字段指定kubelet
每3秒執(zhí)行一次探測,initialDelaySeconds
字段告訴kubelet
延遲等待3秒茁影,探測方式為向容器中運行的服務(wù)發(fā)送HTTP GET
請求宙帝,請求8080端口下的/healthz
, 任何大于或等于200
且小于400
的代碼表示成功。任何其他代碼表示失敗募闲。
創(chuàng)建此Pod
kubectl create -f https://k8s.io/examples/pods/probe/http-liveness.yaml
10秒后步脓,查看Pod事件以驗證liveness探測失敗并且Container已重新啟動:
kubectl describe pod liveness-http
httpGet
探測方式有如下可選的控制字段
host
:要連接的主機(jī)名,默認(rèn)為Pod IP
浩螺,可以在http request head
中設(shè)置host頭部
靴患。
scheme
: 用于連接host
的協(xié)議,默認(rèn)為HTTP
要出。
path
:http服務(wù)器上的訪問URI鸳君。
httpHeaders
:自定義HTTP
請求headers
,HTTP
允許重復(fù)headers
患蹂。
port
: 容器上要訪問端口號或名稱或颊。
示例三:通過TCP方式做健康探測
Kubelet
將嘗試在指定的端口上打開容器上的套接字,如果能建立連接传于,則表明容器健康囱挑。
pods/probe/tcp-liveness-readiness.yaml
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檢查方式
非常相似,示例中兩種探針都使用了沼溜,在容器啟動5秒后平挑,kubelet
將發(fā)送第一個readinessProbe探針
,這將連接到容器的8080
端口系草,如果探測成功通熄,則該Pod
將被標(biāo)識為ready
,10秒后找都,kubelet
將進(jìn)行第二次連接唇辨。
除此之后,此配置還包含了livenessProbe探針
檐嚣,在容器啟動15秒后助泽,kubelet
將發(fā)送第一個livenessProbe探針
,仍然嘗試連接容器的8080端口嚎京,如果連接失敗則重啟容器嗡贺。
創(chuàng)建:
kubectl create -f https://k8s.io/examples/pods/probe/tcp-liveness-readiness.yaml
15秒后,查看Pod事件以驗證活動探測:
kubectl describe pod goproxy
當(dāng)容器有多個端口時鞍帝,通常會給每個端口命名诫睬,所以在使用探針探測時,也可以直接寫自定義的端口名稱
ports:
- name: liveness-port
containerPort: 8080
hostPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: liveness-port