探針
探針有兩種:
- livenessProbe:周期性檢查 Pod 資源是否存活,若失敗將重啟容器。
- readinessProbe:周期性檢查服務(wù)是否可用,若不可用將從 Service 資源中移除。
探針的檢測方法
- exec:執(zhí)行一段命令。
- httpGet:發(fā)起一個(gè) http 請求,檢測狀態(tài)碼。2xx 或 3xx 為可用狀態(tài)。
- tcpSocket:測試某端口是否可以連接。
使用 exec 檢測健康狀態(tài)
如下配置文件,使用 exec 的方式使用 cat /tmp/healthy 檢查容器的存活性。
apiVersion: v1
kind: Pod
metadata:
name: exec-healthy
spec:
containers:
- name: nginx
image: 172.16.156.128:5000/nginx:1.13
ports:
- containerPort: 80
args: # 執(zhí)行命令,先創(chuàng)建文件,隔 30s 后刪除文件。
- /bin/bash
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 60
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # 健康檢查的初始間隔
periodSeconds: 5 # 每 5s 檢查一次
忘了截圖,通過 describe 命令可以看到一些信息,容器在檢測到異常后會(huì)進(jìn)行重啟。
使用 httpGet 檢查健康狀態(tài)
apiVersion: v1
kind: Pod
metadata:
name: httpget-healthy
spec:
containers:
- name: nginx
image: 172.16.156.128:5000/nginx:1.13
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
在容器中移除 /usr/share/nginx/html/index.html 文件后,可通過 kubectl describe 命令看到容器重啟。

image.png
通過 tcpSocket 檢測健康狀態(tài)
...
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSecond: 3
這種形式只是檢測端口存在,演示略。
readiness 探針
如果 readiness 探針沒準(zhǔn)備好,不會(huì)加入到 endpoints 中。
apiVersion: v1
kind: ReplicationController
metadata:
name: readiness
spec:
replicas: 2
selector:
app: readiness
template:
metadata:
labels:
app: readiness
spec:
containers:
- name: readiness
image: 172.16.156.128:5000/nginx:1.13
ports:
- containerPort: 80
readinessProbe:
httpGet:
port: 80
path: /abc.html
initialDelaySeconds: 3
periodSeconds: 3
可以發(fā)現(xiàn)兩個(gè)實(shí)例仍然不是 READY 狀態(tài)(READY 0/1)
通過如下命令快速創(chuàng)建一個(gè) svc,通過 describe 查看兩個(gè) Pod 有沒有自動(dòng)掛到 svc endpoints 下。
kubectl expose rc readiness --port 80
通過創(chuàng)建一個(gè)容器中的 nginx 文件,再次查看,如下為兩次的結(jié)果。

image.png

image.png