直接部署PHP 8.3-FPM容器到Kubernetes的关键在于稳定、弹性与可观测:需搭配Nginx或Ingress代理HTTP请求;强制多阶段构建精简镜像并以非root用户运行;正确配置pm.status_path与Nginx路由实现HTTP健康探针;Deployment与Service标签及端口严格对齐;通过ConfigMap/Secret分离配置与敏感信息;设置合理资源请求与会话亲和性。

直接部署 PHP 8.3-FPM 容器到 Kubernetes,关键不是“能不能跑”,而是“能不能稳、能不能扩、能不能查”。PHP-FPM 本身不处理 HTTP 请求,必须搭配 Web 服务器(如 Nginx)或由 Ingress controller 代理;单独部署一个只暴露 9000 端口的 PHP-FPM Pod,在 K8s 中无法被外部访问,也容易因探针配置错误反复重启。
用多阶段构建精简镜像
别用 php:8.3-fpm 基础镜像直接 COPY 代码——它默认含 dev 工具、未禁用 xdebug、以 root 运行,且体积常超 400MB。应强制分阶段:
- 构建阶段用
php:8.3-cli-slim-bookworm或composer:2,只装依赖、执行composer install --no-dev --optimize-autoloader - 运行阶段切到
php:8.3-fpm-alpine或php:8.3-fpm-slim-bookworm,仅 COPYvendor/、public/、config/等必需目录 - 务必添加非 root 用户:
RUN adduser -u 1001 -D -s /bin/sh www && chown -R www:www /var/www,再USER www - 启用 OPcache 并调优:
opcache.enable=1、opcache.memory_consumption=128、opcache.max_accelerated_files=20000
正确配置探针与健康端点
PHP-FPM 不监听 HTTP,livenessProbe 若直连 :9000/status 必失败。必须通过 Web 层暴露状态页:
- 在
www.conf中启用:pm.status_path = /status、ping.path = /ping(注意:仅当pm = dynamic或ondemand时生效) - Nginx 配置中添加:
location ~ ^/(status|ping)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; } - Deployment 中 readiness/liveness 使用 HTTP 探测:
httpGet: path: /status port: 80,而非 TCP 到 9000 -
initialDelaySeconds设为 15–30 秒,避免 FPM 还没加载完就触发检查
Deployment 与 Service 必须对齐
常见故障源于标签或端口错位。FPM Pod 的 Service 必须精准匹配其生命周期和通信路径:
立即学习“PHP免费学习笔记(深入)”;
- Deployment 中
spec.selector.matchLabels(如app: php83-fpm)必须与 Pod template 的metadata.labels完全一致 - Service 的
spec.selector指向同一 label;spec.ports.targetPort必须等于容器中 PHP-FPM 监听的端口(默认 9000) - 若 PHP 使用文件 Session,Service 需开启
sessionAffinity: ClientIP,否则用户请求可能路由到无 session 文件的 Pod - 资源请求建议设为
requests.cpu: 100m, requests.memory: 128Mi,限制不超过limits.memory: 512Mi(防 OOMKill)
环境与配置分离管理
硬编码数据库地址或密钥会污染镜像,也不利于多环境切换:
- 用 ConfigMap 存放
php.ini覆盖项(如upload_max_filesize、max_execution_time),挂载进容器/usr/local/etc/php/conf.d/ - 用 Secret 存储 DB 凭据,通过环境变量注入:
envFrom: [{secretRef: {name: php-db-secret}}] - 避免在镜像里写死
DB_HOST=mysql,改用getenv('DB_HOST')+ Downward API 或 initContainer 预检服务可用性



















