探针
探针有两种:
- livenessProbe:周期性检查 Pod 资源是否存活,若失败将重启容器。
- readinessProbe:周期性检查服务是否可用,若不可用将从 Service 资源中移除。
探针的检测方法
- exec:执行一段命令。
- httpGet:发起一个 http 请求,检测状态码。2xx 或 3xx 为可用状态。
- tcpSocket:测试某端口是否可以连接。
使用 exec 检测健康状态
如下配置文件,使用 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: # 执行命令,先创建文件,隔 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 命令可以看到一些信息,容器在检测到异常后会进行重启。
使用 httpGet 检查健康状态
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
命令看到容器重启。
通过 tcpSocket 检测健康状态
...
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSecond: 3
这种形式只是检测端口存在,演示略。
readiness 探针
如果 readiness 探针没准备好,不会加入到 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
可以发现两个实例仍然不是 READY 状态(READY 0/1)
通过如下命令快速创建一个 svc,通过 describe 查看两个 Pod 有没有自动挂到 svc endpoints 下。
kubectl expose rc readiness --port 80
通过创建一个容器中的 nginx 文件,再次查看,如下为两次的结果。
image.png image.png
网友评论