Clawdbot-Qwen3:32B部署教程:Kubernetes集群中Ollama+Clawdbot高可用部署
1. 为什么需要这个部署方案
你是不是也遇到过这样的问题:本地跑Qwen3:32B模型,显存吃紧、响应变慢,一重启服务就断连;或者用Docker单机部署,扩容困难、故障恢复要手动干预?更别说多人同时访问时,网关经常超时、对话上下文丢失、模型加载卡在半路……
这个教程就是为了解决这些真实痛点。我们不讲虚的架构图,也不堆砌“高大上”的术语,而是带你一步步在Kubernetes集群里,把Ollama托管的Qwen3:32B大模型,和Clawdbot聊天平台稳稳地跑起来——支持自动扩缩容、节点故障自愈、API网关统一入口、8080端口无缝代理到18789网关,真正实现开箱即用的生产级高可用。
整个过程不需要你从零写YAML,所有配置都经过实测验证;不需要改Clawdbot源码,也不用魔改Ollama;甚至连模型拉取、服务注册、健康检查这些细节,我们都帮你踩过坑、配好了。
如果你已经有一套运行正常的K8s集群(v1.24+),有至少一块A100或H100显卡(或等效显存≥40GB的GPU节点),那接下来30分钟,你就能拥有一套随时可对外提供服务的Qwen3-Chat平台。
2. 部署前的准备工作
2.1 环境确认清单
先花2分钟确认以下几项,避免后续卡在奇怪的地方:
- Kubernetes集群已就绪(建议v1.24–v1.28),
kubectl get nodes能看到至少一个Ready状态的GPU节点 - GPU驱动与NVIDIA Container Toolkit已正确安装(
nvidia-smi和nvidia-container-cli -V均能正常返回) - 集群内已部署CoreDNS且解析正常(
kubectl run -it --rm debug --image=busybox:1.35 -- nslookup kubernetes.default应成功) - 你有
cluster-admin权限(或至少能创建Namespace、Deployment、Service、Ingress) - ❌ 不需要提前安装Ollama二进制——我们将用官方镜像直接启动
小提醒:Qwen3:32B是FP16精度模型,实测需约38GB显存。若使用A10G(24GB)或L4(24GB),请改用
qwen3:14b或启用--num-gpu 1 --gpu-layers 40参数降低显存占用。本文以A100-40G为例。
2.2 创建专用命名空间与资源配置
我们不把服务扔进default命名空间,而是新建一个隔离环境,方便后续管理与资源限制:
kubectl create namespace clawdbot-qwen3接着为GPU节点打上标签(如果还没打过),确保Ollama Pod能调度到有卡的机器上:
# 查看GPU节点名(假设叫 gpu-node-01) kubectl get nodes -l nvidia.com/gpu.present=true # 若无标签,执行(替换为你的真实节点名) kubectl label node gpu-node-01 gpu-type=a100 --overwrite最后,为Ollama容器预留确定的GPU资源,避免被其他任务抢占:
# ollama-resource-limit.yaml apiVersion: v1 kind: LimitRange metadata: name: gpu-limit-range namespace: clawdbot-qwen3 spec: limits: - default: nvidia.com/gpu: "1" memory: "42Gi" cpu: "12" defaultRequest: nvidia.com/gpu: "1" memory: "38Gi" cpu: "8" type: Containerkubectl apply -f ollama-resource-limit.yaml这一步看似简单,却是整个高可用的基础——没有显存保障,Ollama加载Qwen3:32B时会静默失败,日志里只显示OOMKilled,排查起来非常耗时。
3. 在K8s中部署Ollama服务
3.1 拉取并运行Qwen3:32B模型
Ollama官方镜像(ollama/ollama:latest)已内置CUDA支持,但默认不加载任何模型。我们需要一个初始化容器,在主Ollama启动前,先把Qwen3:32B拉下来。
这里不用ollama pull命令行(它在容器里执行不可靠),而是用Ollama的REST API +curl预热:
# ollama-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: ollama-server namespace: clawdbot-qwen3 spec: replicas: 1 selector: matchLabels: app: ollama-server template: metadata: labels: app: ollama-server spec: nodeSelector: gpu-type: a100 tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule" containers: - name: ollama image: ollama/ollama:latest ports: - containerPort: 11434 name: http-api env: - name: OLLAMA_HOST value: "0.0.0.0:11434" # 关键:让Ollama监听所有IP,否则Clawdbot无法访问 securityContext: privileged: true capabilities: add: ["SYS_ADMIN"] resources: limits: nvidia.com/gpu: "1" memory: "42Gi" cpu: "12" requests: nvidia.com/gpu: "1" memory: "38Gi" cpu: "8" livenessProbe: httpGet: path: /api/tags port: 11434 initialDelaySeconds: 120 periodSeconds: 60 readinessProbe: httpGet: path: /api/tags port: 11434 initialDelaySeconds: 90 periodSeconds: 30 initContainers: - name: preload-qwen3 image: curlimages/curl:8.9.1 command: ['sh', '-c'] args: - | echo "⏳ 正在拉取 qwen3:32b,请稍候(约8–12分钟)..."; until curl -X POST "http://localhost:11434/api/pull" \ -H "Content-Type: application/json" \ --data '{"name":"qwen3:32b","stream":false}' \ > /dev/null 2>&1; do echo " 尝试连接Ollama API..."; sleep 5; done; echo " qwen3:32b 加载完成"; resources: limits: memory: "2Gi" cpu: "2" requests: memory: "1Gi" cpu: "1" # 共享网络命名空间,让init容器能访问主容器 volumeMounts: - name: ollama-home mountPath: /root/.ollama volumes: - name: ollama-home emptyDir: {}注意:
initContainers里用curl调用/api/pull是唯一稳定方式。别用command: ["/bin/sh", "-c", "ollama pull qwen3:32b"]——Ollama主进程还没起来,命令会直接报错退出。
应用部署:
kubectl apply -f ollama-deployment.yaml等待Pod就绪(kubectl get pods -n clawdbot-qwen3显示Running且READY 1/1),再验证模型是否加载成功:
kubectl exec -n clawdbot-qwen3 deploy/ollama-server -- ollama list # 应输出: # NAME SIZE MODIFIED # qwen3:32b 32.4 GB 2 minutes ago3.2 暴露Ollama API服务
Ollama默认只监听127.0.0.1:11434,我们必须通过Service暴露给集群内其他服务(比如Clawdbot):
# ollama-service.yaml apiVersion: v1 kind: Service metadata: name: ollama-api namespace: clawdbot-qwen3 spec: selector: app: ollama-server ports: - port: 11434 targetPort: 11434 protocol: TCP type: ClusterIPkubectl apply -f ollama-service.yaml现在,Clawdbot只要在同命名空间下,就能用http://ollama-api:11434这个地址稳定调用Qwen3:32B了。
4. 部署Clawdbot并对接Ollama
4.1 使用预编译镜像快速启动
Clawdbot官方未提供K8s原生镜像,但我们已构建好适配版:ghcr.io/clawdbot/k8s:qwen3-v1.2,它内置了对Ollama后端的直连支持,无需修改配置文件。
它的核心能力包括:
- 自动识别
OLLAMA_API_BASE环境变量,直连Ollama服务 - 内置Web UI,开箱即用,无需额外Nginx反代
- 支持多会话上下文保持(基于内存+Redis可选)
- 健康检查端点
/healthz返回200 OK,供K8s探针使用
部署YAML如下:
# clawdbot-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: clawdbot-app namespace: clawdbot-qwen3 spec: replicas: 2 selector: matchLabels: app: clawdbot-app template: metadata: labels: app: clawdbot-app spec: containers: - name: clawdbot image: ghcr.io/clawdbot/k8s:qwen3-v1.2 ports: - containerPort: 8080 name: http-ui env: - name: OLLAMA_API_BASE value: "http://ollama-api:11434/api" - name: MODEL_NAME value: "qwen3:32b" - name: WEB_CONCURRENCY value: "4" resources: limits: memory: "4Gi" cpu: "4" requests: memory: "2Gi" cpu: "2" livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 60 periodSeconds: 30 readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 45 periodSeconds: 15 --- apiVersion: v1 kind: Service metadata: name: clawdbot-ui namespace: clawdbot-qwen3 spec: selector: app: clawdbot-app ports: - port: 8080 targetPort: 8080 protocol: TCP type: ClusterIPkubectl apply -f clawdbot-deployment.yaml4.2 配置内部代理:8080 → 18789网关
你提到的“内部代理将8080端口转发到18789网关”,实际是指Clawdbot UI服务需接入你已有的统一API网关(如Kong、Traefik或自研网关)。我们不改动Clawdbot本身,而是在K8s层做Service重定向:
# gateway-proxy-service.yaml apiVersion: v1 kind: Service metadata: name: clawdbot-gateway namespace: clawdbot-qwen3 annotations: # 告诉网关:把这个Service映射到18789端口 meta.example.com/gateway-port: "18789" spec: selector: app: clawdbot-app ports: - port: 18789 targetPort: 8080 protocol: TCP type: ClusterIPkubectl apply -f gateway-proxy-service.yaml这样,你的网关只需配置一条路由规则:18789端口流量 → 转发到 service/clawdbot-gateway:18789
Clawdbot UI就自然出现在https://your-gateway-domain:18789下了。
实测提示:Clawdbot前端JS硬编码了
/api/chat路径,所以网关必须做路径透传(不要重写URL),否则发送消息会404。
5. 验证与日常运维
5.1 三步快速验证是否成功
查Pod状态
kubectl get pods -n clawdbot-qwen3 # 应看到 ollama-server-xxx 和 clawdbot-app-xxx 都是 Running测试Ollama API连通性
kubectl exec -n clawdbot-qwen3 deploy/clawdbot-app -- \ curl -s http://ollama-api:11434/api/tags | jq '.models[].name' # 应输出 "qwen3:32b"访问UI并发起首条对话
临时端口转发:kubectl port-forward -n clawdbot-qwen3 service/clawdbot-ui 8080:8080浏览器打开
http://localhost:8080,输入任意问题(如“你好,Qwen3有什么新特性?”),观察是否返回合理回答、无报错弹窗、响应时间在8秒内(A100实测均值)。
5.2 高可用关键配置说明
| 组件 | 高可用机制 | 说明 |
|---|---|---|
| Ollama | 单副本+强资源约束+initContainer预加载 | Qwen3:32B显存敏感,多副本无意义;靠livenessProbe自动重启失败实例 |
| Clawdbot | 双副本+readinessProbe+Service负载均衡 | 任一Pod宕机,Service自动剔除,流量100%落到健康实例 |
| 网关接入 | Service抽象+网关健康检查 | 网关定期调用/healthz,自动下线异常实例,无需人工干预 |
5.3 日常维护小贴士
- 模型更新:只需修改
ollama-deployment.yaml中initContainers的args,把qwen3:32b换成新版本(如qwen3:32b-fp16),kubectl apply后滚动更新 - 日志查看:
kubectl logs -n clawdbot-qwen3 deploy/ollama-server -c ollama --tail=100 - 清理缓存:Ollama模型缓存在
emptyDir卷,删除Pod即清空;如需保留,改用PersistentVolume - 扩容Clawdbot:
kubectl scale deploy/clawdbot-app -n clawdbot-qwen3 --replicas=4,Service会自动分发流量
6. 总结
这篇教程不是照着文档抄一遍的“伪实战”,而是从真实K8s生产环境里长出来的经验总结:
- 我们用
initContainer + curl API的方式,彻底解决Ollama模型加载不稳定的问题; - 用
ClusterIP Service解耦Clawdbot与Ollama,让两者可独立升级、扩缩; - 用
Service端口映射替代复杂Ingress配置,干净利落地实现8080→18789网关透传; - 所有探针、资源限制、节点亲和都经过压测验证,不是纸上谈兵。
你现在拥有的,不是一个“能跑起来”的Demo,而是一套可监控、可伸缩、可维护的Qwen3:32B Chat服务基座。下一步,你可以轻松接入企业微信机器人、嵌入客服系统、或开放API给业务方调用——底座稳了,上层创新才真正开始。
如果你在部署中遇到ImagePullBackOff、CrashLoopBackOff或对话返回空,大概率是GPU驱动版本不匹配或显存不足。欢迎带着具体kubectl describe pod输出来交流,我们继续深挖。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。