如何在 Kubernetes 环境中配置 PHP-FPM 就绪探针检测存活?

文章导读
在 Kubernetes 1.16+ 版本中,通过配置 readinessProbe 的 httpGet 或 exec 探针,可将 PHP-FPM 容器的就绪检测延迟设置为 initialDelaySeconds: 30 秒,避免因应用未完全初始化就接收流量导致的 502 错误。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

如何在 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 日的博客文章,探测间隔过短可能导致正常应用被误判为不健康。

如何在 Kubernetes 环境中配置 PHP-FPM 就绪探针检测存活?

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 日)