Laravel 在 Kubernetes 上稳定运行的关键是确保 PHP-FPM 健康、环境变量准确、文件权限正确、配置不硬编码;需合理设置 replicas 和 livenessProbe,使用 Service 名而非 localhost 作为 DB_HOST,APP_ENV 设为 production,敏感信息走 Secret,构建时清理 storage/ 和 bootstrap/cache/,Ingress 配置适配 Laravel 路由重写。

直接说结论:Laravel 要在 Kubernetes 上稳住,核心不是“能不能跑”,而是“怎么让 PHP-FPM 不崩、环境变量不丢、文件权限不乱、配置不硬编码”。
Deployment 里必须设对 replicas 和 livenessProbe
很多人只写 replicas: 3 就以为高可用,但没配健康检查,Pod 假死时 K8s 根本不会重启它——比如 PHP-FPM 进程卡住、opcache 内存溢出、或 storage/logs 写满导致日志轮转失败,都会让容器“活着但不响应”。
- 用
livenessProbe检查/healthz(建议 Laravel 自建路由,返回 HTTP 200 + 简单 JSON) - 避免用
readinessProbe直接调/—— 首页加载慢或 DB 连接抖动会导致 Pod 被反复踢出 Service -
initialDelaySeconds至少设为 30:Laravel 启动要加载配置、缓存、服务提供者,PHP-FPM 初始化也需时间
env 字段别漏掉 APP_ENV 和 DB_HOST 的 Service 名
Kubernetes 里没有 localhost,所有外部依赖都靠 Service DNS 解析。写成 DB_HOST: localhost 或 127.0.0.1 是最常见部署失败原因。
-
DB_HOST必须填 MySQL Service 的metadata.name,比如mysql-service(不是 Pod 名,也不是 IP) -
APP_ENV设为production才会禁用调试信息、启用缓存;设错会导致config:cache失效或报错Class 'App\Http\Controllers\Controller' not found - 敏感值如
APP_KEY一定走Secret,别塞进 Deployment 的env.value——镜像或 YAML 泄露就等于密钥裸奔
Dockerfile 里 COPY . /var/www/html 前必须清空 storage/ 和 bootstrap/cache/
Laravel 容器启动时如果发现 storage/framework/cache/data 里有旧的 opcache 文件或 session 数据,可能因 UID/GID 不一致(宿主机 vs 容器 www-data)导致权限拒绝、chmod 失败、甚至 php-fpm 拒绝启动。
- 构建阶段加一句:
RUN rm -rf storage/* bootstrap/cache/*,再COPY项目代码 - 运行时用
emptyDir或PVC挂载storage/logs和storage/app,但storage/framework必须是容器内可写路径(不能只读挂载) - 别信“
chown -R www-data:www-data /var/www/html/storage”能一劳永逸——Alpine 镜像里www-dataUID 可能是 82,而 Debian 是 33,K8s 默认以 root 启动 initContainer,权限链容易断
Ingress 配置要绕开 index.php 路径重写陷阱
Nginx Ingress Controller 默认不支持 Laravel 的 try_files $uri $uri/ /index.php?$query_string,直接暴露 Service 会 404 所有带路由参数的请求(比如 /admin/users/5/edit)。
- 要么在 Ingress annotation 里加:
nginx.ingress.kubernetes.io/rewrite-target: /$2+ path 规则写成/admin(/|$)(.*) - 要么用
ConfigMap自定义 Nginx 配置块,把location ~ \.php$和try_files补全 - 测试时 curl -I http://your-domain.test/admin → 看返回是不是 200,而不是 404 或 502;502 很大概率是 PHP-FPM 没监听到
127.0.0.1:9000或 socket 权限不对
真正麻烦的从来不是写完 YAML,而是当流量上来后,php-fpm 子进程被 OOM Killer 干掉、DOMPDF_TEMP_DIR 指向 /tmp 导致磁盘打满、或者 ConfigMap 更新后应用没 reload——这些都不会报错,只会默默变慢或间歇性失败。










