symfony6部署kubernetes需定制化:必须用php-fpm+nginx分离架构、多阶段构建、secret注入敏感配置、自定义健康检查路由、仅挂载var/cache和var/log并设正确fsgroup权限。

Symfony6 应用部署到 Kubernetes 不是简单套用 dotnet 或 node 的模板就能跑通的。它依赖 PHP 运行时、OPcache、文件权限、环境变量注入和健康检查逻辑,稍有偏差就会出现 500 错误、配置未加载、或 Pod 反复重启。
PHP 镜像选型:别直接用 php:8.2-apache
官方 php:8.2-apache 镜像默认启用 mod_php,但 Symfony6 推荐使用 php-fpm + 反向代理(如 Nginx)分离架构,否则无法精细控制请求超时、缓冲区、OPcache 清理等关键项。
- 生产环境必须用多阶段构建:构建阶段装
composer和依赖,运行阶段只保留php-fpm运行时 - 避免在镜像里执行
composer install—— 容器启动时再做会拖慢就绪探针响应,且易因网络失败卡住 - 确认镜像中已启用
opcache.save_comments=1和opcache.enable=1,否则 Doctrine Proxy 或 Twig 编译会失败 - Alpine 镜像要小心:某些扩展(如
ext-ldap)需手动编译,不如debian:slim稳定
环境变量与配置注入:不能靠 .env 文件
Kubernetes 中 .env 文件不可靠:它可能被 Git 跟踪、挂载为只读卷后无法修改、或被 configmap 覆盖导致格式错乱。Symfony6 的 %env() 解析器对空格和换行敏感,configmap 直接挂载易出错。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 所有敏感配置(
DATABASE_URL、MAILER_DSN)必须用Secret对象,通过envFrom注入容器 - 非敏感配置(
APP_ENV=prod、APP_DEBUG=false)可写死在 Deployment 的env字段里,避免挂载额外卷 - 若要用
configmap挂载services.yaml等配置,确保 key 名与 Symfony 实际读取路径一致(例如data.services-yaml≠services.yaml),否则容器启动报File not found
Liveness/Readiness 探针:别用 /healthz 硬编码
Symfony6 默认不提供 /healthz 路由。直接照搬其他语言的探针配置,会导致 Pod 被反复 kill —— 因为 HTTP 404 触发 liveness 失败。
- 要么加一个轻量路由(如
#[Route('/up', name: 'health')]返回 200),并在public/index.php前置判断避免走完整内核 - 要么用
exec探针调用php bin/console debug:container --no-debug | head -n1,验证容器能加载核心服务 - readiness 探针超时时间建议 ≥15s:首次启动时 OPcache warmup、Doctrine schema cache 生成可能耗时较长
- 避免在探针里调用数据库 —— 若 DB 临时不可用,整个服务会被标记为 unready,形成雪崩
PersistentVolumeClaim:只挂载 var/cache 和 var/log
Symfony6 的 var/cache 和 var/log 是唯一需要持久化的目录。挂载整个 var/ 或 /var/www/html 会导致权限冲突、缓存失效、甚至 cache:clear 命令失败。
- 用
emptyDir即可满足多数场景:Pod 重建后 cache 自动重建,log 可通过 sidecar 收集 - 若需跨 Pod 共享日志(如调试时 tail -f),才考虑
PVC,但必须设置fsGroup: 33(www-data UID),否则 PHP 进程无权写入 -
var/cache绝对不能挂载为readOnly: true—— 否则每次请求都会触发 cache rebuild,CPU 暴涨 - 不要在 Deployment 中设置
securityContext.runAsUser: 33后又忽略fsGroup,这是最常被忽略的权限断点
实际部署时,最麻烦的不是写 YAML,而是确认 PHP 进程看到的 UID/GID、OPcache 是否生效、以及环境变量是否真被 $_SERVER 捕获 —— 这些都得进容器 exec 里逐条验证,不能只看 Pod Ready 状态。










