Nunchaku FLUX.1 CustomV3部署教程:Kubernetes集群中以StatefulSet方式部署高可用服务
1. 什么是Nunchaku FLUX.1 CustomV3
Nunchaku FLUX.1 CustomV3 不是一个独立训练的大模型,而是一套经过深度调优的文生图工作流。它基于开源的 Nunchaku FLUX.1-dev 架构,但不是简单套用,而是融合了两个关键增强组件:FLUX.1-Turbo-Alpha 加速推理模块和 Ghibsky Illustration LoRA 微调权重。
你可以把它理解成一辆出厂后由专业技师调校过的高性能跑车——底盘(FLUX.1-dev)本身就很扎实,再加装了轻量化涡轮套件(Turbo-Alpha)提升响应速度,又贴上了专属空气动力学套件(Ghibsky LoRA),让最终输出的图像在细节表现、线条张力和艺术风格统一性上明显优于基础版本。
这个工作流专为 ComfyUI 环境设计,所有节点连接、参数预设、LoRA 加载顺序都已验证通过。你不需要从零配置 CLIP 文本编码器、VAE 解码器或采样器步数,开箱即用就能生成具备插画质感、高对比度与细腻纹理的图像。
它不追求“万能”,而是聚焦在“稳定出好图”——尤其适合需要批量产出风格一致商业插画、角色设定稿、概念海报的团队场景。
2. 为什么选择 StatefulSet 而非 Deployment 部署
在 Kubernetes 中部署像 ComfyUI 这类带状态依赖、需持久化工作流与模型缓存的服务时,Deployment 并不是最优解。它更适合无状态、可随意扩缩容的 Web API 服务。而 Nunchaku FLUX.1 CustomV3 的实际运行有三个硬性状态需求:
- 模型文件缓存:首次加载 FLUX.1-Turbo-Alpha 和 Ghibsky LoRA 时会下载并解压至本地磁盘,后续请求复用,避免重复拉取;
- 自定义 workflow 文件挂载:
nunchaku-flux.1-dev-myself.json工作流必须作为配置文件精确挂载到容器内指定路径; - 输出目录持久化:生成的图片默认写入
/output,若容器重启,未及时下载的图片将丢失。
StatefulSet 正是为这类场景而生:它为每个 Pod 分配唯一、稳定的网络标识(如comfyui-0)、有序启停保障、以及与 Pod 生命周期绑定的 PersistentVolumeClaim(PVC)。这意味着:
- 即使节点故障,Pod 在其他节点重建后,仍能挂载原 PVC,继续使用已缓存的模型和历史输出;
- 多副本部署时,每个实例拥有独立存储,互不干扰,避免共享存储带来的并发写冲突;
- 可配合 Headless Service 实现稳定 DNS 解析(如
comfyui-0.comfyui-headless.default.svc.cluster.local),便于内部服务发现。
换句话说,Deployment 是“用完即走”的临时工,StatefulSet 是“持证上岗、档案在册”的正式员工——对需要长期稳定运行、数据不能丢的 AI 图像服务,后者才是生产环境的合理选择。
3. 部署前准备:环境与资源确认
在执行部署操作前,请确保你的 Kubernetes 集群满足以下最低要求。这不是理论值,而是经实测验证的稳定运行门槛。
3.1 集群基础要求
- Kubernetes 版本 ≥ v1.24(推荐 v1.26+),需支持
volumeClaimTemplates和initContainers - 节点操作系统:Ubuntu 22.04 LTS 或 CentOS Stream 8+
- 容器运行时:containerd ≥ v1.6.0(Docker Engine 不再被 Kubernetes 官方推荐)
3.2 硬件资源建议(单 Pod)
| 组件 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| GPU | 1× NVIDIA RTX 4090(24GB VRAM) | 1× RTX 4090 或 1× A10(24GB) | FLUX.1-Turbo-Alpha 对显存带宽敏感,A10 更适合多租户环境 |
| CPU | 8 核 | 12 核 | ComfyUI 前端、节点调度、图像后处理需 CPU 协同 |
| 内存 | 32GB | 64GB | 模型加载+缓存+系统开销,低于 32GB 易触发 OOMKill |
| 存储 | 100GB SSD | 200GB NVMe | 包含基础镜像(~8GB)、模型文件(~15GB)、输出缓存(按日增长) |
注意:不要在 CPU 节点上尝试部署。FLUX.1 系列模型未提供 CPU 推理优化路径,强行运行会导致超长等待甚至失败。GPU 是硬性前提。
3.3 必备 Kubernetes 资源对象
你需要提前准备好三类资源,它们将被 StatefulSet 引用:
- Namespace:建议新建独立命名空间,例如
ai-comfy,避免与业务服务混杂; - StorageClass:确保集群存在一个支持
ReadWriteOnce访问模式的 StorageClass(如local-path、nfs-client或云厂商 CSI 驱动); - Secret(可选但推荐):若需对接私有镜像仓库,提前创建
image-pull-secret。
验证命令示例:
kubectl get namespace ai-comfy || kubectl create namespace ai-comfy kubectl get storageclass | grep -E "(default|ssd|nvme)"4. 构建可部署的 Helm Chart(精简版)
我们不推荐直接使用裸 YAML 部署——StatefulSet、Service、PVC、ConfigMap 多达 5 个文件,手动维护易出错。这里提供一个轻量级 Helm Chart 结构,仅包含核心逻辑,无需安装 Tiller 或复杂 CI/CD。
4.1 Chart 目录结构
nunchaku-flux-stateful/ ├── Chart.yaml ├── values.yaml └── templates/ ├── _helpers.tpl ├── statefulset.yaml ├── service.yaml ├── pvc.yaml └── configmap.yaml4.2 关键模板说明(templates/statefulset.yaml)
以下为 StatefulSet 核心片段,已去除冗余字段,保留生产必需项:
apiVersion: apps/v1 kind: StatefulSet metadata: name: comfyui namespace: ai-comfy spec: serviceName: "comfyui-headless" replicas: 1 selector: matchLabels: app: comfyui template: metadata: labels: app: comfyui spec: initContainers: - name: model-downloader image: busybox:1.35 command: ['sh', '-c'] args: - | echo "Creating model dir..."; mkdir -p /models/checkpoints /models/loras; touch /models/.ready; volumeMounts: - name: models mountPath: /models containers: - name: comfyui image: "csdnai/nunchaku-flux-customv3:latest" imagePullPolicy: IfNotPresent ports: - containerPort: 8188 name: http env: - name: COMFYUI_MODEL_PATH value: "/models" volumeMounts: - name: models mountPath: /models - name: workflows mountPath: /app/custom_nodes/comfyui-manager/workflows - name: output mountPath: /output resources: limits: nvidia.com/gpu: 1 memory: "48Gi" cpu: "10" requests: nvidia.com/gpu: 1 memory: "32Gi" cpu: "8" volumes: - name: workflows configMap: name: comfyui-workflows volumeClaimTemplates: - metadata: name: models spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 100Gi storageClassName: "local-path" # 替换为你的 StorageClass 名 - metadata: name: output spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 50Gi storageClassName: "local-path"4.3 ConfigMap 挂载 workflow(templates/configmap.yaml)
该 ConfigMap 将nunchaku-flux.1-dev-myself.json作为文件注入容器,路径与 ComfyUI 默认读取位置一致:
apiVersion: v1 kind: ConfigMap metadata: name: comfyui-workflows namespace: ai-comfy data: nunchaku-flux.1-dev-myself.json: | { "last_node_id": 12, "last_link_id": 15, "nodes": [ { "id": 1, "type": "CLIPTextEncode", "properties": {}, "widgets_values": ["a detailed digital painting of a cyberpunk city at night, neon lights, rain reflections"] } // ... 其他节点定义(此处省略,实际需完整 JSON) ], "links": [/* ... */] }提示:workflow JSON 可从 CSDN 星图镜像广场对应页面直接下载,粘贴进
data字段即可。Helm 会自动 Base64 编码,无需手动处理。
5. 部署与验证全流程
完成 Chart 编写后,部署只需三步。全程在ai-comfy命名空间下操作,避免污染默认空间。
5.1 安装 Helm Release
# 进入 chart 目录 cd nunchaku-flux-stateful # 安装(--create-namespace 自动创建命名空间) helm install nunchaku . \ --namespace ai-comfy \ --create-namespace \ --set service.type=NodePort \ --set service.nodePort=308185.2 等待 Pod 就绪并检查日志
StatefulSet 启动有顺序:先拉镜像 → 执行 initContainer 下载模型 → 启动主容器。耐心等待约 3–5 分钟:
# 查看 Pod 状态(应为 Running) kubectl get pods -n ai-comfy # 查看初始化日志(确认模型是否成功准备) kubectl logs -n ai-comfy comfyui-0 -c model-downloader # 查看主容器日志(确认 ComfyUI 已监听 8188 端口) kubectl logs -n ai-comfy comfyui-0 | grep "Starting server"正常日志末尾应出现:
INFO: Uvicorn running on http://0.0.0.0:8188 (Press CTRL+C to quit)5.3 本地访问与功能验证
通过 NodePort 暴露服务,假设集群节点 IP 为192.168.1.100:
- 浏览器打开
http://192.168.1.100:30818 - 进入右上角菜单 →Workflow→ 选择
nunchaku-flux.1-dev-myself - 找到
CLIP Text Encode节点,双击修改提示词(例如改为"a serene mountain lake at dawn, mist rising, pine trees, soft light") - 点击右上角Queue Prompt(等价于 UI 中的 Run 按钮)
- 观察右下角进度条,约 8–12 秒后生成完成(RTX 4090 实测均值)
验证成功标志:
- 页面显示生成图片缩略图;
kubectl exec -n ai-comfy comfyui-0 -- ls /output列出.png文件;kubectl get pvc -n ai-comfy显示两个 PVC 状态均为Bound。
6. 日常运维与常见问题处理
部署只是开始,持续可用才是关键。以下是高频运维动作与对应解决方案。
6.1 修改提示词后不生效?检查这三点
- 节点 ID 是否匹配:ComfyUI 工作流中每个节点有唯一 ID。若你下载的 workflow 中
CLIPTextEncode节点 ID 是3,但你在 UI 中编辑的是 ID1的节点,则修改无效。解决方法:导出当前 workflow JSON,搜索"type": "CLIPTextEncode",确认其"id"值。 - 未点击 Queue Prompt:UI 中点击 “Run” 实际触发的是
Queue PromptAPI,而非立即执行。若后台队列卡住,可执行kubectl exec -n ai-comfy comfyui-0 -- killall -9 python3重启进程。 - 缓存未刷新:ComfyUI 会缓存 workflow 解析结果。删除
/app/web/extensions/comfyui-manager/cache/目录后重启 Pod 即可。
6.2 如何安全扩容为 2 副本?
StatefulSet 支持原地扩容,但需注意:
- 每个副本独占 1 块 GPU,因此需确保集群至少有 2 块空闲 GPU;
- 执行
helm upgrade nunchaku . -n ai-comfy --set replicaCount=2; - 新建 Pod
comfyui-1会自动申请新 PVC,加载相同 workflow,但输出目录独立,不会覆盖comfyui-0的图片。
警告:不要将多个 Pod 挂载同一 PVC!会导致文件锁冲突、图片写入失败。
6.3 清理与重装
当需要彻底重置环境时,按顺序执行:
# 1. 删除 Helm Release(自动清理所有关联资源) helm uninstall nunchaku -n ai-comfy # 2. 手动删除残留 PVC(Helm 不管理 PVC 生命周期) kubectl delete pvc -n ai-comfy models-comfyui-0 output-comfyui-0 # 3. 清理节点本地模型缓存(如使用 local-path 存储) kubectl get nodes -o wide # 登录对应节点,删除 /var/longhorn/... 或 /mnt/disks/... 下相关目录7. 总结:StatefulSet 是生产级 AI 服务的务实之选
回顾整个部署过程,你实际完成的不只是“跑通一个模型”,而是构建了一条可审计、可伸缩、可恢复的 AI 图像生成流水线:
- 你用 StatefulSet 锁定了服务身份与存储归属,规避了无状态部署中“图片丢了找不到源头”的运维黑洞;
- 你通过 initContainer 预加载模型,将冷启动时间从分钟级压缩至秒级,用户感知不到等待;
- 你把 workflow 封装进 ConfigMap,实现配置与代码分离,下次升级只需替换 JSON,无需重建镜像;
- 你为每个 Pod 设置了精准的 GPU/CPU/Memory Limits,既保障性能,又防止资源争抢拖垮集群。
这并非炫技,而是面向真实业务场景的工程收敛——当市场部明天要批量生成 200 张节日海报,当设计团队需要稳定复用同一 LoRA 风格,当运维要求“故障 5 分钟内自动恢复”,StatefulSet 提供的确定性,就是技术落地最朴素的底气。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。