必须正确配置容器镜像构建、服务暴露、环境隔离与健康探针;需用 php:8.2-apache 或 php-fpm+nginx 组合镜像,启用 /healthz 和 /readyz 探针,ingress 配置 path_info 透传,上传目录挂载 pvc 并通过 initcontainer 修正权限。

在 Kubernetes 集群中稳定运行 Yii3.0 应用,必须正确配置容器镜像构建、服务暴露、环境隔离与健康探针——漏掉任一环节都可能导致 Pod 反复重启或流量无法进入。
构建可部署的 Yii3.0 容器镜像
Yii3.0 默认不包含生产就绪的 Web 服务器配置,直接用 php:alpine 运行会因缺少 Nginx/Apache 和 URL 重写规则而返回 404。
使用官方推荐的 multi-stage 构建方式,先用 composer 安装依赖,再复制到精简运行时镜像中:
① 创建 Dockerfile,内容如下:
【基础镜像必须用 php:8.2-apache 或 php:8.2-fpm + nginx:alpine 组合,禁用 php:8.2-cli 单独运行】
② 在项目根目录执行:docker build -t my-yii3-app:1.0 .
③ 推送至私有仓库:docker tag my-yii3-app:1.0 harbor.example.com/prod/my-yii3-app:1.0 && docker push harbor.example.com/prod/my-yii3-app:1.0
编写 Deployment 与 Service YAML
Yii3.0 应用需明确区分应用层(Pod)与网络层(Service),且必须挂载 configmap 存储 runtime 配置。
方法一:最小可用部署(适用于测试环境)
创建 deploy.yaml,定义 resources limits(Yii3.0 的 DI 容器初始化内存占用高,不设 limits 会导致 OOMKilled):
设置 livenessProbe 指向 /healthz,readinessProbe 指向 /readyz —— Yii3.0 内置这两个端点,但需在 config/web.php 中启用 health check 扩展。
方法二:生产级部署(含 ConfigMap + Secret 分离)
将 environments/prod/common.php 中的数据库连接、JWT 密钥等敏感项抽离为 Secret;非敏感配置如缓存驱动、日志级别抽离为 ConfigMap。
Secret 必须 base64 编码后写入 YAML,否则 K8s API Server 拒绝解析。
配置 Ingress 暴露 HTTP/HTTPS 流量
Yii3.0 路由依赖 PATH_INFO 或 QUERY_STRING,Nginx Ingress Controller 默认不透传这些变量,会导致所有路由匹配失败跳转首页。
在 Ingress 资源中添加 annotation:
nginx.ingress.kubernetes.io/configuration-snippet: |
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param QUERY_STRING $args;
该配置必须与 backend service 的 port 名称匹配为 http 或 https,否则 annotation 不生效。
若使用 Traefik v2+,则需在 Router 的 middlewares 中启用 stripprefix 并设置 regex 匹配路径前缀,否则 Yii3.0 的 UrlManager 解析失败。
挂载持久化存储用于上传目录
Yii3.0 的 yii\web\UploadedFile 默认保存到 @runtime/web/uploads,该路径必须指向可写的 PVC,否则文件上传直接报错。
第一步:创建 StorageClass(如使用 NFS,需提前部署 nfs-client-provisioner)
第二步:声明 PVC,设置 accessModes: [ReadWriteOnce],并指定 storageClassName
第三步:在 Deployment 的 volumeMounts 中挂载到 /app/runtime/web/uploads,同时确保容器内该路径所属 UID 与 initContainer 设置的 chown 一致。
【initContainer 必须存在,且 UID 必须与主容器 runtime 用户一致(默认 www-data:33),否则 PHP 进程无权写入】











