02 | Kubernetes 部署 FastAPI LLM Serving 并接入 Ollama
1. 总览基于 Kubernetes 部署 FastAPI LLM Serving通过 Kubernetes Service 和 Ingress 对外提供 API并通过host.docker.internal访问 MacBook 上的 Ollama。核心调用链Client → Kubernetes Ingress → Kubernetes Service → FastAPI → host.docker.internal → MacBook → Ollama → Qwen3:8b → Response2. 构建 Docker Image2.1 第一次构建(.venv)(base)igwanglyangMacbookProdahouzicn GitHub %cdllm-serving(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving %dockerbuild-tllm-serving:0.1.0.构建完成[] Building 88.2s (11/11) FINISHED naming to docker.io/library/llm-serving:0.1.0检查镜像(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving %dockerimages|grepllm-servingllm-serving 0.1.0 51e808a2a4bc 10 seconds ago 200MB2.2 修改 Dockerfile 后重新构建修改 Dockerfile 后使用--no-cache(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving %dockerbuild --no-cache-tllm-serving:0.1.1.构建完成[] Building 38.9s (10/10) FINISHED naming to docker.io/library/llm-serving:0.1.13. Kubernetes Service 测试3.1 使用测试 Pod(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl run curl-test\-nllm-serving\--rm-it\--imagecurlimages/curl\--sh~ $curlhttp://llm-serving:8000/health{status:ok,service:llm-serving,ollama:ok}3.2 重新部署 Pod(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl delete pod-nllm-serving-lappllm-servingpod llm-serving-5d68446ff5-n9xn6 deleted(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl get pods-nllm-serving-w最终llm-serving-5d68446ff5-xgs5l 1/1 Running4. Helm 部署(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % helminstallllm-serving ./k8sNAME: llm-serving NAMESPACE: default STATUS: deployed REVISION: 1检查资源(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl get all-nllm-serving核心资源pod/llm-serving-5d68446ff5-n9xn6 1/1 Running service/llm-serving ClusterIP 10.106.230.103 8000/TCP deployment.apps/llm-serving 1/1 replicaset.apps/llm-serving 1/15. 检查 Kubernetes 资源(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl get pods-nllm-serving(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl get deployment-nllm-serving(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl get configmap-nllm-serving核心状态Pod → 1/1 Running Deployment → 1/1 Available ConfigMap → llm-serving-config6. ConfigMap(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl describe configmap llm-serving-config-nllm-serving关键配置DEFAULT_MODEL: qwen3:8b OLLAMA_BASE_URL: http://host.docker.internal:11434调用关系FastAPI → host.docker.internal → MacBook → Ollama7. 测试 Pod 内 FastAPI(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectlexec-nllm-serving deploy/llm-serving --\curlhttp://localhost:8000/health当前镜像没有curlexec: curl: executable file not found in $PATH改用 Python(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectlexec-nllm-serving deploy/llm-serving --\python-cimport urllib.request; print(urllib.request.urlopen(http://localhost:8000/health).read().decode()){status:ok,service:llm-serving,ollama:ok}8. 测试 Pod → Ollama(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectlexec-nllm-serving deploy/llm-serving --\python-cimport urllib.request; print(urllib.request.urlopen(http://host.docker.internal:11434/api/tags).read().decode())确认 Ollama 返回模型列表其中包含qwen3:8b核心网络Kubernetes Pod → host.docker.internal → MacBook → Ollama9. 验证 FastAPI 配置9.1 Health(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectlexec-nllm-serving deploy/llm-serving --\python-cimport urllib.request; print(urllib.request.urlopen(http://localhost:8000/health).read().decode()){status:ok,service:llm-serving,ollama:ok}9.2 Environment(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectlexec-nllm-serving deploy/llm-serving --\env|grep-EOLLAMA|DEFAULT_MODELOLLAMA_BASE_URLhttp://host.docker.internal:11434 DEFAULT_MODELqwen3:8b10. Kubernetes Service(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl get svc-nllm-servingNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) llm-serving ClusterIP 10.106.230.103 none 8000/TCP11. MacBook → Kubernetes Service11.1 Port Forward(.venv)(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl port-forward\-nllm-serving\service/llm-serving\8000:8000Forwarding from 127.0.0.1:8000 - 8000 Forwarding from [::1]:8000 - 8000 Handling connection for 800011.2 测试另一个窗口(base)igwanglyangMacbookProdahouzicn ~ %curlhttp://localhost:8000/health{status:ok,service:llm-serving,ollama:ok}12. Kubernetes → Ollama → Qwen3(base)igwanglyangMacbookProdahouzicn ~ %curlhttp://localhost:8000/v1/chat/completions\-HContent-Type: application/json\-d{ model: qwen3:8b, messages: [ { role: user, content: Explain Kubernetes Service in 100 words. } ] }返回{id:chatcmpl-6a1f8e7d9efd,object:chat.completion,created:1791474852,model:qwen3:8b,choices:[{index:0,message:{role:assistant,content:A Kubernetes Service is an abstraction layer that provides stable network access to a group of pods (or a single pod) through a consistent IP address and DNS name. It defines policies for load balancing, traffic routing, and discovery, enabling reliable communication within a cluster or externally. Services act as logical endpoints, abstracting the dynamic IP changes of pods. They support types like ClusterIP (internal), NodePort (exposes on node ports), and LoadBalancer (external). By decoupling networking from pod lifecycle, Services ensure scalability, resilience, and simplified service discovery, making microservices and distributed systems more manageable in Kubernetes environments. (100 words)},finish_reason:stop}],usage:{prompt_tokens:21,completion_tokens:371,total_tokens:392}}13. Pod 自愈(base)igwanglyangMacbookProdahouzicn ~ % kubectl delete pod\-nllm-serving\-lappllm-servingpod llm-serving-5d68446ff5-xgs5l deleted观察(base)igwanglyangMacbookProdahouzicn llm-serving % kubectl get pods-nllm-serving-w最终llm-serving-5d68446ff5-ppd5d 1/1 Running14. Deployment 与 Health Probe14.1 Deployment(base)igwanglyangMacbookProdahouzicn ~ % kubectl get deployment-nllm-servingllm-serving 1/1 1 114.2 Pod(base)igwanglyangMacbookProdahouzicn ~ % kubectl describe pod\-nllm-serving\-lappllm-serving关键状态Status: Running Node: docker-desktop/192.168.65.3 IP: 10.1.19.16614.3 Health ProbeLivenessLiveness → 是否需要重启ReadinessReadiness → 是否可以接收流量当前配置Liveness: http-get http://:8000/health delay15s timeout1s period20s #success1 #failure3 Readiness: http-get http://:8000/health delay5s timeout1s period10s #success1 #failure315. Ingress15.1 检查 Ingress(base)igwanglyangMacbookProdahouzicn ~ % kubectl get svc-A|grep-Eingress|harbor关键结果ingress-nginx-controller NodePort 10.104.86.242 none 80:30080/TCP,443:30443/TCP检查 Pod(base)igwanglyangMacbookProdahouzicn ~ % kubectl get pods-A|grep-Eingress|harboringress-nginx-controller-df569d69f-q59z2 1/1 Running15.2 测试 Ingress(base)igwanglyangMacbookProdahouzicn ~ %curl-HHost: llm-serving.localhttp://127.0.0.1:30080/health{status:ok,service:llm-serving,ollama:ok}调用链MacBook → NodePort 30080 → Ingress → Service → FastAPI16. LLM API(base)igwanglyangMacbookProdahouzicn ~ %curlhttp://llm-serving.local:30080/v1/chat/completions\-HContent-Type: application/json\-d{ model: qwen3:8b, messages: [ { role: user, content: Explain Kubernetes Ingress in 50 words. } ] }返回{id:chatcmpl-f90f3c2f9019,object:chat.completion,created:1791477303,model:qwen3:8b,choices:[{index:0,message:{role:assistant,content:Kubernetes Ingress is a resource that manages external access to services in a cluster, routing HTTP/HTTPS traffic based on rules. It enables load balancing, SSL termination, and exposes services via a single IP, using an Ingress controller to handle the actual routing logic.},finish_reason:stop}],usage:{prompt_tokens:21,completion_tokens:205,total_tokens:226}}17. Rolling UpdateRolling Update Kubernetes 的无停机/低中断版本发布机制。Old Pod → New Pod → Traffic gradually moves → Old Pod removed验证kubectl get deployment-nllm-serving kubectl get pods-nllm-serving-wcurlhttp://llm-serving.local:30080/health18. HelmHelm 可以理解成Kubernetes 的 Package Manager Deployment Template Engine。当前部署helminstallllm-serving ./k8s调用关系Helm Chart → Kubernetes Manifest → Deployment → ReplicaSet → Pod → Service → Ingress最终架构Client → Kubernetes Ingress → Kubernetes Service → FastAPI → host.docker.internal → MacBook → Ollama → Qwen3:8b → Response完成 Kubernetes → FastAPI → Ollama → Qwen3 的完整 LLM Serving 链路验证。

相关新闻

SemIf 实战避坑:边界句误判、上下文长度、量化精度,3090 上的 5 个坑

SemIf 实战避坑:边界句误判、上下文长度、量化精度,3090 上的 5 个坑

SemIf 实战避坑:边界句误判、上下文长度、量化精度,3090 上的 5 个坑 【免费下载链接】SemIf-OpenJev Semantic ifs from open models, on a 3090 at home. Independent; not affiliated with Jev or TypeSafe. 项目地址: https://gitcode.com/gh_mirr…

2026/10/10 12:20:56 阅读更多 →
Rust trait 完全指南:从基础语法到零成本抽象工程实践

Rust trait 完全指南:从基础语法到零成本抽象工程实践

1. Rust 的 trait:行为契约,不只是接口在 Rust 里,trait 是个绕不过去的核心概念。我可以直接说:如果你理解了 trait,你就理解了 Rust 设计哲学的一半。剩下的一半是所有权和生命周期。我第一次接触 trait 的时候&…

2026/10/10 12:19:56 阅读更多 →
DeepSeek解读Windows电池报告:笔记本健康度查询与更换判断

DeepSeek解读Windows电池报告:笔记本健康度查询与更换判断

没用过几台Windows笔记本的人,可能不会意识到电池健康度这个数字有多重要。等你真正带着笔记本出门开会,结果屏幕亮度调到最低、WiFi都关了,还是眼睁睁看着电量从100%掉到20%,那时候才明白“健康度”三个字有多值钱。我最近一直在…

2026/10/10 12:19:56 阅读更多 →

最新新闻

ReelMimic完全指南:如何用最爱的视频当模板,一键生成同款风格的AI视频

ReelMimic完全指南:如何用最爱的视频当模板,一键生成同款风格的AI视频

【免费下载链接】reelmimic Show it a video you love. Get a new video in the same style. An AI crew (Claude Code or Codex) plans, builds and reviews it with you. 项目地址: https://gitcode.com/gh_mirrors/re/reelmimic 点击查看 免费下载 ReelMimic 是…

2026/10/10 15:18:38 阅读更多 →
10 分钟上手:给 Claude Code 装上 ai-memory,让 Agent 跨会话记住你的项目偏好

10 分钟上手:给 Claude Code 装上 ai-memory,让 Agent 跨会话记住你的项目偏好

10 分钟上手:给 Claude Code 装上 ai-memory,让 Agent 跨会话记住你的项目偏好 【免费下载链接】ai-memory Solution for long term memory for agent coding CLIs and to facilitate handoff between different agent vendors 项目地址: https://gitc…

2026/10/10 15:18:38 阅读更多 →
cal.diy 集成 Discord:静态会议链接型应用从配置到代码的完整拆解

cal.diy 集成 Discord:静态会议链接型应用从配置到代码的完整拆解

后端前端企业应用 【免费下载链接】cal.diy Scheduling infrastructure for absolutely everyone. 项目地址: https://gitcode.com/GitHub_Trending/ca/cal.diy 点击查看 免费下载 本指南以 cal.diy(Cal.com 开源调度平台)应用商店中的 Disc…

2026/10/10 15:18:37 阅读更多 →
AI又在编造基金经理“原话“?完整看懂可溯源投研Agent Skill zhengxi-views如何做到句句有出处

AI又在编造基金经理“原话“?完整看懂可溯源投研Agent Skill zhengxi-views如何做到句句有出处

【免费下载链接】zhengxi-views 可溯源的郑希(易方达基金经理)投研 Agent Skill——基于他全部公开观点原文 有原话佐证的投资方法 全市场基金真实数据,能溯源问答、按他框架给基金打分,绝不杜撰。⚠️仅研究学习辅助,不构成投资建议‼️we…

2026/10/10 15:18:37 阅读更多 →
如何搭建你的第二大脑:Hope Agent 知识空间完全教程——AI共读写Markdown并无缝对接Obsidian

如何搭建你的第二大脑:Hope Agent 知识空间完全教程——AI共读写Markdown并无缝对接Obsidian

【免费下载链接】hope-agent 🦭 A cross-device desktop AI agent with memory, autonomous goals, dynamic workflows, and headless deployment | 会记忆、能持续推进目标、会动态编排多 Agent 的跨端桌面 AI 助手,也可服务化常驻 NAS / 云端 项目地址…

2026/10/10 15:18:37 阅读更多 →
SpringBoot+Vue宠物管理系统实战:本地可运行全栈落地指南

SpringBoot+Vue宠物管理系统实战:本地可运行全栈落地指南

简介:本资源是一份面向计算机专业本科生的毕业设计论文文档,聚焦Spring Boot与Vue.js前后端分离架构下的宠物管理系统开发实践,适用于Java全栈开发入门到进阶学习者。论文完整覆盖系统需求分析、Spring Boot后端框架选型依据、Vue.js前端实现…

2026/10/10 15:17:37 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →