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: ollama
name: ollama
namespace: moonfdd
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: ollama
template:
metadata:
labels:
app: ollama
spec:
containers:
- env:
- name: OLLAMA_HOST
value: "0.0.0.0"
- name: OLLAMA_PORT
value: "11434"
- name: OLLAMA_NUM_PARALLEL
value: "20" #默认是1
- name: OLLAMA_ORIGINS
value: "*"
- name: OLLAMA_MODELS
value: "/root/.ollama/models"
image: 'ollama/ollama:0.5.12'
command: ["ollama", "serve"]
imagePullPolicy: IfNotPresent
name: ollama
volumeMounts:
- mountPath: /root/.ollama/models/
name: data
resources:
# 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: IfNotPresent
name: ollamacmd
volumes:
- name: data
hostPath:
path: /root/k8s/moonfdd/ollama/root/.ollama/models/
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
labels:
app: ollama
name: ollama
namespace: moonfdd
spec:
ports:
- name: 11434-11434
port: 11434
protocol: TCP
targetPort: 11434
nodePort: 11434
selector:
app: ollama
type: NodePort

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

命令如下:

kubectl apply -f ollama.yaml

运行结果如下:



Go 语言调用 deepseek 接口代码分析

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

package main

import (
"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 = true
resp, 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 DeepSeekChunk
err := 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 文件配置以及代码实现细节,将进一步提升系统的性能和稳定性。也相信会有更多开发者基于此进行创新和拓展,探索出更多的应用可能和技术思路。就像一颗石子投入平静湖面,会泛起层层涟漪般,这项技术实践也将在整个技术领域里引发新的探索和变革浪潮。

绝了!k3s (k8s) 安装 ollama 运行 deepseek 全流程揭秘,yaml全公开的更多相关文章

  1. 全真教程:Windows环境Jupyter Notebook安装、运行和工作文件夹配置

    全真教程:Windows环境Jupyter Notebook安装.运行和工作文件夹配置 @ 目录 全真教程:Windows环境Jupyter Notebook安装.运行和工作文件夹配置 一.Jupyt ...

  2. k3s单机版安装部署 附一键安装脚本

    作者:SRE运维博客 博客地址: https://www.cnsre.cn/ 文章地址:https://www.cnsre.cn/posts/211109907029/ 相关话题:https://ww ...

  3. 手把手教你玩转 Gitea|使用 Helm 在 K3s 上安装 Gitea

    前言 在前面的文章中,演示了如何用 Docker 镜像和 Windows 二进制包来安装运行 Gitea.今天是玩转 Gitea 系列的使用 Helm 在 K3s 上安装 Gitea. 关于 Gite ...

  4. k8s 安装 istio 的坑

    本文针对于二进制部署的k8s安装istio1.67版本 没有设置admin.conf的小伙伴请参考 https://www.cnblogs.com/Tempted/p/13469772.html 1. ...

  5. 一文搞定全场景K3s离线安装

    作者简介 王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营.拥有6年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Lin ...

  6. K8S 使用Minikube搭建Kubernetes(K8S)~单机运行Kubernetes~适用于快速学习

    在一台主机上运行起来的Kubernetes,仅适用于学习!~~~ 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:Docker-ce-18.06.0.Ku ...

  7. 在k8s安装CICD-devtron

    在k8s安装CICD-devtron 先前条件 <kubernetes(k8s) 存储动态挂载>参考我之前的文档进行部署https://www.oiox.cn/index.php/arch ...

  8. Python 2/3 安装与运行环境设置

    Python 2/3 安装与运行环境设置: 1.Python 软件源:https://www.python.org/    下载Win版本 https://www.python.org/downloa ...

  9. 使用工具安装,运行,停止,卸载Window服务

    WSWinForm.exe介绍 WSWinForm.exe是我自己开发的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说WSWinForm只是其注册程序的服务外壳,这个特性对 ...

  10. VMware10.06精简版安装后台运行

    VMware10.06精简版安装时会出现一个安装功能选择菜单,里面有一条后台运行必选功能,一般人会跳过条.当你打算在服务器上用vmware时,一定要安装后台运行服务,否则你无法换出正在运行的后台虚拟机 ...

随机推荐

  1. 利用GmSSL制作SM2国密证书

    Part 0前言 GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法.SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密 ...

  2. Win7下C盘无法创建文件解决办法

    Win7下C盘无法创建文件解决办法: To fix it, just turn off the User Account Control (UAC). In Windows 8, do not tur ...

  3. Qt编写安防视频监控系统52-颜色配置

    一.前言 在系统打印日志或者窗口信息栏中,各种临时打印信息都显示在这里,很多时候我们还需要对特定的类别的信息突出颜色显示,比如告警信息,甚至对不同的告警级别的信息还可以分别不同的颜色显示,这样看起来会 ...

  4. findHomography()函数详解

    indHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法 函数功能:找到两个平面之间的转换矩阵. Mat cv::findHom ...

  5. vue3项目中报错:Unexpected mutation of "xxx" prop

    vue3 中element 弹窗绑定需要通过v-model,这个时候父级会传个dialogVisible(boolean值)过来,结果会报eslint的错. Unexpected mutation o ...

  6. 开源即时通讯IM框架MobileIMSDK的微信小程序端技术概览

    一.基本介绍 MobileIMSDK - 微信小程序端是一套基于微信原生 WebSocket 的即时通讯库: 1)超轻量级.无任何第 3 方库依赖(开箱即用): 2)纯 JS 编写.ES6 语法.高度 ...

  7. JMeter 采样器超详细教程

    宝子们,今天咱就来好好唠唠 JMeter 里那些厉害的采样器,让你轻松拿捏性能测试和接口测试! 一.采样器大集合 先给宝子们来个采样器的 "全家福",让你们心里有个底: HTTP ...

  8. PHP 安装启用imagick(解决 word press可选的模组imagick未被安装或已被禁用)

    本教程仅适用Windows Servier IIS网站服务器. 我的博客使用IIS搭建,相比Linux,相关的教程格外少.因此让以后的小伙伴也能马上解决问题,分享此方法. 首先需要下载php对应版本的 ...

  9. 自动化测试工具-Katalon Studio

              Katalon 代码片段: 1)if(WebUI.verifyTextPresent(findTestObject('Page_Skin/p_Are you ok?'),10,Fa ...

  10. Solution -「POI 2013」LAB-Maze

    \(\mathscr{Description}\)   Link.   构造一个边平行与坐标轴, 顶点是整点, 相邻边互相垂直, 且逆时针遍历顶点时转向 (向左或向右) 符合给定字符串的不自交多边形. ...