绝了!k3s (k8s) 安装 ollama 运行 deepseek 全流程揭秘,yaml全公开

news/2025/3/6 19:35:16/文章来源:https://www.cnblogs.com/moonfdd/p/18752695

🎯k3s (k8s) 环境搭建与 ollama 相关 yaml 文件部署

在容器编排的世界中,k3s (k8s) 无疑是备受瞩目的存在。此次聚焦在 k3s (k8s) 环境下安装 ollama,并实现运行 deepseek。首先映入眼帘的是一个关键的 yaml 文件 ——ollama.yaml 。这个文件犹如整个部署流程的指挥棒,规定各项参数和配置信息。ollama.yaml 内容如下:

# https://cloud.tencent.com/developer/article/2495842 环境变量apiVersion: apps/v1
kind: Deployment
metadata:labels:app: ollamaname: ollamanamespace: moonfdd
spec:strategy:type: Recreatereplicas: 1selector:matchLabels:app: ollamatemplate:metadata:labels:app: ollamaspec:containers:- env:- name: OLLAMA_HOSTvalue: "0.0.0.0"- name: OLLAMA_PORTvalue: "11434"- name: OLLAMA_NUM_PARALLELvalue: "20" #默认是1- name: OLLAMA_ORIGINSvalue: "*"- name: OLLAMA_MODELSvalue: "/root/.ollama/models"image: 'ollama/ollama:0.5.12'command: ["ollama", "serve"]imagePullPolicy: IfNotPresentname: ollamavolumeMounts:- mountPath: /root/.ollama/models/name: dataresources:# nvidia.com/gpu: 1# memory: "24Gi"# limits:#   cpu: 200m#   memory: 200Mi# requests:#   cpu: 100m#   memory: 100Mi- image: 'ollama/ollama:0.5.12'command: ["sh", "-c", "while true; do ollama run deepseek-r1:1.5b; sleep 5; done"]imagePullPolicy: IfNotPresentname: ollamacmdvolumes:- name: datahostPath:path: /root/k8s/moonfdd/ollama/root/.ollama/models/type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:labels:app: ollamaname: ollamanamespace: moonfdd
spec:ports:- name: 11434-11434port: 11434protocol: TCPtargetPort: 11434nodePort: 11434selector:app: ollamatype: NodePort

📊ollama 安装与运行实际效果展示

命令如下:

kubectl apply -f ollama.yaml

运行结果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
💻Go 语言调用 deepseek 接口代码分析

单纯有 ollama 环境运行起来还不够,还需要有与之交互的代码来发挥它的功能,这里就出现了 Go 语言调用 deepseek 接口的代码。go代码如下:

package mainimport ("bufio""bytes""encoding/json""fmt""net/http""time"
)type Message struct {Role    string `json:"role"`Content string `json:"content"`
}// 修改请求结构体,添加 Stream 字段
type DeepSeekRequest struct {Model       string    `json:"model"`Messages    []Message `json:"messages"`MaxTokens   int       `json:"max_tokens,omitempty"`Temperature float64   `json:"temperature,omitempty"`Stream      bool      `json:"stream"` // 新增流式控制字段
}// 保持其他结构体不变...const (localAPIURL = "http://172.16.11.111:11434/v1/chat/completions"
)func main() {fmt.Println("开始")requestData := DeepSeekRequest{Model: "deepseek-r1:1.5b",Messages: []Message{{Role:    "user",Content: "微信公众号 福大大架构师每日一题 是谁",},},MaxTokens:   512000,Temperature: 1,Stream:      true, // 启用流式模式}requestBody, err := json.Marshal(requestData)if err != nil {panic("JSON编码失败: " + err.Error())}// 配置更合理的超时时间client := &http.Client{Transport: &http.Transport{DisableKeepAlives: true, // 🔴 关键设置:禁用连接复用MaxIdleConns:      1,IdleConnTimeout:   30 * time.Second,},Timeout: 10 * time.Minute, // 大模型响应时间较长}req, err := http.NewRequest("POST", localAPIURL, bytes.NewBuffer(requestBody))if err != nil {panic("创建请求失败: " + err.Error())}req.Header.Set("Content-Type", "application/json")req.Header.Set("Connection", "close") // 显式关闭连接req.Close = trueresp, err := client.Do(req)if err != nil {panic("请求发送失败: " + err.Error())}defer resp.Body.Close()// 流式响应处理if resp.StatusCode != http.StatusOK {fmt.Printf("请求失败,状态码:%d\n", resp.StatusCode)return}// 使用 Scanner 逐行读取流式响应scanner := bufio.NewScanner(resp.Body)scanner.Buffer(make([]byte, 1024), 10*1024*1024) // 扩大缓冲区for scanner.Scan() {rawData := scanner.Bytes()if len(rawData) == 0 {continue}var chunk DeepSeekChunkerr := json.Unmarshal(rawData[6:], &chunk)if err == nil {for i := 0; i < len(chunk.Choices); i++ {fmt.Print(chunk.Choices[i].Delta.Content)}} else {if string(rawData) == string("data: [DONE]") {} else {fmt.Println("\r\n接收失败:", err, string(rawData))}return}}// if err := scanner.Err(); err != nil {// 	fmt.Printf("\n流读取错误: %v\n", err)// }
}// DeepSeekChunk 定义与提供的JSON结构相对应的结构体
type DeepSeekChunk struct {ID                string   `json:"id"`Object            string   `json:"object"`Created           int64    `json:"created"`Model             string   `json:"model"`SystemFingerprint string   `json:"system_fingerprint"`Choices           []Choice `json:"choices"`
}type Choice struct {Index        int     `json:"index"`Delta        Delta   `json:"delta"`FinishReason *string `json:"finish_reason,omitempty"` // 使用指针以处理可能为null的情况 //null "stop"
}type Delta struct {Role    string `json:"role"`Content string `json:"content"`
}

运行结果如下:

在这里插入图片描述

官网不联网运行结果如下:
在这里插入图片描述
官网联网运行结果如下:
在这里插入图片描述

🎊实际意义与展望

通过在 k3s (k8s) 上完成 ollama 的安装并运行 deepseek,以及编写 Go 语言调用接口代码这一系列操作,具有多方面的实际意义和深远的展望。从技术层面而言,这为开发者在特定的容器编排环境下集成模型服务提供了一套可参考的方法和实践经验。无论是对于后续想要在相似环境里部署其他模型,还是改进和优化当前模型的运行方式,都提供了宝贵参考范例。从应用场景角度来看,能够在这样的技术栈下调用模型进行文本处理、问答交互等,都能为诸多实际项目开发提供强大助力。比如开发智能客服系统、智能助手应用等。展望未来,这种技术实践将不断推动相关技术的发展和融合。随着模型的不断升级迭代,我们可以期待更多强大功能能够被整合进这样的环境里 。同时,通过持续改进和优化 yaml 文件配置以及代码实现细节,将进一步提升系统的性能和稳定性。也相信会有更多开发者基于此进行创新和拓展,探索出更多的应用可能和技术思路。就像一颗石子投入平静湖面,会泛起层层涟漪般,这项技术实践也将在整个技术领域里引发新的探索和变革浪潮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/894024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Windows下离线部署DeepSeek并以WebApi形式调用

最近这一块的话题有点火,这里也找资料学习了解了一下,分享出来。 目前应该有很多公司已经通过官方的WebApi接口接入了DeepSeek。 本文可以帮助你离线使用DeepSeek的WebApi,并集成到自己的程序里。 文末会有示例程序。Ollama是什么 Ollama 是一个开源的 AI 模型服务平台,旨在…

基于 MySQL 8.0 细粒度授权:单独授予 KILL 权限的优雅解决方案

基于 MySQL 8.0 细粒度授权:单独授予 KILL 权限的优雅解决方案一、引言 作为一名数据库从业者,我在日常工作中经常会遇到一个棘手的问题:如何在保证安全的前提下,让业务团队拥有足够的权限去管理数据库执行的 SQL,尤其是终止那些失控的慢查询或异常线程?这个问题看似简单…

对比Jira/禅道后,我们为什么选择Leangoo做敏捷项目管理?

Leangoo团队为开发者提供敏捷开发支持:免费获取《敏捷开发指南》;支持企业私有化部署,提供专属API文档及金融、电商行业落地案例,助力研发流程自动化升级。一、敏捷团队的3大隐形痛点 我曾带领过一个6人的Scrum团队,迭代经常遇到: 需求变更黑洞:客户口头需求未及时同步,…

中央计算平台CCP

汽车电子产品正从分布式向中央计算及物理区域控制方向发展,中央计算平台是车身域以及动力域的核心计算单元。 汽车电子产品正从分布式向中央计算及物理区域控制方向发展,中央计算平台是车身域以及动力域的核心计算单元。经纬恒润中央计算平台CCP(Central Compute Pla…

GPO 配置的 4 种常见安全错误及安全优化策略

组策略对象(GPO)是微软 Active Directory(AD)的核心功能,使管理员能够管理和保护AD环境。即使是一个被攻陷的账户也可能导致整个组织的安全受损,影响多个用户和系统。因此,解决GPO的安全威胁和漏洞对于维护AD环境的完整性至关重要。 一、常见的GPO安全错误 以下是管理员…

从薪酬管理到组织效能跃升:锦江易路共创实践——头部HR SaaS厂商如何实现中大型客户全链路覆盖

未来,HR的‘人’味或许会越来越淡,随着数字化进程和共享服务建设,你会成为IT运维者,会成为懂代码、懂业务语言的咨询顾问,成为流程专家,成为调动资源的项目管理者,这是对我们所有新的人力资源工作者的挑战“这三年,我们撞了很多墙、踩了很多坑,把这些伤痛和成就展示给…

【每日一题】20250305

如果你的灵魂黯淡,正为光明所烦扰,请勿从事文学。你什么都无法留下,除了几声能被人听懂的叹息,以及关于您拒绝成为自己的可怜碎片。【每日一题】回答下列(1)~(2)小题. (1)如图 \(1\) 所示,放在固定斜面上的物块 \(\mathrm{A}\) 以加速度 \(a\) 沿斜面匀加速下滑,现…

第1次作业

图书管理系统学生成绩

Oracle VM VirtualBox+vagrant搭建Linux虚拟机

Oracle VM VirtualBox+vagrant,搭建Linux虚拟机 title: Oracle VM VirtualBox+vagrant,搭建Linux虚拟机 tags: - vm - vagrant - VirtualBox categories: - 学习语录Oracle VM VirtualBox+vagrant,搭建Linux虚拟机 1,下载Oracle VM VirtualBox 2,下载vagrant 3,下载cento…

springboot集成deepseek

最近deepseek很火写一篇随文 1.deepseek官网:https://www.deepseek.com/ 2.spring-ai官网:https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html 3.截止到目前springboot已经集成了deepseek极大的简化了使用难度4.pom文件配置<dependencies><de…

告别 @import,拥抱 @use:从零掌握 Sass 模块化开发的核心技巧

探索 Sass 中 @use 语法的强大功能!本文深入解析如何使用 @use 实现模块化开发,避免命名冲突,并通过命名空间、私有成员、默认值覆盖等特性提升代码的封装性与灵活性。适合希望优化 Sass 工作流的前端开发者!🚀目录前言@use 用法1. 模块化与命名空间2. @use 中 as 语法的…