Kubernetes 部署 PHP 8.1 FPM 镜像健康检查怎么做?
核心结论:在 Kubernetes 中部署 PHP 8.1 FPM 镜像时,必须配置 livenessProbe、readinessProbe 和 startupProbe 三种探针,其中 HTTP 探测返回码需在 200~399 范围才算成功,startupProbe 的 failureThreshold 建议设置为 30、periodSeconds 设置为 10 以保护慢启动应用。
原因分析
PHP-FPM 容器在 Kubernetes 中容易出现"Pod 状态显示正常但应用程序异常"的情况。根据 2020 年 12 月 1 日的技术分析,容器的主进程为 pid 为 1 的进程,此进程为 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果进程退出时返回码非零,则认为容器发生故障,Kubernetes 就会根据 restartPolicy 重启容器。但问题在于:如果 php-fpm 的进程被 kill,而 nginx 的进程仍在,针对这种情况,容器认为主进程还在,健康检查也就通过,所以并不会重启容器。这就是为什么必须配置独立的健康检查探针,而不是依赖容器默认的主进程检测机制。
解决方案
步骤一:编写 PHP-FPM Dockerfile
使用多阶段构建减小最终镜像大小。根据 2025 年 7 月 17 日的资料,推荐基础镜像为 php:8.2-fpm-alpine(PHP 8.1 可替换为 php:8.1-fpm-alpine)。关键配置包括:
FROM php:8.1-fpm-alpine
WORKDIR /var/www/html
RUN apk add --no-cache nginx build-base libzip-dev libpng-dev
&& docker-php-ext-install -j$(nproc) gd pdo_mysql opcache
&& rm -rf /var/cache/apk/*
注意:PHP 应用本身不能直接"实现 Kubernetes 部署"——Kubernetes 不运行 PHP,它运行容器;你需要先将 PHP 应用打包成容器镜像。
步骤二:配置三种健康检查探针
根据 2025 年 9 月 14 日的 Kubernetes 健康检查详解,三种探针的作用和配置如下:
1. Liveness Probe(存活探针):检测应用是否正常运行,失败时重启容器
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
2. Readiness Probe(就绪探针):检测应用是否准备好接收流量,失败时从 Service 端点移除
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 1
3. Startup Probe(启动探针):保护慢启动应用,避免在启动运行之前就被终止
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
periodSeconds: 10
步骤三:选择探测方式
根据 2025 年 7 月 24 日的资料,Kubernetes 提供三种探测方式:
HTTP 请求检查:针对提供 HTTP/HTTPS 服务的容器,如果 HTTP/HTTPS response 返回码属于 200~399 范围,则证明探测成功。例如:HTTP 检查路径为:/health-check,端口为:80,集群会周期性地对容器发起请求:GET http://172.16.0.186:80/health-check。
TCP 端口检查:对于提供 TCP 通信服务的容器,集群周期性地对该容器建立 TCP 连接,如果连接成功,则证明探测成功。例如:nginx 容器服务端口是 80,指定探测端口为 80。
执行命令检查:要求用户指定一个容器内的可执行命令,如果命令的返回结果是 0 则检查成功,否则检查失败。例如:exec: command: - cat - /tmp/healthy
注意事项
1. 500 或 404 错误:根据 2026 年 4 月 6 日的资料,很多 PHP 开发者卡在第一步:本地能跑的代码,放进容器就 500 或 404。核心是别直接抄 Apache 官方镜像的默认配置,要适配你的项目结构。
2. 主进程识别问题:根据 2020 年 12 月 1 日的实测,查看容器进程时发现 pid 为 1 的进程 cmd 为 entrypoint.sh,然后有一个 php-fpm 进程属于守护进程,还有一个 nginx 的前台进程。如果只依赖默认健康检查,php-fpm 挂掉但 nginx 仍在,容器不会重启。
3. 资源限制配置:根据 2023 年 9 月 10 日的节点问题探测器配置示例,建议设置 resources limits: cpu:"200m" memory:"100Mi",requests: cpu:"20m" memory:"20Mi"。
4. PHP 版本选择:使用 php:8.1-fpm 或 php:8.2-fpm 基础镜像,注意权限、环境配置、健康检查路径、Service 标签匹配及 opcache/autoload 预构建。
参考来源
来源:Kubernetes 官方文档 - Kubernetes 健康检查详解(2025 年 9 月 14 日收录)
来源:华为云 UCS 用户指南 - 设置容器健康检查(2025 年 7 月 24 日发布)
来源:技术社区 - PHP 容器部署到 Kubernetes 配置基础(2025 年 7 月 17 日资料)
来源:CSDN 技术博客 - k8s 健康检查原理分析(2020 年 12 月 1 日资料)