Pod 资源清单核心字段回顾
然后是内容:
- 接口组合版本:核心组
v1版本 - 资源类型:
Pod - 元数据(Metadata):定义Pod名称、所属命名空间、标签(Labels),标签需匹配关联Service的标签选择器要求(如示例中要求标签包含
app=myapp才会被Service匹配) - 规格(Spec)核心配置:
- 期望容器组(Containers):包含容器名称、镜像地址(如示例中的
myapp:v1.0)、镜像下载策略(IfNotPresent:本地存在镜像则不拉取,不存在再从远程仓库下载)
- 期望容器组(Containers):包含容器名称、镜像地址(如示例中的
就绪探测(Readiness Probe)
readinessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
核心作用
仅当Pod的就绪探测通过时,Pod才会被关联的Service加入后端 endpoints,接入负载均衡向用户提供访问,避免流量转发到未准备就绪的Pod。
探测执行规则
从Pod创建开始,持续在整个容器生命周期内执行探测,并非仅探测一次:若后续探测失败,Pod会从就绪状态变为未就绪状态,自动从Service后端移除,停止承接流量。
常见探测方式
- HTTP GET 探测
- 配置逻辑:向Pod指定端口发送HTTP GET请求,返回200状态码则判定为探测通过,否则失败。
- 实验演示:
- 示例配置:探测80端口的
/index1.html路径,延迟1s开始探测,每3s进行一次重复探测。 - 现象:因示例镜像中不存在
index1.html文件,探测持续失败,Pod状态为Running但未就绪,虽标签匹配Service,但不会被加入负载均衡;手动进入Pod容器,在/usr/local/nginx/html/目录下创建index1.html文件后,探测通过,Pod变为就绪,自动接入负载均衡,访问可正常返回200。
- 示例配置:探测80端口的
- Exec 命令探测
- 配置逻辑:在Pod容器内执行指定命令,命令退出码为0则判定为探测通过,否则失败。
- 示例:执行
test -f /tmp/live判断文件是否存在,文件存在则通过,否则失败。
- TCP Socket 探测
- 配置逻辑:尝试与Pod指定端口建立TCP连接,连接成功则判定为探测通过,否则失败。
- 注意:该方式使用率低,仅作补充了解,因为端口监听状态不代表服务一定可用(如服务死锁但端口仍处于监听状态)。
关键结论
就绪探测是保障服务流量的核心机制,可避免未准备就绪的Pod承接用户流量,建议所有对外提供服务的Pod都配置就绪探测。
存活探测(Liveness Probe)
核心作用
解决“容器进程存在但服务已损坏”的问题(如进程死锁、死循环、服务假死等),保障运行的Pod一定可正常提供服务,出现故障时自动恢复,实现自愈。
核心配置参数
| 参数 | 默认值 | 最小值 | 说明 |
|---|---|---|---|
initialDelaySeconds |
0s | 0s | Pod启动后首次探测的延迟时间 |
periodSeconds |
10s | 1s | 两次探测之间的间隔时间 |
timeoutSeconds |
1s | 1s | 单次探测的超时时间,超时即判定为失败 |
successThreshold |
1 | 1 | 探测成功的阈值,达到次数即标记为存活 |
failureThreshold |
3 | 1 | 探测失败的阈值,达到次数即触发后续处理 |
探测行为规则
- 探测成功:静默处理,不执行任何操作
- 探测失败:根据Pod配置的重启策略执行操作,注意此处的“重启”实际为重建:K8s会杀死当前故障容器,创建全新的同规格容器替换原有容器,并非重启原有容器进程。
默认重启策略
Always(默认策略):无论容器以0(正常退出)还是非0(异常退出)退出码终止,都会触发容器重建OnFailure:仅容器以非0退出码终止时触发重建Never:无论容器如何终止,都不会触发重建
常见探测方式及实验演示
- Exec 命令探测
- 示例配置:容器启动后先执行
touch /tmp/live创建文件,休眠60s后删除该文件,再休眠3600s;存活探测执行test -e /tmp/live判断文件是否存在。 - 实验现象:
- Pod创建后60s内文件存在,探测通过,Pod处于就绪状态
- 60s后文件被删除,探测失败,因默认重启策略为
Always,触发容器重建,新Pod启动后会重新创建/tmp/live文件,再次进入就绪状态 - 新Pod运行60s后文件再次被删除,探测再次失败,再次触发重建,Pod重启次数持续增加
- 验证结论:存活探测会持续执行,失败后会重建容器,且新容器与原有容器是完全独立的实例。
- 示例配置:容器启动后先执行
- HTTP GET 探测
- 示例配置:探测80端口的
/index.html主页,延迟1s开始探测,每3s探测一次,超时3s判定为失败。 - 实验演示:进入运行中的Pod容器,将
/usr/local/nginx/html/下的index.html改名为index.html.backup,此时主页文件不存在,HTTP探测返回404失败,存活探测判定失败,触发容器重建;再次进入新Pod的对应目录查看,仅存在默认的index.html文件,原有的备份文件已消失,证明是全新容器被创建,原有故障容器已被杀死。
- 示例配置:探测80端口的
- TCP Socket 探测
- 配置:延迟5s开始探测,超时1s,探测80端口的TCP连接。
- 注意:该方式不推荐使用,仅作了解,因为端口通仅代表端口处于监听状态,不代表服务可正常处理请求。
关键结论
- 未配置存活探测的Pod,可能出现容器运行但服务无法正常提供的情况,无法自动恢复,建议所有对外提供服务的Pod配置存活探测
- 存活探测是K8s实现应用自愈的核心机制之一,可自动处理服务故障场景
AI 总结
主要讲解了Kubernetes Pod生命周期中就绪探测与存活探测的核心概念、配置方式及实验验证。就绪探测用于控制Pod是否接入Service承接流量,保障流量仅转发到可用Pod;存活探测用于保障运行中Pod的服务可用性,故障时自动重建实现自愈。两种探测均支持HTTP GET、Exec命令、TCP Socket三种实现方式,其中HTTP GET与Exec方式为常用方案,TCP Socket方式因局限性仅作补充了解。同时明确了Pod重启策略的默认规则,以及存活探测失败后的重建机制,强调了两类探测对于生产环境服务稳定性的重要价值,建议所有对外服务的Pod都配置对应的探测机制。
相关常用命令及细节补充
- 查看Pod完整配置(含默认参数):
kubectl get pod <pod名> -o yaml,可查看重启策略等默认配置 - 监视Pod状态变化:
kubectl get pod -w,资源对象变更时仅打印变化部分,无需重复查询 - 查看Pod事件与状态详情:
kubectl describe pod <pod名>,可查看探测失败的具体原因(如404、超时等) - 查看Pod所在节点:
kubectl get pod -o wide - 进入Pod容器执行命令:
kubectl exec -it <pod名> -- <要执行的命令>,若Pod内仅有一个容器,可省略-c <容器名>参数 - Pod内容器命名规则:
k8s_<容器名>_<Pod名>_<命名空间>_<MD5哈希值>_<启动序号>,启动序号代表该容器是Pod内该容器的第几次启动实例,0为首次启动,1为第二次,以此类推 - 查看Pod重启次数:
kubectl get pod输出的RESTARTS列会显示该Pod的重启总次数