如何在 Kubernetes 环境中配置 PHP-FPM 就绪探针检测存活?
核心结论:在 Kubernetes 1.16+ 版本中,通过配置 readinessProbe 的 httpGet 或 exec 探针,可将 PHP-FPM 容器的就绪检测延迟设置为 initialDelaySeconds: 30 秒,避免因应用未完全初始化就接收流量导致的 502 错误。
原因分析
PHP-FPM 容器在 Kubernetes 集群中容易出现"假存活"状态——进程仍在运行但无法处理请求。根据 Kubernetes 探针机制,存活探针 (Liveness Probe) 负责检测容器是否正常运行,失败时会重启容器;就绪探针 (Readiness Probe) 负责判断容器是否准备好接收流量,失败时会将 Pod 从 Service 端点中移除。
常见问题场景:PHP 应用启动时需要加载配置、建立数据库连接、预热缓存等,这个过程可能耗时 10-30 秒。如果未配置就绪探针,Kubernetes 会在容器启动后立即将流量转发到该 Pod,导致用户看到"502 Bad Gateway"错误。根据 2026 年 3 月 6 日的技术资料,启动探针 (Startup Probe) 是 Kubernetes 1.16 版本后加入的特性,专门解决启动慢的应用问题。
解决方案
方案一:HTTP GET 探针配置(推荐)
在 PHP 应用中创建一个健康检查端点(如/healthz 或/ready),返回 200-400 状态码表示健康。配置示例:
livenessProbe:
httpGet:
path: /healthz
port: 9000
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 9000
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
failureThreshold: 3参数说明:initialDelaySeconds 设置容器启动后延迟探测时间(建议 30 秒),periodSeconds 设置探测间隔(每 10 秒一次),timeoutSeconds 设置超时时间(5 秒内未响应则判定失败),failureThreshold 设置连续失败 3 次后判定为不健康。
方案二:Exec 命令探针配置
在容器内执行命令检测 PHP-FPM 状态,返回码为 0 视为健康:
readinessProbe:
exec:
command:
- /bin/sh
- -c
- "php-fpm -t || exit 1"
initialDelaySeconds: 5
periodSeconds: 10或者检测进程是否存在:command: ["pgrep", "php-fpm"]。根据 2024 年 5 月 21 日的实战资料,exec 探针适合没有 HTTP 接口的场景,但需要注意命令执行的性能开销。
方案三:TCP Socket 探针配置
尝试与 PHP-FPM 的 9000 端口建立 TCP 连接,成功建立视为健康:
readinessProbe:
tcpSocket:
port: 9000
initialDelaySeconds: 15
periodSeconds: 20根据 2026 年 3 月 8 日发布的 Kubernetes 健康检查指南,TCP 探针配置简单但只能检测端口连通性,无法判断应用是否真正就绪。
注意事项
1. 避免探针过于频繁:periodSeconds 不建议设置为低于 5 秒,否则会增加容器负载。根据 2026 年 1 月 21 日的博客文章,探测间隔过短可能导致正常应用被误判为不健康。
2. 启动探针优先:对于启动时间超过 30 秒的 PHP 应用,建议先配置 startupProbe,避免存活探针在应用启动完成前就判定失败。启动探针仅在启动时执行,成功后才启用存活和就绪探针。
3. 超时时间设置:timeoutSeconds 建议设置为 3-5 秒,过短会导致网络波动时误判,过长会延长故障检测时间。根据官方文档,HTTP 探测器向指定路径和端口发送请求,Kubelet 将 probe 发送到容器的 IP 地址。
4. 端口号范围:端口号必须介于 1 和 65535 之间,PHP-FPM 默认使用 9000 端口。如果配置错误端口(如 8080),会导致探针持续失败,Pod 状态显示为 0/1 Ready。
5. 重启策略影响:livenessProbe 失败会触发容器重启(restartPolicy: Always),readinessProbe 失败只会将 Pod 从 Service 端点移除,不会重启容器。两者搭配使用才能实现高可用。
参考来源
来源:Kubernetes 官方文档 - 配置存活、就绪和启动探针(截至 2026 年 4 月 15 日)
来源:51CTO 技术博客 - K8s 容器健康检查:存活与就绪探针配置(2026 年 1 月 21 日发布)
来源:Kubernetes 健康检查终极指南 - 如何配置就绪探针与存活探针(2026 年 3 月 8 日发布)
来源:阿里云开发者社区 - 深入解析 Kubernetes 探针原理配置与实践(2024 年 8 月 9 日)