Home
探索 Uedu
學生控制台
註冊會員/登入
研究知情同意中心
教師控制台
課程設定
支援與訊息
Uptime 數據

UeduGPTs

--

Jupyters

4

UG26 CISOSE26
臺北 AQI 46 · 臺中 AQI 28 · 臺南 AQI 24 · 高雄 AQI 33

AI 回覆桌面通知

AI 助教回覆完成時顯示桌面通知

聊天訊息通知

同學在討論區發送訊息時通知

聲音通知

每當有新通知時播放提示音

雲端運算

雲端運算

從 IaaS、PaaS、SaaS 到虛擬機與容器、彈性擴展與分散式系統,看懂「運算即服務」背後的取捨

為什麼期末報告的那台「伺服器」,不在你的桌子底下

學期末,一群修課同學要把作業展示成一個能讓全班即時投票的網站。半夜尖峰湧入三百人,平常空蕩蕩的時段卻沒人上線。如果他們真的去買一台主機放在宿舍,要嘛平常多數時間機器閒置、電費白繳,要嘛尖峰時刻當機、被同學罵翻。最後他們做的事很簡單:打開瀏覽器,點幾下,租了一台「線上的電腦」,跑完那一晚就關掉,只付了幾十塊台幣。

這就是雲端運算(cloud computing)最樸素的樣貌——把「運算資源」變成像水電一樣,需要時打開水龍頭、用多少算多少、不用時關掉。背後那台機器到底長什麼樣、放在哪個國家、是不是一台實體電腦,使用者其實不需要知道。這種「資源即服務」的思維,正是過去二十年資訊基礎建設最深刻的轉變。

雲端到底「雲」了什麼:三種服務模型

網路與網際網路概念示意圖

理解雲端,最好的起點是區分它替你「接管」了多少工作。傳統上,要讓一個應用程式上線,你得自己準備機房、伺服器、作業系統、執行環境、再到應用程式本身。雲端的三種經典服務模型,差別就在於這條「責任堆疊」從哪裡開始由雲端業者負責。

  • IaaS(基礎設施即服務,Infrastructure as a Service):業者提供虛擬機器、儲存空間、網路。你拿到的是一台「空的電腦」,要自己裝作業系統、設定環境、部署程式。彈性最高,但管理負擔也最重。例:AWS EC2、Google Compute Engine。
  • PaaS(平台即服務,Platform as a Service):業者連作業系統、執行環境、資料庫都幫你管好,你只要把程式碼丟上去,平台自動跑起來。你不必煩惱作業系統更新或伺服器修補。例:Heroku、Google App Engine。
  • SaaS(軟體即服務,Software as a Service):你連程式都不用寫,直接用現成的軟體。Gmail、Google Docs、Notion 都是。使用者只負責「使用」,其餘全部交給業者。

有個常見的比喻能幫助記憶:披薩的三種吃法。IaaS 像買冷凍披薩回家,烤箱、盤子、用餐空間自己準備;PaaS 像叫外送,披薩做好送到家,你只管吃,但要自己擺桌;SaaS 像直接去餐廳,連洗碗都不用。

你負責的部分 自建機房 IaaS PaaS SaaS
應用程式
執行環境/資料庫
作業系統
虛擬化/硬體
機房/電力/網路

由上往下,你扛的責任越來越少,自由度也越來越低。選哪一層,本質上是在「掌控權」與「省事」之間做取捨。

一台機器變很多台:虛擬化(virtualization)

雲端能成立的技術基石,是虛擬化。一台實體伺服器往往配備了幾十核心、上百 GB 記憶體,若整台只租給一個使用者,多數時候資源都閒著。虛擬化讓一台實體機器在邏輯上「切」成許多台互相隔離的虛擬機器(virtual machine, VM),每台 VM 都以為自己獨占一台完整的電腦,擁有自己的作業系統。

實現這件事的關鍵角色叫超管理器(hypervisor),它坐在硬體與多個 VM 之間,負責把實體 CPU、記憶體、磁碟分配給各個 VM,並確保它們彼此隔離——A 客戶的 VM 當機,不會拖垮 B 客戶的 VM。正因為一台機器能服務多位互不相識的使用者(這稱為「多租戶(multi-tenancy)」),雲端業者才能把硬體成本攤薄,再以低廉價格租給你。

比 VM 更輕巧:容器(container)

虛擬機很好用,但它有個代價:每台 VM 都要扛一整套作業系統,開機慢、佔空間。如果我只是想跑一個小小的網站程式,何必為它配一整套 Linux?

容器就是為了解決這個浪費而生。容器不虛擬化整台硬體,而是共用宿主機(host)的作業系統核心(kernel),只把應用程式與它依賴的函式庫、設定檔打包在一起。結果是:容器啟動只要幾秒甚至更快,體積小、密度高,一台機器能塞下的容器數遠多於 VM。Docker 是最知名的容器工具,而當容器一多、需要自動調度時,就交給 Kubernetes 這類「容器編排(orchestration)」系統管理。

容器最迷人的承諾是「在我電腦上跑得起來,在伺服器上也一定跑得起來」——因為環境被一起打包了,不再有「明明同一份程式碼卻在不同機器上行為不一致」的惡夢。

動手看一個例子

假設你寫了一支 Python 小程式,想讓它「無論搬到哪台機器都能一樣執行」。用容器,你只要寫一份 Dockerfile 描述「環境長什麼樣」:

# 從一個已備好 Python 的基礎映像開始
FROM python:3.12-slim

# 設定工作目錄
WORKDIR /app

# 把依賴清單複製進去並安裝
COPY requirements.txt .
RUN pip install -r requirements.txt

# 把程式碼複製進去
COPY app.py .

# 容器啟動時要執行的指令
CMD ["python", "app.py"]

接著兩行指令就能把它「封裝成一個可攜帶的執行包」並跑起來:

docker build -t my-app .    # 依 Dockerfile 建出映像(image)
docker run my-app           # 由映像啟動一個容器來執行

這份映像可以推到任何雲端、任何同事的電腦,跑出來的環境一模一樣。對比之下,若用傳統 VM,你得開機一整台作業系統、手動裝 Python、裝套件、複製檔案——容器把這一切壓縮成一份可重現的「食譜」。

為什麼雲端不會被尖峰壓垮:彈性擴展(elasticity)

回到開頭那個半夜湧入三百人的網站。雲端的殺手級能力,是彈性擴展:系統能依負載自動增減資源。當流量上升,自動多開幾台機器分攤;流量退去,自動關掉、停止計費。

擴展有兩種方向:

  • 垂直擴展(scale up):把單台機器升級得更強(更多 CPU、更多記憶體)。簡單,但有物理上限,且升級時往往要重啟。
  • 水平擴展(scale out):多開幾台同樣的機器,用負載平衡器(load balancer)把請求分散過去。理論上可以一直加下去,是雲端時代的主流做法。

水平擴展之所以強大,正是因為它把問題從「一台超級電腦」轉成「許多台普通電腦合作」——這就把我們帶進了分散式系統的領域。

分散式系統初探:合作的代價

當你的服務跑在許多台機器上,新的麻煩就來了:這些機器之間要透過網路溝通,而網路會延遲、會塞車、甚至會斷線。一台機器以為的「現在」,跟另一台機器以為的「現在」,資料可能對不上。分散式系統(distributed system)研究的,正是「如何讓一群可能各自故障的機器,協同表現得像一個可靠的整體」。

舉個直覺的例子:你在台灣的伺服器更新了庫存數量,美國的伺服器要過一小段時間才會收到這個更新。在這個空窗期,如果有人去問美國伺服器,它看到的會是「舊的」庫存。要嘛你讓它先等一等、把資料同步好再回答(但使用者就得等);要嘛你讓它直接回答舊資料(但可能不一致)。這個兩難,被精煉成了分散式系統最著名的一條定理。

重點回顧

  • 三種服務模型:IaaS 給你空機器、PaaS 給你執行平台、SaaS 給你現成軟體;越往上,業者接手越多、你越省事但掌控越少。
  • 虛擬化讓一台實體機切成多台隔離的虛擬機,是多租戶與成本攤薄的基礎;容器則更輕巧,共用作業系統核心、啟動快、可攜帶。
  • 彈性擴展讓資源隨負載自動增減,水平擴展(多開機器)是雲端主流,按用量計費。
  • 多機器合作就進入分散式系統,網路的不可靠帶來資料一致性的根本難題。
  • 雲端的優點是省去前期建置、彈性、全球觸及;缺點是長期成本可能更高、受制於供應商(vendor lock-in)、隱私與資料主權需謹慎評估。

深入探討(研究所視角)

虛擬機 vs 容器:隔離的層次差異

VM 與容器的根本分野,在於它們「在哪一層做隔離」。VM 由 hypervisor 在硬體層之上虛擬出完整的虛擬硬體,每台 VM 跑自己的客體作業系統核心(guest kernel),彼此之間幾乎沒有共用面,隔離邊界堅實。代價是每台 VM 都背負一整套作業系統的開機時間與記憶體足跡。

容器則建立在單一宿主核心之上,靠 Linux 核心的 namespaces(隔離視角:行程、網路、檔案系統掛載點等,讓容器「看不見」彼此)與 cgroups(限制與計量資源:CPU、記憶體、I/O)這兩組機制達成隔離。因為共用核心,容器省去了重複的作業系統開銷,啟動以秒甚至毫秒計,密度遠高於 VM。但代價是隔離邊界較薄——容器逃逸(container escape)漏洞一旦得手,攻擊面直達宿主核心,而 VM 之間的攻擊則還需穿透 hypervisor。因此安全敏感的多租戶環境,常採折衷方案如 Kata Containers、gVisor、Firecracker,把「容器的輕量」與「VM 級的隔離」結合起來。從研究角度,這體現了系統設計永恆的權衡:隔離強度 ⟷ 資源效率 ⟷ 啟動延遲,三者難以同時最大化。

CAP 定理的直覺

CAP 定理是分散式系統的基石之一。它斷言:一個分散式資料系統,在以下三個性質中,當網路發生分區(partition)時,最多只能同時保證其中兩個——

  • 一致性(Consistency, C):所有節點在同一時刻看到的資料一致;任何讀取都拿到最新一次寫入的結果。
  • 可用性(Availability, A):每個請求都能在有限時間內得到(非錯誤的)回應。
  • 分區容忍(Partition tolerance, P):即使節點間的訊息遺失或延遲(網路被切成幾塊),系統仍能繼續運作。

關鍵在於:在真實世界裡,網路分區遲早會發生,不是「要不要容忍」的選擇題,而是必然。所以 P 幾乎是必選項。真正的抉擇發生在分區當下,系統只能在 C 與 A 之間二選一:

  • CP:寧可拒絕服務,也不回傳可能過時的資料。回到前面台灣/美國庫存的例子,美國伺服器在收不到同步時,乾脆回「暫時無法服務」,保證你看到的永遠正確。
  • AP:寧可回傳可能過時的資料,也要保持回應。美國伺服器照樣回答,只是可能是舊庫存,待網路恢復後再「最終一致(eventual consistency)」地對齊。

值得澄清一個常見迷思:CAP 並非要你在「正常情況」下永久放棄某一性質,它描述的是分區發生時的瞬間抉擇。在網路健康時,系統其實可以兼顧 C 與 A。這個更細緻的觀點被 PACELC 定理補完:若有分區(P),在 A 與 C 之間取捨;否則(E, else),在延遲(Latency, L)與一致性(C)之間取捨——也就是說,即使沒有分區,想要更強的一致性往往得付出更高的延遲。

形式上,若以 $N$ 為複本總數、$W$ 為一次寫入需確認的複本數、$R$ 為一次讀取需查詢的複本數,當 $W + R > N$ 時可保證讀到最新寫入(強一致的法定數讀寫,quorum)。提高一致性(加大 $W$ 或 $R$)必然增加被慢節點拖累的機率,這正是延遲與一致性張力的數學寫照。

與其他主題的連結

雲端把計算機概論裡許多看似分立的主題串成一條線:作業系統的行程隔離與資源排程,在虛擬化與容器中以新形態重現;計算機網路的延遲、頻寬、可靠性問題,在分散式系統中被放大成一致性難題;演算法裡的負載平衡與快取策略,決定了水平擴展的效率上限。理解雲端,某種意義上是把這些基礎拼回一張完整的系統圖像——並學會在「沒有完美解、只有取捨」的真實工程世界裡做出明智的選擇。

AI 共讀助教正在陪你讀:雲端運算
嗨!我是這篇文章的共讀助教,只根據〈雲端運算〉的內容回答。可以問我「解釋某段」「舉個例子」「出題考我」,或反白文中段落後點下方「解釋選取段落」。