在 Kubernetes 中,你可以為 Pod 里的容器定義一個(gè)健康檢查“探針”(Probe)。這樣,kubelet 就會(huì)根據(jù)這個(gè) Probe 的返回值決定這個(gè)容器的狀態(tài),
健康檢查屬于contar
命令檢查
livenessProbe
exec:
command:
- cat
- /tmp/healt
http端口,url檢查
livenessProbe:
httpGet:
path: /stub_status
port: 80
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
healthy.yaml文件
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
它在啟動(dòng)之后做的第一件事,就是在 /tmp 目錄下創(chuàng)建了一個(gè) healthy 文件,以此作為自己已經(jīng)正常運(yùn)行的標(biāo)志。而 30 s 過后,它會(huì)把這個(gè)文件刪除掉。
與此同時(shí),我們定義了一個(gè)這樣的 livenessProbe(健康檢查)。它的類型是 exec,這意味著,它會(huì)在容器啟動(dòng)后,在容器里面執(zhí)行一句我們指定的命令,比如:“cat /tmp/healthy”。這時(shí),如
果這個(gè)文件存在,這條命令的返回值就是 0,Pod 就會(huì)認(rèn)為這個(gè)容器不僅已經(jīng)啟動(dòng),而且是健康
的。這個(gè)健康檢查,在容器啟動(dòng) 5 s 后開始執(zhí)行(initialDelaySeconds: 5),每 5 s 執(zhí)行一次
(periodSeconds: 5)
如果你注意到 RESTARTS 字段從 0 到 1 的變化,就明白原因了:這個(gè)異常的容器已經(jīng)被
Kubernetes 重啟了。在這個(gè)過程中,Pod 保持 Running 狀態(tài)不變。
需要注意的是:Kubernetes 中并沒有 Docker 的 Stop 語(yǔ)義。所以雖然是 Restart(重啟),但實(shí)
際卻是重新創(chuàng)建了容器。
這個(gè)功能就是 Kubernetes 里的Pod 恢復(fù)機(jī)制,也叫 restartPolicy。它是 Pod 的 Spec 部分的一個(gè)
標(biāo)準(zhǔn)字段(pod.spec.restartPolicy),默認(rèn)值是 Always,即:任何時(shí)候這個(gè)容器發(fā)生了異常,它一定會(huì)被重新創(chuàng)建。
但一定要強(qiáng)調(diào)的是,Pod 的恢復(fù)過程,永遠(yuǎn)都是發(fā)生在當(dāng)前節(jié)點(diǎn)上,而不會(huì)跑到別的節(jié)點(diǎn)上去。事實(shí)上,一旦一個(gè) Pod 與一個(gè)節(jié)點(diǎn)(Node)綁定,除非這個(gè)綁定發(fā)生了變化(pod.spec.node 字段被修改),否則它永遠(yuǎn)都不會(huì)離開這個(gè)節(jié)點(diǎn)。這也就意味著,如果這個(gè)宿主機(jī)宕機(jī)了,這個(gè) Pod 也不會(huì)主動(dòng)遷移到其他節(jié)點(diǎn)上去。
而如果你想讓 Pod 出現(xiàn)在其他的可用節(jié)點(diǎn)上,就必須使用 Deployment 這樣的“控制器”來管理
Pod,哪怕你只需要一個(gè) Pod 副本。這就是我在第 12 篇文章《牛刀小試:我的第一個(gè)容器化應(yīng)
用》最后給你留的思考題的答案,即一個(gè)單 Pod 的 Deployment 與一個(gè) Pod 最主要的區(qū)別。
而作為用戶,你還可以通過設(shè)置 restartPolicy,改變 Pod 的恢復(fù)策略。除了 Always,它還有
OnFailure 和 Never 兩種情況:
Always:在任何情況下,只要容器不在運(yùn)行狀態(tài),就自動(dòng)重啟容器;
OnFailure: 只在容器 異常時(shí)才自動(dòng)重啟容器;
Never: 從來不重啟容器。
在實(shí)際使用時(shí),我們需要根據(jù)應(yīng)用運(yùn)行的特性,合理設(shè)置這三種恢復(fù)策略。
記住如下兩個(gè)基本的設(shè)計(jì)原理即可:
- 只要 Pod 的 restartPolicy 指定的策略允許重啟異常的容器(比如:Always),那么這個(gè) Pod就會(huì)保持 Running 狀態(tài),并進(jìn)行容器重啟。否則,Pod 就會(huì)進(jìn)入 Failed 狀態(tài) 。
- 對(duì)于包含多個(gè)容器的 Pod,只有它里面所有的容器都進(jìn)入異常狀態(tài)后,Pod 才會(huì)進(jìn)入 Failed 狀態(tài)。在此之前,Pod 都是 Running 狀態(tài)。此時(shí),Pod 的 READY 字段會(huì)顯示正常容器的個(gè)
如果這個(gè) Pod 有多個(gè)容器,僅有一個(gè)容器異常退出,它就始終保持 Running 狀態(tài),哪怕即使
restartPolicy=Never。只有當(dāng)所有容器也異常退出之后,這個(gè) Pod 才會(huì)進(jìn)入Failed狀態(tài)。
nginx配置文件,location必須同一級(jí)(縮進(jìn)對(duì)其)
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: test-liveness-exec-2
spec:
containers:
- name: liveness
image: nginx
livenessProbe:
httpGet:
path: /stub_status
port: 80
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
volumeMounts:
- name: mysqlcfmap
mountPath: "/etc/nginx/conf.d/" # 掛載到容器中目錄,這個(gè)目錄會(huì)自動(dòng)創(chuàng)建
volumes:
- name: mysqlcfmap
configMap:
name: nginx.conf # 創(chuàng)建 configmap 對(duì)象的名稱
items:
- key: nginx.conf # 創(chuàng)建 configmap 對(duì)象時(shí)指定的 key
path: nginx.conf #