探针介绍
在 Kubernetes 中,探针是一种用于检测容器运行状态和健康状况的机制。有三种类型的探针:存活探针(Liveness Probe)、就绪探针(Readiness Probe)和启动探针(Startup Probe)。这三种探针可以根据应用程序的需要进行配置,以提高容器的可靠性和稳定性。例如,可以根据应用程序的特点选择不同的探针类型、检测方式和超时时间,从而确保应用程序始终处于健康状态。
探针类型
startupProbe
在K8s1.16+版本
如果容器无法响应 startupProbe,则 Kubernetes 将认为该容器启动失败,将停止该容器的运行并进行重启。startupProbe 通常通过发送 HTTP 请求或执行命令的方式进行检测,并根据返回结果来判断容器的状态。
使用 startupProbe 可以帮助用户确保容器启动后可以正常运行,并及时发现和处理启动过程中可能出现的问题。例如,在容器启动时可能需要进行一些初始化操作、加载配置文件等,如果这些操作失败,则可能导致后续的应用程序故障。通过使用 startupProbe,用户可以及时检测到这些问题,并进行相应的修复和调整,从而提高容器的可靠性和稳定性。
需要注意的是,startupProbe 不适用于长时间运行的容器,因为它只会在容器启动时运行一次。对于长时间运行的容器,应该使用存活探针(liveness probe)和就绪探针(readiness probe)来确保容器的健康状态。
readinessProbe
readinessProbe 是一种用于检测容器是否已经准备好接收流量的探针。如果容器无法响应 readinessProbe,则 Kubernetes 将等待容器变为可用状态后再将流量转发到该容器。
readinessProbe 通常通过发送 HTTP 请求或执行命令的方式进行检测,并根据返回结果来判断容器的状态。例如,可以向容器发送一个 HTTP GET 请求,并检查返回的状态码是否为 200,以确保容器已经成功启动并准备好接收流量。
使用 readinessProbe 可以帮助用户确保容器已经充分准备好接收流量,并避免将流量转发到尚未准备好的容器。这对于提高应用程序的可靠性和稳定性非常重要,尤其是在容器扩展和缩小、节点故障和网络问题等情况下。
需要注意的是,readinessProbe 应该与存活探针(liveness probe)配合使用,以确保容器始终处于健康状态。例如,如果容器在接收流量时出现故障,则应该立即停止容器的运行并进行重启,从而避免可能的数据损失和服务中断。
livenessProbe
livenessProbe 是一种用于检测容器是否处于正常运行状态的探针。如果容器无法响应 livenessProbe,则 Kubernetes 将自动重启容器。
livenessProbe 通常通过发送 HTTP 请求或执行命令的方式进行检测,并根据返回结果来判断容器的状态。例如,可以向容器发送一个 HTTP GET 请求,并检查返回的状态码是否为 200,以确保容器正在正常运行。
使用 livenessProbe 可以帮助用户及时发现和处理容器运行中可能出现的问题,从而避免整个应用程序因为某个容器故障而中断。例如,如果容器因为内存泄漏、死锁等问题导致无法响应请求,则 livenessProbe 可以检测到这些问题并自动重启容器,从而恢复容器功能并提高整个应用程序的可靠性和稳定性。
需要注意的是,livenessProbe 应该与就绪探针(readiness probe)配合使用,以确保容器不仅处于正常运行状态,还已经准备好接收流量。如果容器虽然处于正常运行状态,但尚未准备好接收流量,则应该将流量转发到其他容器,直到当前容器准备好接收流量。
问题抛出:在一个 Pod 中,如果只配置 livenessProbe 或只配置 readinessProbe,可能会发生什么情况?
如果在一个Pod中只配置了 livenessProbe,而没有配置 readinessProbe,则 Kubernetes 在启动该 Pod 时将等待 livenessProbe 返回成功后才将其标记为 ready。这意味着 Pod 可能已经可以响应网络请求,但它不会被 Kubernetes 转发流量,直到 livenessProbe 返回成功。
相反地,如果在一个 Pod 中只配置了 readinessProbe,而没有配置 livenessProbe,则 Kubernetes 将在 Pod 启动后立即将其标记为 ready。这意味着 Pod 可以接收网络流量,并正常工作,但是如果 Pod 运行时出现故障或无响应,Kubernetes 不会自动重启或替换该 Pod。
因此,最佳实践是同时配置 livenessProbe 和 readinessProbe,以确保 Kubernetes及时检测和处理任何运行问题,并维护集群的健康状态。
检测方式
ExecAction
ExecAction 是 Kubernetes 中 livenessProbe、readinessProbe 和 startupProbe 的一种执行操作方式。当 Probe 检测到容器需要重启或者不可用时,可以通过 ExecAction 执行一条命令来尝试修复容器。
ExecAction 可以在 Pod 运行时执行一个命令,并且可以将命令的输出写入到容器日志中。例如,可以使用 ExecAction 来检查容器内部某个服务是否正在运行,或者检查容器的某些配置是否正确。如果该命令返回 0 ,则认为探针成功,否则探针失败,并根据 Probe 的配置将容器重启或标记为不可用。
- 以下是一个使用 ExecAction 的示例 yaml 配置:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx
readinessProbe:
exec:
command:
- cat
- /var/www/html/index.html
initialDelaySeconds: 10
periodSeconds: 5
在上面的配置中,readinessProbe 使用了 ExecAction 命令
cat /var/www/html/index.html来检查容器是否已经准备好接收流量。如果该命令返回 0,则认为容器已经准备好,否则容器将被标记为不可用
TCPSocketAction
TCPSocketAction 是 Kubernetes 中 livenessProbe、readinessProbe 和 startupProbe 的一种执行操作方式。当 Probe 检测到容器需要重启或者不可用时,可以通过 TCPSocketAction 尝试连接容器的 TCP 端口来检查容器是否正常。
TCPSocketAction 会尝试在容器内部建立一个 TCP 连接,并等待一段时间来检查连接是否成功。如果连接成功,则认为探针成功,否则探针失败,并根据 Probe 的配置将容器重启或标记为不可用。
- 以下是一个使用 TCPSocketAction 的示例 yaml 配置:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
在上面的配置中,readinessProbe 使用了 TCPSocketAction 来检查容器的 8080 端口是否已经准备好接收流量。如果尝试连接成功,则认为容器已经准备好,否则容器将被标记为不可用。
HTTPGetAction
HTTPGetAction 是 Kubernetes 中 livenessProbe、readinessProbe 和 startu
HTTPGetAction 会尝试在容器内部向指定的 URL 发送一个 HTTP GET 请求,并等待一段时间来检查响应是否成功。如果响应的状态码在 successThreshold 范围内,则认为探针成功,否则探针失败,并根据 Probe 的配置将容器重启或标记为不可用。
- 以下是一个使用 HTTPGetAction 的示例 yaml 配置:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
successThreshold: 1
在上面的配置中,readinessProbe 使用了 HTTPGetAction 来检查容器的 /healthz 路径是否已经准备好接收流量。如果响应的状态码在 successThreshold 范围内,则认为容器已经准备好,否则容器将被标记为不可用。
说明:SpringCloud2原生支持TCPSocket和HTTPGet
探针检测参数
| 参数 | 介绍 |
| initialDelaySeconds | 初始化时间,单位秒 |
| periodSeconds | 检测间隔,单位秒 |
| successThreshold | 检测成功为多少次表示就绪 |
| failureThreshold | 检测失败多少次表示未就绪 |
| timeoutSeconds | 超时时间,单位秒 |
如果本文对您有所帮助,请点赞并留言支持,这将是对我们最大的鼓励和肯定!感谢您的阅读。

必须 注册 为本站用户, 登录 后才可以发表评论!