iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0
AI Engineering

Agent 開發, 從本地到雲端: AI 工程師的 K8s 筆記系列 第 16 篇

Day 16|先問「你真的需要 K8s 嗎」:一張決策樹(單 VM + compose / serverless 容器 / managed K8s / 自架)

  • 分享至 

  • xImage
  •  

cover

POV:你剛把一隻 bot 搬進 k3s、也修好了 CrashLoopBackOff,正想把手上其他東西全搬上去,然後想起那台 Spot VM 上的 compose 其實跑得好好的。

Week 3 花了五天讓一隻 bot 活在 k3s 裡。Week 4 要退一步問一個更誠實的問題:對你的 AI app 來說,K8s 是正確答案嗎?我自己的答案是「有時候不是」,而且我有一個真實案例(Day 17)是評估完決定不搬的。今天先把決策樹畫出來。

四個選項,不是一條光譜

我一開始以為部署方式是一條從簡單到複雜的光譜,後來發現它們更像四個不同的房間,各自有適合住的人:

  1. 單 VM + docker compose:一台機器、一份 compose 檔、systemd 或 restart policy 顧著。
  2. Serverless 容器(Cloud Run、Azure Container Apps):你給 image,平台幫你跑、幫你 scale,沒流量可以縮到零。
  3. Managed K8s(GKE、AKS):雲端幫你顧 control plane,你顧工作負載。
  4. 自架 K8s(k3s 在自己的 VM 上):全部自己來。

四個房間的價格、限制、要顧的事都不一樣,而且不是「越後面越好」。

決策樹:我會照這個順序問

Q1:你的 agent 是「一直在」還是「有人叫才動」?
Discord bot 這種自己維持連線、隨時等事件的,是一直在;提供 HTTP API 給別人 call 的,是有人叫才動。我的 LINE bot 嚴格說屬於後者:它是 LINE 的 webhook 走 cloudflared tunnel 打進來(Day 05),只是我目前還是讓它常駐在 compose 裡,這題答起來要看你怎麼接事件,不是看它叫 bot 就算一直在。前者跟 serverless 容器的 scale-to-zero 天生衝突(Day 21 會細講),後者是 serverless 的主場。這題我在 Day 17 會示範一次答錯的經驗:看起來是 HTTP 服務,骨子裡卻有背景工作跟記憶體裡的狀態。

Q2:你有幾個服務、它們之間有沒有依賴?
一隻 bot:房間 1 就夠。bot 加 RAG 引擎、向量庫、反向代理(我的 devstack 就是這樣):房間 1 還撐得住,但你會開始感受到 Day 04 那種什麼都疊在一台機器上的壓力。要超過一台機器才放得下:房間 3 或 4。需要各自獨立擴縮但每個服務都是有人叫才動的 HTTP 服務:房間 2 也做得到,每個服務各自是一個 service 各自 scale,不一定要進 K8s。

Q3:你需要 GPU 嗎?
需要的話,房間 2 和 3 都有 GPU 選項(Cloud Run GPU、GKE GPU node pool,Day 25 講),但計費模型差很多。自架 GPU 節點(房間 4)在 side project 規模,我目前的判斷是通常不划算。

Q4:你願意花多少時間在顧叢集,而不是寫 agent?
這是最誠實的一題。房間 4 自由度最高,代價是升級、備份、節點壞掉都是你的事(Day 29)。房間 3 把 control plane 外包了,但 YAML、網路、權限還是你的。房間 2 幾乎什麼都不用顧,代價是限制多,Day 17 會撞到一道很具體的牆。房間 1 最省心,直到機器掛掉。

Q5:你的機器會不會被回收?
如果你像我一樣用 Spot VM 省錢,房間 1 的省心就要打折:重開機後誰把東西拉起來?容器靠 restart policy 可以自己回來,但機器上其他沒宣告在任何設定檔裡的東西,要靠自己寫的腳本,而那些腳本不一定每次都對(Day 18 有實錄)。房間 3 在這點有結構性優勢:節點掉了,Pod 可以排去別的節點,前提是你真的有別的節點。單節點的 k3s(房間 4)在這題上跟房間 1 一樣,得等機器回來。

我目前的位置

誠實講:我大部分東西在房間 1。OpenAB 的十餘個容器跟 devstack 都是 docker compose 起的,liaostudio 用 systemd 顧著(Day 17 會講),都在同一台 Spot VM 上。少數 GPU workload 在房間 2:liaostudio 的自架 Whisper backend 跑在 Cloud Run L4。房間 4 是我的學習沙盒,Week 3 那隻 bot 就住在那裡。房間 3 在這個系列裡我還沒把任何東西搬上去,Week 5、6 會做最小實作,但那是「試」不是「搬」。

這個系列叫筆記而不是指南,就是因為我自己也還在這棵樹上移動。

一個常見的錯誤:為了學而搬

我看過(包括我自己)的一個錯誤是:因為想學 K8s,就把跑得好好的東西搬上去。結果是多了一層要顧的東西,agent 本身沒有變好。Day 11 講的學習路徑刻意把沙盒跟生產分開,就是為了避免這個。要學,在 k3s 上學;要搬,先走完這棵樹。

另一個反過來的錯誤是:因為房間 1 現在還撐得住,就假設它永遠撐得住。Day 04 的 swap 見底跟 Day 18 的重開機,都是房間 1 在提醒我它的邊界在哪。

明天講一次我真的走完這棵樹的經驗:評估完 Cloud Run,決定暫不搬。

今日一句話

K8s 不是部署的終點,是四個房間之一。先問你的 agent 是一直在還是被叫才動、你願意花多少時間顧叢集,再決定要不要進這個房間。

延伸閱讀


上一篇
Day 15|觀測最小可行組合:kubectl top、metrics、log 聚合,跟 docker stats 差在哪
下一篇
Day 17|我的真實決策:評估 Cloud Run 後決定「暫不搬」— 評估表與理由(liaostudio)
系列文
Agent 開發, 從本地到雲端: AI 工程師的 K8s 筆記 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言