pod的3个探针
概念
Pod探针(Pod Probe)是Kubernetes中的概念,用于探测容器运行状况。Pod探针通常包括三种类型:存活探针(Liveness Probe)、就绪探针(Readiness Probe)和启动探针(Startup Probe)。它们均采用不同的方式来检查容器是否处于正常状态,并告知Kubernetes是否应该继续将流量路由到该容器。
参数
type:探针类型,Liveness、Readiness 和 Startup 三种类型。
initialDelaySeconds:容器启动后延迟多少秒开始进行探测。
periodSeconds:探测的时间间隔。
timeoutSeconds:探针超时时间,即如果探测在该时间内没有得到响应,则认为探测失败。
successThreshold:连续成功探测几次才认为该容器是健康的。
failureThreshold:连续失败探测几次就认为该容器已经崩溃了。
一、存活探针(Liveness Probe)
存活探针(Liveness Probe)用于检查容器是否在正常运行中。如果容器由于某些原因处于停滞或崩溃状态,存活探针会发现该问题,并将该容器从Pod中删除并创建新的容器来替换它。这可以确保应用程序始终处于运行状态。
二、就绪探针(Readiness Probe)
就绪探针(Readiness Probe)用于检查容器是否已准备好接收流量。如果应用程序需要一段时间才能启动并准备好接收流量(例如初始化数据库连接),那么就绪探针可以防止Kubernetes将流量路由到还没有准备好的应用程序,从而避免了请求失败并提高了可靠性,通常情况下,Readiness Probe 需要与 Service 配合使用,以确保只有真正就绪了的容器才会接收到流量。
三、启动探针(Startup Probe)
启动探针(Startup Probe)是一种相对较新的探测方法,它用于检查容器是否正在启动中。与存活探针和就绪探针不同,启动探针仅在容器首次启动时运行,并且只有在成功运行后才会停止。如果启动探针超时,则Kubernetes将立即停止容器,标记为不可用状态,需要手动删除触发重新调度。启动探针可以帮助在容器启动期间检测异常情况,并防止无限制地重试失败的Pod。
四、探针的实现方式
在Kubernetes中,三种探针均可以通过以下三种方式来实现:
-
HTTP请求:对于HTTP应用程序,可以使用HTTP GET请求来测试应用程序的存活性和就绪性,如果返回200~399 OK,则表示容器已处于正常状态。
-
TCP套接字:对于其他类型的应用程序,可以使用TCP套接字来测试容器是否处于正常状态。监听特定端口并检查套接字是否打开。
-
执行 Exec命令:探针还可以执行自定义命令来测试容器状态。如果命令的退出代码为0,则表示容器处于正常状态。这种方法可用于各种应用程序,例如数据库或缓存服务器。
总结
当 Liveness Probe 探测失败时,Kubelet 会将容器标记为“未就绪”,并进行重启;而当 Readiness Probe 探测失败时,Kubelet 会将 Pod 标记为“未就绪”,并且 Service 不会将流量转发到该 Pod 上。而当 Startup Probe 探测失败时,Kubelet 会将容器标记为“不可用”,但是Kubernetes 会根据容器的重启策略(如 Always、OnFailure、Never)决定是否重启容器。如果 Startup Probe 失败,而重启策略允许,容器会被重启。
以下为 Startup Probe 探测失败后,什么情况下重启,什么情况不重启
- 不会重启的配置
重启策略设置为 Never:无论探测失败与否,Kubernetes 都不会重启容器。
restartPolicy: Never
- 会重启的配置
重启策略设置为 Always:探测失败时,Kubernetes 会尝试重启容器。
restartPolicy: Always
重启策略设置为 OnFailure:探测失败时,Kubernetes 会重启容器。
restartPolicy: OnFailure
yaml示例
#不会重启
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
startupProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 3
restartPolicy: Never
#会重启
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
startupProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 3
restartPolicy: Always