Kubernetes中PHP视频处理弹性伸缩的关键是职责分离:PHP仅作调度与元数据管理,真实编解码由FFmpeg或WAN2.2等专用Worker执行;HPA需基于队列长度等自定义指标而非CPU,并配合GPU节点亲和性、ReadWriteMany存储及Job重试机制保障可靠性。
PHP本身不直接处理视频编解码,大规模视频文件处理必须绕开PHP进程——把它当成调度器、元数据处理器和任务分发器,真干活的得交给FFmpeg、WAN2.2或专用Worker。Kubernetes里做弹性伸缩,关键不是“PHP能不能跑视频”,而是“怎么让PHP触发的任务链能随负载自动扩缩”。
常见错误是把exec('ffmpeg -i ...')塞进PHP-FPM里跑:单次请求卡住几秒,FPM子进程夯死,CPU打满但实际没干视频活。WAN2.2这类模型更不能直连PHP,显存爆掉是分分钟的事。
initContainers预加载模型或缓存,主容器只调ffmpeg或python inference.py
proc_open()并设超时+资源限制,避免阻塞FPM进程池kubectl top pod显示CPU 30%,但PHP容器可能只是在等FFmpeg子进程——这不算有效负载。HPA若只盯CPU,会误判:视频任务排队时PHP空闲,HPA不扩容;而FFmpeg密集跑时PHP又没占多少CPU,HPA仍不反应。
queue_length(如Redis pending count)或task_pending_total(RoadRunner暴露的rr_http_requests_queue_size)resources.requests.cpu: 200m,同时确保FFmpeg Worker的Deployment单独配HPA,目标指标为container_cpu_usage_seconds_total
behavior.scaleUp.stabilizationWindowSeconds:视频任务启动慢(加载模型要10s+),设成60秒,避免刚起Pod就被HPA误判为“无效”而删掉WAN2.2或CUDA加速的FFmpeg需要GPU,但PHP Web层不需要。默认调度下,PHP Pod可能被挤到GPU节点上,浪费资源还抢显存。
立即学习“PHP免费学习笔记(深入)”;
nodeSelector:nvidia.com/gpu: "1",并配taints防止PHP Pod误调度过去tolerations反向排除GPU节点,或直接用nodeAffinity限定到CPU-only节点池ReadWriteMany(如NFS),别用默认ReadWriteOnce,否则多Worker无法共享输入/输出路径一个5分钟的视频转码,中途Pod被HPA缩容或节点故障,PHP若只记“任务开始”,就会丢任务。Kubernetes原生不保证Job一次性成功。
Job而非Pod跑视频任务,设backoffLimit: 3,失败自动重试activeDeadlineSeconds: 1800(30分钟),防Worker卡死无限占用GPU真正难的不是写YAML,而是厘清边界:PHP管什么、Worker管什么、K8s管什么。视频文件一动就是GB级,调度错一层,磁盘IO、网络带宽、GPU显存全跟着错。别指望HPA自动适配所有场景,它只响应你喂给它的指标——喂错指标,扩缩容就变成随机行为。