Kubernetes编排PHP容器需做好四件事:分层构建Nginx与PHP-FPM镜像;Deployment配置健康探针及标签对齐;用ConfigMap和Secret管理环境差异化配置;通过Ingress暴露服务并支持灰度路由。

用Kubernetes编排PHP容器,核心是把传统PHP Web服务拆解为可调度、可感知、可伸缩的云原生组件。关键不在“能不能跑”,而在“是否稳定暴露、能否按需扩缩、配置是否一致”。下面从实操角度讲清楚四件必须做好的事。
分层构建Nginx与PHP-FPM镜像
别再用php:apache单体镜像——它进程模型僵硬、难以水平扩展。推荐解耦为两个独立镜像:
- Nginx镜像只负责静态资源和FastCGI转发,Dockerfile基于
nginx:alpine,精简配置,不装PHP扩展 - PHP-FPM镜像专注执行逻辑,FROM
php:8.2-fpm-alpine,预装pdo_mysql、opcache、gd等必需扩展,代码通过COPY或挂载注入 - 构建后检查镜像大小,控制在120MB以内;超限会显著拖慢Pod启动,影响滚动更新体验
Deployment必须带健康探针和标签对齐
Kubernetes不会主动判断你的PHP是否真能处理请求,全靠探针说话:
-
Liveness探针检测PHP-FPM进程存活,建议用
tcpSocket: port: 9000,避免HTTP层误判(比如502时PHP-FPM其实还活着) -
Readiness探针走HTTP,路径设为
/healthz,由PHP脚本返回200,确保只有真正就绪的Pod才被加入Service流量池 - Deployment中
spec.selector.matchLabels和Pod模板里的metadata.labels必须一字不差,比如都写app: php-fpm,否则Service找不到后端
用ConfigMap和Secret管理配置差异
开发、测试、生产环境的php.ini、数据库地址、缓存开关不该靠改镜像来切换:
立即学习“PHP免费学习笔记(深入)”;
- 非敏感配置(如
upload_max_filesize、opcache.enable)放进ConfigMap,以卷形式挂载到/usr/local/etc/php/conf.d/ - 敏感信息(数据库密码、JWT密钥)用Secret,base64编码后注入为环境变量,PHP里用
getenv('DB_PASSWORD')读取 - 所有环境共用同一镜像,仅靠ConfigMap/Secret组合切换行为,彻底告别“在我机器上能跑”问题
Ingress暴露服务并支持灰度路由
NodePort太裸露,LoadBalancer成本高,Ingress才是生产首选:
- 定义Ingress资源,host字段填域名(如
app.example.com),path匹配根路径/ - 后端Service的
spec.ports.targetPort必须与PHP-FPM容器EXPOSE端口一致(默认9000),且Service类型为ClusterIP - 需要灰度发布时,在Ingress注解里加
nginx.ingress.kubernetes.io/canary: "true",配合Header或Cookie规则分流,不用动代码



















