时间:2025-05-31 20:11
人气:
作者:admin
官方文档:
容器探测用于检测容器中的应用实例是否正常工作,是保障业务可用性的一种传统机制。如果经过探测,实例的状态不符合预期,那么kubernetes就会把该Pod进行重启或者不承担业务流量。kubernetes提供了三种探针来实现容器探测,分别是:
作用:检测容器内应用是否处于崩溃、死锁或无响应状态,若检测失败则自动重启容器。
场景:
效果:无需人工干预,K8s 自动重启故障容器,提升系统可用性。
作用:确保只有当容器完全准备好接收请求时,才会将流量分配给它。
场景:
效果:防止客户端请求被转发到未完全启动的容器,减少请求失败率。
作用:为启动时间较长的应用提供专门的检测机制,避免存活探针过早触发重启。
场景:
效果:避免因启动时间过长导致的频繁重启循环,节省系统资源。
作用:在 Deployment 进行滚动更新时,就绪探针确保旧版本容器优雅下线,新版本容器完全就绪后再接收流量。
场景:微服务架构中,服务 A 更新时需要确保服务 B 不会调用到未就绪的 A 实例。
效果:减少服务更新过程中的请求失败率,实现无缝升级。
作用:通过精准的健康检查,K8s 可以:
效果:提高集群资源利用率,降低运维成本。
探针可以通过以下几种方式执行检查:
po.spec.containers.livenessProbe.
httpGet:
scheme: HTTP #支持的协议,http或者https
port: 80 #端口号
path: /hello #URI地址
host: 127.0.0.1 #ip地址
po.spec.containers.livenessProbe.
tcpSocket:
port: 8080 # 尝试访问8080端口
po.spec.containers.livenessProbe.
exec:
command:
- cat
- /etc/hosts
探针的核心配置参数如下:
在 Kubernetes(K8s)中,存活探针(Liveness Probe) 是用于监控容器内部应用是否处于健康运行状态的核心机制。当探测失败时,K8s 会自动重启容器,确保应用始终可用,如果容器没有提供健康状态检查,则默认为success
向容器发送 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
在容器内执行指定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 连接,若能成功连接,则检查通过。
[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
在 Kubernetes(K8s)中,就绪探针(Readiness Probe) 是用于判断容器是否已准备好接收客户端请求的机制。当探测失败时,K8s 会将该容器从 Service 的 Endpoint 中暂时移除,直到探测成功为止。
向容器发送 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
[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
可以参考上文的存活性探针的案例
启动探针(Startup Probe)在Kubernetes(K8s)1.16+之后的版本才支持。
在 Kubernetes(K8s)中,启动探针(Startup Probe) 是专门为启动缓慢的应用设计的健康检查机制。它允许应用有更多的时间完成初始化,避免被存活探针(Liveness Probe)误判为失败而频繁重启。
向容器发送 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
可以参考上文的存活性探针的案例
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 准备好接收流量 | 支持启动缓慢的应用(如数据库初始化) |
| 依赖关系 | 无 | 无 | 优先于存活 / 就绪探针执行 |
本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18905316,微信Vac6666666,欢迎交流
上一篇:K8s新手系列之Job资源
下一篇:Helm介绍及安装
Ubuntu离线环境部署Kubernetes v1.31.3(ARM64)