kubelet 使用 liveness probes 来了解何时重新启动容器(不是整个 Pod)。如果 liveness probe 失败,kubelet 会杀死容器,然后容器可能会重新启动,但这取决于它的restart policy。
我创建了一个简单的示例来演示它是如何工作的。
首先,我创建了一个带有两个容器(web 和 db)的 app-1 Pod。
web 容器配置了一个 liveness probe,由于没有配置 /healthz 路径,所以总是失败。
$ cat app-1.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: app-1
name: app-1
spec:
containers:
- image: nginx
name: web
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
- image: postgres
name: db
env:
- name: POSTGRES_PASSWORD
value: example
应用上面的manifest并等待一段时间后,我们可以描述app-1 Pod来检查只有web容器已经重启,db容器没有中断运行:
注意:我只提供了来自kubectl describe pod app-1 命令的重要信息,而不是整个输出。
$ kubectl apply -f app-1.yml
pod/app-1 created
$ kubectl describe pod app-1
Name: app-1
...
Containers:
web:
...
Restart Count: 4 <--- Note that the "web" container was restarted 4 times
Liveness: http-get http://:8080/healthz delay=0s timeout=1s period=10s #success=1 #failure=3
...
db:
...
Restart Count: 0 <--- Note that the "db" container works fine
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
...
Normal Killing 78s (x2 over 108s) kubelet Container web failed liveness probe, will be restarted
...
我们可以连接到db 容器以查看它是否正在运行:
注意:即使重新启动 web 容器,我们也可以使用db 容器。
$ kubectl exec -it app-1 -c db -- bash
root@app-1:/#
相比之下,连接web容器后,我们可以观察到liveness probe重启了这个容器:
$ kubectl exec -it app-1 -c web -- bash
root@app-1:/# command terminated with exit code 137