1 概述
ollama是一个管理大模型的一个中间层,通过它你可以下载并管理deepseek R1、llama3等大模型。
open-webui是一个web界面(界面设计受到chatgpt启发),可以集成ollama API、 OpenAI的 API。
用常见的web应用架构来类比,open-webui是前端,ollama是后端,大模型是数据库。
文本介绍华为云kubernetes部署open-webui最新版、ollama最新版、DeepSeek-R1-Distill-Qwen-1.5B(因为小模型可以只使用CPU,节省本文测试的成本)。
2 云资源环境准备
2.1 购买文件存储SFS Turbo
2.2 购买kubernetes集群
2.3 在k8s中创建storageclass对象
参数everest.io/share-access-to是VPC的ID。
参数everest.io/share-export-location是sfs turbo实例的共享路径:自定义子目录,sfs turbo实例的共享路径是在sfs实例的详细页查询,自定义子目录可以是任意路径。
参数everest.io/volume-id是sfs turbo实例的ID。
只需要修改以上三个参数。
在本文,storageclass的名称叫做sfsturbo-subpath-sc。
apiVersion: storage.k8s.io/v1
allowVolumeExpansion: true
kind: StorageClass
metadata:name: sfsturbo-subpath-sc
mountOptions:
- lock
parameters:csi.storage.k8s.io/csi-driver-name: sfsturbo.csi.everest.iocsi.storage.k8s.io/fstype: nfseverest.io/archive-on-delete: "true"everest.io/share-access-to: xxxxxxxxxxxxxxxxxx # VPC IDeverest.io/share-expand-type: bandwidtheverest.io/share-export-location: xxxxx.sfsturbo.internal:/mydir # sfs turbo实例的共享路径:自定义子目录everest.io/share-source: sfs-turboeverest.io/share-volume-type: STANDARDeverest.io/volume-as: subpatheverest.io/volume-id: xxxxxxxxxxxxx # sfs turbo实例的ID
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
2.4 购买用于暴露容器的负载均衡器ELB
3 部署
3.1 创建namespace
ollama和open webui都部署在此namespace。
kubectl create ns ollama
3.1 部署ollama
statefulset使用刚刚创建的存储类sfsturbo-subpath-sc。
确保PVC的磁盘容量能存储下所有待下载的大模型。
apiVersion: apps/v1
kind: StatefulSet
metadata:name: ollamanamespace: ollama
spec:serviceName: "ollama"replicas: 1selector:matchLabels:app: ollamatemplate:metadata:labels:app: ollamaspec:containers:- name: ollamaimage: swr.cn-south-1.myhuaweicloud.com/migrator/ollama:0.5.7ports:- containerPort: 11434resources:requests:cpu: "1000m"memory: "2Gi"# nvidia.com/gpu: "4" # 如果要用英伟达GPU,请声明下GPU卡的数量limits:cpu: "4000m"memory: "4Gi"volumeMounts:- name: ollama-volumemountPath: /root/.ollamatty: truevolumeClaimTemplates:- metadata:name: ollama-volumespec:storageClassName: sfsturbo-subpath-scaccessModes: ["ReadWriteOnce"]resources:requests:storage: 200Gi # 确保磁盘容量能存储下所有待下载的大模型
---
apiVersion: v1
kind: Service
metadata:name: ollamanamespace: ollamalabels:app: ollama
spec:type: ClusterIPports:- port: 11434protocol: TCPtargetPort: 11434selector:app: ollama
3.1 部署open webui(重点)
- deployment挂载一个固定的PVC,PVC使用刚刚创建的存储类sfsturbo-subpath-sc。
- OLLAMA_BASE_URL环境变量是ollama的地址。
- 无法连接huggingface.co:
由于在国内环境是无法连接huggingface.co,最终导致open webui的界面是一片空白(应用日志报错:MaxRetryError("HTTPSConnectionPool(host=‘huggingface.co’, port=443)),因此需要增加环境变量HF_ENDPOINT=https://hf-mirror.com。 - 无法连接openai:
由于不使用openai,因此将环境变量OPENAI_API_BASE_URL和OPENAI_API_KEY都设置成None,否则open webui在国内环境是无法连接openai,最终导致open webui的界面是一片空白(应用日志报错:Connection error: Cannot connect to host api.openai.com:443)。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: webui-pvcnamespace: ollamalabels:app: webui
spec:storageClassName: sfsturbo-subpath-scaccessModes: ["ReadWriteOnce"]resources:requests:storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:name: webuinamespace: ollama
spec:replicas: 1selector:matchLabels:app: webuitemplate:metadata:labels:app: webuispec:containers:- name: webuiimage: swr.cn-south-1.myhuaweicloud.com/migrator/open-webui:mainenv:- name: OLLAMA_BASE_URL # 这是ollama的地址value: http://ollama:11434 - name: HF_ENDPOINT # 国内环境无法连接huggingface.covalue: https://hf-mirror.com- name: OPENAI_API_KEYvalue: None- name: OPENAI_API_BASE_URLvalue: Nonetty: trueports:- containerPort: 8080resources:requests:cpu: "500m"memory: "500Mi"limits:cpu: "1000m"memory: "1Gi"volumeMounts:- name: webui-volumemountPath: /app/backend/datavolumes:- name: webui-volumepersistentVolumeClaim:claimName: webui-pvc
---
apiVersion: v1
kind: Service
metadata:name: webuinamespace: ollamalabels:app: webui
spec:type: ClusterIPports:- port: 8080protocol: TCPtargetPort: 8080selector:app: webui
接着为open webui容器添加ingress路由以在公网暴露:
4 下载模型
进入ollama容器:
kubectl exec -it ollama-0 -n ollama bash
在容器内执行ollama pull命令下载大模型DeepSeek-R1-Distill-Qwen-1.5B。
nohup ollama pull deepseek-r1:1.5b &
tail -f nohup.out
有哪些deepseek模型可以下载,请去https://ollama.com/library/deepseek-r1地址里搜索。
5 与大模型对话
在浏览器地址输入负载均衡器ELB的公网IP,打开网页后需要先设置open webui的管理员账号密码,登录成功后即可选择刚刚下载的deepseek模型来聊天。
6 小结
文本介绍使用华为云kubernetes部署open-webui最新版、ollama最新版、DeepSeek-R1-Distill-Qwen-1.5B。在实际过程中,花费时间最多的是open-webui,因为它默认去访问在国内无法访问的两个外国地址:huggingface.co和api.openai.com,而访问这些地址最终又导致界面变成空白。