概述
官方文档:
- https://kubernetes.io/zh-cn/docs/concepts/configuration/liveness-readiness-startup-probes/
- https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
容器探测用于检测容器中的应用实例是否正常工作,是保障业务可用性的一种传统机制。如果经过探测,实例的状态不符合预期,那么kubernetes就会把该Pod进行重启或者不承担业务流量。kubernetes提供了三种探针来实现容器探测,分别是:
- 存活探针(liveness probe)
- 就绪探针(readiness probe)
- 启动探针(startup probe)
探针的作用
自动恢复故障容器(存活探针)
作用:检测容器内应用是否处于崩溃、死锁或无响应状态,若检测失败则自动重启容器。
场景:
- 应用程序因内存泄漏导致无响应,但容器进程仍在运行。
- 数据库连接池耗尽,导致应用无法处理请求。
效果:无需人工干预,K8s 自动重启故障容器,提升系统可用性。
避免流量转发到未就绪容器(就绪探针)
作用:确保只有当容器完全准备好接收请求时,才会将流量分配给它。
场景:
- 容器启动后需要加载大量配置文件或预热缓存。
- 应用需要连接外部数据库或服务,连接建立前无法提供服务。
效果:防止客户端请求被转发到未完全启动的容器,减少请求失败率。
保护慢启动应用不被误杀(启动探针)
作用:为启动时间较长的应用提供专门的检测机制,避免存活探针过早触发重启。
场景:
- Java 应用启动时需要执行类加载和 JIT 编译,耗时较长。
- 数据密集型应用需要初始化大型数据集。
效果:避免因启动时间过长导致的频繁重启循环,节省系统资源。
实现滚动更新的平滑过渡
作用:在 Deployment 进行滚动更新时,就绪探针确保旧版本容器优雅下线,新版本容器完全就绪后再接收流量。
场景:微服务架构中,服务 A 更新时需要确保服务 B 不会调用到未就绪的 A 实例。
效果:减少服务更新过程中的请求失败率,实现无缝升级。
优化资源利用
作用:通过精准的健康检查,K8s 可以:
- 自动驱逐不可用的 Pod 并重新调度到健康节点。
- 在节点资源不足时,优先保留健康的容器,终止异常容器。
效果:提高集群资源利用率,降低运维成本。
探针的探测方式及配置参数
探测方式
探针可以通过以下几种方式执行检查:
- HTTP 请求(HTTPGetAction):向容器发送 HTTP 请求,若返回状态码为 200-399,则表示检查成功。
- po.spec.containers.livenessProbe.
- httpGet:
- scheme: HTTP #支持的协议,http或者https
- port: 80 #端口号
- path: /hello #URI地址
- host: 127.0.0.1 #ip地址
复制代码
- TCP 连接(TCPSocketAction):尝试与容器的指定端口建立 TCP 连接,若能成功连接,则检查通过。
- po.spec.containers.livenessProbe.
- tcpSocket:
- port: 8080 # 尝试访问8080端口
复制代码
- 命令执行(ExecAction):在容器内执行指定命令,若命令退出状态码为 0,则检查成功。
- po.spec.containers.livenessProbe.
- exec:
- command:
- - cat
- - /etc/hosts
复制代码 配置参数
探针的核心配置参数如下:
- initialDelaySeconds:容器启动后等待多长时间再开始执行探针检查。
- periodSeconds:探针检查的执行间隔时间。
- timeoutSeconds:探针检查的超时时间。
- successThreshold:探针检查失败后,需要连续多少次检查成功才认为容器恢复正常。
- failureThreshold:探针检查成功后,需要连续多少次检查失败才认为容器出现问题。
存活探针(liveness probe)详解
在 Kubernetes(K8s)中,存活探针(Liveness Probe) 是用于监控容器内部应用是否处于健康运行状态的核心机制。当探测失败时,K8s 会自动重启容器,确保应用始终可用,如果容器没有提供健康状态检查,则默认为success
核心作用
- 检测应用无响应:当应用崩溃、死锁或进入不可恢复状态时触发重启。
- 自动恢复故障:无需人工干预,K8s 通过重启容器实现自愈。
- 提高可用性:确保 Pod 始终运行健康的容器实例。
HTTP探测实战(最常用)
向容器发送 HTTP 请求,若返回状态码为 200-399,则表示检查成功。- [root@master ~/probe]# cat liveness.yaml
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- livenessProbe:
- httpGet:
- # http请求的端口
- port: 80
- # http请求的路径
- path: /
- # http请求的主机
- # host: 127.0.0.1
- # 请求方式
- scheme: HTTP
- # 超时时间,指定5秒
- timeoutSeconds: 5
- # 探针检查成功后,需要连续3次检查失败才认为容器出现问题
- failureThreshold: 3
- # 探针检查失败后,需要连续1次检查成功才认为容器恢复正常
- successThreshold: 1
- # 探针检查的执行间隔时间,指定3秒
- periodSeconds: 3
- # 容器启动后等待30秒再开始执行探针检查
- initialDelaySeconds: 30
- [root@master ~/probe]# kubectl apply -f liveness.yaml
- pod/nginx created
- # 等待一段时间查看Pod的状态
- [root@master ~/probe]# kubectl get po nginx
- NAME READY STATUS RESTARTS AGE
- nginx 1/1 Running 0 2m8s
复制代码 如果监测失败会发生什么呢?
修改一下请求路径- [root@master ~/probe]# cat liveness.yaml
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- livenessProbe:
- httpGet:
- port: 80
- # http请求的路径未/test,在nginx容器中,改路径应该会返回404状态码
- path: /test
- scheme: HTTP
- timeoutSeconds: 5
- failureThreshold: 3
- successThreshold: 1
- periodSeconds: 3
- initialDelaySeconds: 30
- [root@master ~/probe]# kubectl apply -f liveness.yaml
- pod/nginx created
- # 稍微等待一会,查看Pod的状态,发现RESTARTS次数已经为1了,这里表示容器的重启次数
- [root@master ~/probe]# kubectl get po
- NAME READY STATUS RESTARTS AGE
- nginx 1/1 Running 1 (8s ago) 48s
复制代码 Exec探测实战
在容器内执行指定shell命令,若命令退出状态码为 0,则检查成功。- [root@master ~/probe]# cat liveness.yaml
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- livenessProbe:
- exec:
- # 指定shell命令,cat /etc/hosts
- command:
- - cat
- - /etc/hosts
- # 超时时间,指定5s
- timeoutSeconds: 5
- # 探针检查成功后,需要连续3次检查失败才认为容器出现问题
- failureThreshold: 3
- # 探针检查失败后,需要连续1次检查成功才认为容器恢复正常
- successThreshold: 1
- # 探针检查的执行间隔时间,指定3秒
- periodSeconds: 3
- # 容器启动后等待15秒再开始执行探针检查
- initialDelaySeconds: 15
- [root@master ~/probe]# kubectl apply -f liveness.yaml
- pod/nginx created
- # 查看Pod的状态
- [root@master ~/probe]# kubectl get po nginx
- NAME READY STATUS RESTARTS AGE
- nginx 1/1 Running 0 44s
复制代码 TCP探测方式实战
尝试与容器的指定端口建立 TCP 连接,若能成功连接,则检查通过。- [root@master ~/probe]# cat liveness.yaml
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- livenessProbe:
- # 测试某个容器的TCP端口是否能够连通,类似于telnet nc工具
- tcpSocket:
- port: 80
- # 超时时间,指定5s
- timeoutSeconds: 5
- # 探针检查成功后,需要连续3次检查失败才认为容器出现问题
- failureThreshold: 3
- # 探针检查失败后,需要连续1次检查成功才认为容器恢复正常
- successThreshold: 1
- # 探针检查的执行间隔时间,指定3秒
- periodSeconds: 3
- # 容器启动后等待15秒再开始执行探针检查
- initialDelaySeconds: 15
- [root@master ~/probe]# kubectl apply -f liveness.yaml
- pod/nginx created
- # 检查Pod的状态
- [root@master ~/probe]# kubectl get po nginx
- NAME READY STATUS RESTARTS AGE
- nginx 1/1 Running 0 40s
复制代码 就绪探针(readiness probe)详解
在 Kubernetes(K8s)中,就绪探针(Readiness Probe) 是用于判断容器是否已准备好接收客户端请求的机制。当探测失败时,K8s 会将该容器从 Service 的 Endpoint 中暂时移除,直到探测成功为止。
核心作用
- 避免流量转发到未就绪容器:确保只有当容器完全准备好时,才会将流量分配给它。
- 支持优雅上线和下线:在容器启动、升级或重启过程中,防止客户端请求被转发到不可用的实例。
- 提升服务稳定性:减少因容器未完全初始化而导致的请求失败率。
HTTP探测实战(最常用)
向容器发送 HTTP 请求,若返回状态码为 200-399,则表示检查成功。
示例:创建Pod- [root@master ~/probe]# cat readiness.yaml
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- readinessProbe:
- httpGet:
- # http请求的端口
- port: 80
- # http请求的路径
- path: /
- # http请求的主机
- # host: 127.0.0.1
- # 请求方式
- scheme: HTTP
- # 超时时间,指定5秒
- timeoutSeconds: 5
- # 探针检查成功后,需要连续3次检查失败才认为容器出现问题
- failureThreshold: 3
- # 探针检查失败后,需要连续1次检查成功才认为容器恢复正常
- successThreshold: 1
- # 探针检查的执行间隔时间,指定3秒
- periodSeconds: 3
- # 容器启动后等待15秒再开始执行探针检查
- initialDelaySeconds: 15
- [root@master ~/probe]# kubectl apply -f readiness.yaml
- pod/nginx created
复制代码 创建Service- [root@master ~/probe]# cat service.yaml
- apiVersion: v1
- kind: Service
- metadata:
- name: nginx-service
- spec:
- type: ClusterIP
- selector:
- # 选择标签为 app: nginx 的 Pod
- app: nginx
- ports:
- - name: http
- protocol: TCP
- # Service的端口
- port: 80
- # Pod 上的端口
- targetPort: 80
- [root@master ~/probe]# kubectl apply -f service.yaml
- service/nginx-service created
复制代码 检查Pod、Service、EndPoint资源,发现EndPoint关联的是Pod的IP,符合预期- [root@master ~/probe]# kubectl get po,svc,ep -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- pod/nginx 1/1 Running 0 4m2s 100.95.185.232 node02 <none> <none>
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- service/nginx-service ClusterIP 10.96.1.43 <none> 80/TCP 112s app=nginx
- NAME ENDPOINTS AGE
- endpoints/nginx-service 100.95.185.232:80 112s
复制代码 修改Pod的就绪探针
- [root@master ~/probe]# cat readiness.yaml
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- readinessProbe:
- httpGet:
- port: 80
- # http请求的路径,指定为/test,这里应该会返回404
- path: /test
- scheme: HTTP
- timeoutSeconds: 5
- failureThreshold: 3
- successThreshold: 1
- periodSeconds: 3
- initialDelaySeconds: 15
- # 重新创建Pod
- [root@master ~/probe]# kubectl apply -f readiness.yaml
- pod/nginx created
复制代码 重新检查Pod、Service、EndPoint资源,发现EndPoint资源没有关联Pod的IP- [root@master ~/probe]# kubectl get po,svc,ep -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- pod/nginx 0/1 Running 0 2m5s 100.95.185.233 node02 <none> <none>
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- service/nginx-service ClusterIP 10.96.1.43 <none> 80/TCP 6m19s app=nginx
- NAME ENDPOINTS AGE
- endpoints/nginx-service 6m19s
复制代码 查看Pod的详细信息,发现Readiness probe failed- [root@master ~/probe]# kubectl describe po nginx
- Name: nginx
- Namespace: default
- ## 省略万字内容
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal Scheduled 84s default-scheduler Successfully assigned default/nginx to node02
- Normal Pulling 84s kubelet Pulling image "nginx"
- Normal Pulled 81s kubelet Successfully pulled image "nginx" in 2.552840126s (2.552844946s including waiting)
- Normal Created 81s kubelet Created container nginx
- Normal Started 81s kubelet Started container nginx
- Warning Unhealthy 9s (x21 over 66s) kubelet Readiness probe failed: HTTP probe failed with statuscode: 404
复制代码 Exec和TCP探测方式(省略)
可以参考上文的存活性探针的案例
启动探针(startup probe)详解
启动探针(Startup Probe)在Kubernetes(K8s)1.16+之后的版本才支持。
在 Kubernetes(K8s)中,启动探针(Startup Probe) 是专门为启动缓慢的应用设计的健康检查机制。它允许应用有更多的时间完成初始化,避免被存活探针(Liveness Probe)误判为失败而频繁重启。
- 如果使用启动性探针,则其它的探针则会禁用,直到该探针探测成功为止
- 如果探测失败,k8s将会杀死该Pod,然后按照Pod的重启策略进行重启
- 如果容器没有提供启动探测,则默认状态为 Success。
- 对于startup探针是一次性检测,容器启动时进行检测,检测成功后,才会调用其它探针。且此探针不再生效
核心作用
- 保护慢启动应用:为初始化时间较长的应用提供专门的检测机制,避免存活探针过早触发重启。
- 避免重启循环:防止因应用启动时间超过存活探针的超时设置,导致的 "启动 - 检测失败 - 重启" 恶性循环。
- 兼容各类应用:支持不同类型的应用(如 Java、数据库、大数据处理框架)按照自身节奏完成启动。
HTTP探测方式(最常用)
向容器发送 HTTP 请求,若返回状态码为 200-399,则表示检查成功。- [root@master ~/probe]# cat startup.yaml
- apiVersion: v1
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- # 指定重启策略为Always
- restartPolicy: Always
- containers:
- - name: nginx
- image: nginx
- startupProbe:
- httpGet:
- # http请求的端口
- port: 80
- # http请求的路径
- path: /
- # http请求的主机
- # host: 127.0.0.1
- # 请求方式
- scheme: HTTP
- # 超时时间,指定5秒
- timeoutSeconds: 5
- # 探针检查成功后,需要连续3次检查失败才认为容器出现问题
- failureThreshold: 3
- # 探针检查失败后,需要连续1次检查成功才认为容器恢复正常
- successThreshold: 1
- # 探针检查的执行间隔时间,指定3秒
- periodSeconds: 3
- # 容器启动后等待15秒再开始执行探针检查
- initialDelaySeconds: 15
- [root@master ~/probe]# kubectl apply -f startup.yaml
- pod/nginx created
- # 查看Pod的状态
- [root@master ~/probe]# kubectl get po
- NAME READY STATUS RESTARTS AGE
- nginx 1/1 Running 0 2m16s
复制代码 当探测失败时会发生什么呢?
- [root@master ~/probe]# cat startup.yaml
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- # 指定重启策略为Always
- restartPolicy: Always
- containers:
- - name: nginx
- image: nginx
- startupProbe:
- httpGet:
- port: 80
- # http请求的路径,指定/test,预计返回404
- path: /test
- scheme: HTTP
- # 超时时间,指定5秒
- timeoutSeconds: 5
- failureThreshold: 3
- successThreshold: 1
- periodSeconds: 3
- initialDelaySeconds: 15
- [root@master ~/probe]# kubectl apply -f startup.yaml
- pod/nginx created
- #查看Pod的状态,发现容器一直在重启
- [root@master ~/probe]# kubectl get po
- NAME READY STATUS RESTARTS AGE
- nginx 0/1 Running 3 (12s ago) 85s
复制代码 Exec和TCP探测方式(省略)
可以参考上文的存活性探针的案例
一个完整的案例
- kind: Pod
- apiVersion: v1
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- restartPolicy: Never
- containers:
- - name: nginx
- image: nginx
- # 启动探针
- startupProbe:
- httpGet:
- port: 80
- path: /
- scheme: HTTP
- timeoutSeconds: 5
- failureThreshold: 3
- successThreshold: 1
- periodSeconds: 3
- initialDelaySeconds: 15
- # 存活探针
- livenessProbe:
- httpGet:
- port: 80
- path: /
- scheme: HTTP
- timeoutSeconds: 5
- failureThreshold: 3
- successThreshold: 1
- periodSeconds: 3
- initialDelaySeconds: 15
- # 就绪探针
- readinessProbe:
- httpGet:
- port: 80
- path: /
- scheme: HTTP
- timeoutSeconds: 5
- failureThreshold: 3
- successThreshold: 1
- periodSeconds: 3
- initialDelaySeconds: 15
复制代码 三个探针的区别
维度存活探针(Liveness)就绪探针(Readiness)启动探针(Startup)核心目标检测容器是否存活,失败则重启容器检测容器是否就绪,失败则移除端点处理启动延迟,延迟其他探针的执行对 Pod 的影响重启容器从服务端点移除无直接影响(成功后触发其他探针)执行时机容器启动后,按周期持续检测容器启动后,按周期持续检测仅在容器启动阶段执行,成功后停止典型场景处理应用逻辑错误导致的 “假死” 状态确保 Pod 准备好接收流量支持启动缓慢的应用(如数据库初始化)依赖关系无无优先于存活 / 就绪探针执行
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |