将Ollama作为K8s StatefulSet部署:自定义入口脚本拉取模型遇问题
Ollama K8s StatefulSet 部署问题解决(含Nvidia Container Toolkit配置)
一、修复初始run.sh脚本语法错误
原脚本存在两个核心问题:变量未正确转为数组、续行符使用不当导致语法报错。修正后的run.sh如下:
#!/bin/bash set -x # 后台启动ollama服务 ollama serve & # 轮询等待服务就绪,替代固定sleep提升可靠性 for i in $(seq 10); do if ollama ps >/dev/null 2>&1; then break fi sleep 1 done # 将MODELS环境变量按逗号分割为数组 IFS=',' read -r -a models <<< "$MODELS" # 遍历拉取模型 for model in "${models[@]}"; do echo "Pulling model: $model" ollama pull "$model" done # 保持容器前台运行,避免进程退出导致Pod终止 wait
对应基础Dockerfile配置:
FROM ollama/ollama:latest COPY run.sh /usr/local/bin/run.sh RUN chmod +x /usr/local/bin/run.sh ENTRYPOINT ["/usr/local/bin/run.sh"]
二、解决生命周期钩子报错问题
你后续修改的Dockerfile存在命令参数错误:CMD ["ollama", "serve"]会导致容器执行/bin/ollama ollama serve,而ollama并无ollama子命令,因此报错。正确配置应为:
ENTRYPOINT ["/bin/ollama"] CMD ["serve"]
若坚持使用生命周期钩子,需修正脚本逻辑并确保命令可执行:
lifecycle: postStart: exec: command: - bash - -c - | for i in $(seq 10); do if ollama ps >/dev/null 2>&1; then break fi sleep 1 done IFS=',' read -r -a models <<< "$MODELS" for model in "${models[@]}"; do ollama pull "$model" done
注:钩子执行失败会直接导致Pod进入CrashLoopBackOff,建议优先采用启动脚本的方式处理模型拉取。
三、自定义Dockerfile整合Nvidia Container Toolkit
基于官方Ollama CUDA镜像构建,已预装Nvidia依赖,无需手动安装工具包。完整Dockerfile:
# 基于官方CUDA镜像,支持GPU加速 FROM ollama/ollama:latest-cuda # 复制启动脚本 COPY run.sh /usr/local/bin/run.sh RUN chmod +x /usr/local/bin/run.sh # 默认模型配置,可通过K8s清单环境变量覆盖 ENV MODELS="llama3.2" ENTRYPOINT ["/usr/local/bin/run.sh"]
四、K8s StatefulSet配置要点
- 环境变量与GPU资源配置:
containers: - name: ollama image: your-custom-ollama-image:tag env: - name: MODELS value: "llama3.2,phi3" # 多模型用逗号分隔 resources: limits: nvidia.com/gpu: 1 # 按需配置GPU数量 volumeMounts: - name: ollama-data mountPath: /root/.ollama # 持久化模型存储目录
- 持久化存储声明:
volumeClaimTemplates: - metadata: name: ollama-data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 50Gi # 按需配置存储容量
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

