在 Kubernetes 中卓舵,你可以為 Pod 里的容器定義一個健康檢查“探針”(Probe)。這樣,kubelet 就會根據(jù)這個 Probe 的返回值決定這個容器的狀態(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
它在啟動之后做的第一件事移国,就是在 /tmp 目錄下創(chuàng)建了一個 healthy 文件,以此作為自己已經(jīng)正常運行的標志道伟。而 30 s 過后迹缀,它會把這個文件刪除掉使碾。
與此同時,我們定義了一個這樣的 livenessProbe(健康檢查)祝懂。它的類型是 exec票摇,這意味著,它會在容器啟動后砚蓬,在容器里面執(zhí)行一句我們指定的命令矢门,比如:“cat /tmp/healthy”。這時灰蛙,如
果這個文件存在颅和,這條命令的返回值就是 0,Pod 就會認為這個容器不僅已經(jīng)啟動缕允,而且是健康
的。這個健康檢查蹭越,在容器啟動 5 s 后開始執(zhí)行(initialDelaySeconds: 5)障本,每 5 s 執(zhí)行一次
(periodSeconds: 5)
如果你注意到 RESTARTS 字段從 0 到 1 的變化,就明白原因了:這個異常的容器已經(jīng)被
Kubernetes 重啟了响鹃。在這個過程中驾霜,Pod 保持 Running 狀態(tài)不變。
需要注意的是:Kubernetes 中并沒有 Docker 的 Stop 語義买置。所以雖然是 Restart(重啟)粪糙,但實
際卻是重新創(chuàng)建了容器。
這個功能就是 Kubernetes 里的Pod 恢復機制忿项,也叫 restartPolicy蓉冈。它是 Pod 的 Spec 部分的一個
標準字段(pod.spec.restartPolicy),默認值是 Always轩触,即:任何時候這個容器發(fā)生了異常寞酿,它一定會被重新創(chuàng)建。
但一定要強調(diào)的是脱柱,Pod 的恢復過程伐弹,永遠都是發(fā)生在當前節(jié)點上,而不會跑到別的節(jié)點上去榨为。事實上惨好,一旦一個 Pod 與一個節(jié)點(Node)綁定,除非這個綁定發(fā)生了變化(pod.spec.node 字段被修改)随闺,否則它永遠都不會離開這個節(jié)點日川。這也就意味著,如果這個宿主機宕機了板壮,這個 Pod 也不會主動遷移到其他節(jié)點上去逗鸣。
而如果你想讓 Pod 出現(xiàn)在其他的可用節(jié)點上,就必須使用 Deployment 這樣的“控制器”來管理
Pod,哪怕你只需要一個 Pod 副本撒璧。這就是我在第 12 篇文章《牛刀小試:我的第一個容器化應
用》最后給你留的思考題的答案透葛,即一個單 Pod 的 Deployment 與一個 Pod 最主要的區(qū)別。
而作為用戶卿樱,你還可以通過設置 restartPolicy僚害,改變 Pod 的恢復策略。除了 Always繁调,它還有
OnFailure 和 Never 兩種情況:
Always:在任何情況下萨蚕,只要容器不在運行狀態(tài),就自動重啟容器蹄胰;
OnFailure: 只在容器 異常時才自動重啟容器岳遥;
Never: 從來不重啟容器。
在實際使用時裕寨,我們需要根據(jù)應用運行的特性浩蓉,合理設置這三種恢復策略。
記住如下兩個基本的設計原理即可:
- 只要 Pod 的 restartPolicy 指定的策略允許重啟異常的容器(比如:Always)宾袜,那么這個 Pod就會保持 Running 狀態(tài)捻艳,并進行容器重啟。否則庆猫,Pod 就會進入 Failed 狀態(tài) 认轨。
- 對于包含多個容器的 Pod,只有它里面所有的容器都進入異常狀態(tài)后月培,Pod 才會進入 Failed 狀態(tài)嘁字。在此之前,Pod 都是 Running 狀態(tài)杉畜。此時拳锚,Pod 的 READY 字段會顯示正常容器的個
如果這個 Pod 有多個容器,僅有一個容器異常退出寻行,它就始終保持 Running 狀態(tài)霍掺,哪怕即使
restartPolicy=Never
。只有當所有容器也異常退出之后拌蜘,這個 Pod 才會進入Failed
狀態(tài)杆烁。
nginx
配置文件,location
必須同一級(縮進對其)
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/" # 掛載到容器中目錄简卧,這個目錄會自動創(chuàng)建
volumes:
- name: mysqlcfmap
configMap:
name: nginx.conf # 創(chuàng)建 configmap 對象的名稱
items:
- key: nginx.conf # 創(chuàng)建 configmap 對象時指定的 key
path: nginx.conf #