健康檢查
Kubernetes文檔例子:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: test-liveness-exec
spec:
containers:
- name: liveness
image: 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
這里定義的容器liveness會(huì)創(chuàng)建/healthy文件,然后30秒后刪除。與此同時(shí),健康檢查每隔5秒檢查文件是否存在,如果成功,則返回0,kubelet認(rèn)為是容器是健康運(yùn)行的。
運(yùn)行這個(gè)Pod
kubectl create -f test-liveness.yaml
在30s后查看event事件,使用命令:
kubectl describe pod test-liveness-exec
可以看到因?yàn)闄z查到文件不存在,所以報(bào)告了異常,此時(shí)查看Pod狀態(tài)
Pod是running狀態(tài),然后再次查看event事件
可以看到容器很快被殺掉,然后重新啟動(dòng)一個(gè)新的容器,這里就會(huì)涉及容器的恢復(fù)機(jī)制,文章后面再說。
除了使用上面命令的方式之外,還可以使用http或者tcp的方式檢測
下面是http的方式:
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
容器暴露了8080端口,kubelet會(huì)定時(shí)每隔3秒訪問/healthz路徑,如果返回大于200少于400的狀態(tài)碼都認(rèn)為是成功的。
下面是tcp方式:
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 檢查非常相似。 此示例同時(shí)使用了 readiness 和 liveness probe。 容器啟動(dòng)后5秒鐘,kubelet將發(fā)送第一個(gè) readiness probe。 這將嘗試連接到端口8080上的 goproxy 容器。如果探測成功,則該 Pod 將被標(biāo)記為就緒。Kubelet 將每隔10秒鐘執(zhí)行一次該檢查。
如您所見,TCP 檢查的配置與 HTTP 檢查非常相似。 此示例同時(shí)使用了 readiness 和 liveness probe。 容器啟動(dòng)后5秒鐘,kubelet 將發(fā)送第一個(gè) readiness probe。 這將嘗試連接到端口8080上的 goproxy 容器。如果探測成功,則該 pod 將被標(biāo)記為就緒。Kubelet 將每隔10秒鐘執(zhí)行一次該檢查。
除了 readiness probe之外,該配置還包括 liveness probe。 容器啟動(dòng)15秒后,kubelet 將運(yùn)行第一個(gè) liveness probe。 就像readiness probe一樣,這將嘗試連接到 goproxy 容器上的8080端口。如果 liveness probe 失敗,容器將重新啟動(dòng)。
恢復(fù)機(jī)制
Pod的恢復(fù)機(jī)制,相關(guān)字段是(pod.spec.restartPolicy),默認(rèn)是always,可選策略有以下三種:
- Always:在任何情況下,只要容器不在運(yùn)行狀態(tài),就自動(dòng)重啟
- OnFailure:只有容器在異常時(shí)才自動(dòng)重啟
- Never:從不自動(dòng)重啟
具體使用哪種策略,根據(jù)具體情況,對(duì)于一些一次性的任務(wù)使用的是Never,如果需要關(guān)心異常退出后的上下文環(huán)境,比如日志、文件等,就需要設(shè)置成Never,不然的話,容器重啟后這些內(nèi)容就丟失。
相關(guān)設(shè)計(jì)原則: - 只要 Pod 的 restartPolicy 指定的策略允許重啟異常容器(比如:Always),那么這個(gè)容器就會(huì)保持Running狀態(tài),并且進(jìn)行重啟。
- 對(duì)于包含多個(gè)容器的Pod,只有它里面所有的容器都進(jìn)入異常狀態(tài)后,Pod才會(huì)進(jìn)入Failed狀態(tài)。
readinessProbe
有時(shí),應(yīng)用程序暫時(shí)無法對(duì)外部流量提供服務(wù)。 例如,應(yīng)用程序可能需要在啟動(dòng)期間加載大量數(shù)據(jù)或配置文件。 在這種情況下,您不想殺死應(yīng)用程序,也不想發(fā)送請(qǐng)求。 Kubernetes提供了readiness probe來檢測和減輕這些情況。 Pod中的容器可以報(bào)告自己還沒有準(zhǔn)備,不能處理Kubernetes服務(wù)發(fā)送過來的流量。
Readiness probe的配置跟liveness probe很像。唯一的不同是使用 readinessProbe 而不是livenessProbe。