
你不想為了學 K8s 先去開一台雲主機、綁一張信用卡。
你只想在自己筆電上,五分鐘內看到東西跑起來。
故事開始:
一座空盪盪的叢集島上,由燈塔村(Control Plane,指揮中心)坐鎮,裡面有負責接聽指令的燈塔櫃檯(API Server)。
島上長出第一棵樹(Node),樹枝上掛著一顆剛吹出來的泡泡(Pod),泡泡(Pod)裡有一隻小鳥(Container)。
Kind 是 Kubernetes IN Docker 的縮寫。
它把 Kubernetes 的節點塞進 Docker 容器裡,定義上,它是一個利用 Docker 容器來模擬 Kubernetes 叢集的本機開發與測試工具。
島是 Kind 蓋的,蓋壞了三十秒就能砍掉重來,可以大膽隨便動手,只負責蓋島跟拆島,蓋完就退到一邊;之後要跟島上做操作,通常是靠哨子(kubectl)聯絡櫃檯。
Kind 蓋完島會自動幫你把 kubectl 指到這座新島上,所以不用做任何連線設定,裝完就能用。

哨子kubectl,我們對島上下的每一個指令都從它發出去。
哨聲吹出去,會直接送到燈塔櫃檯(API Server),定義上它是島上接收所有指令的單一對外窗口。

今天從零開始,結束時你會有一座叢集和一個能在瀏覽器打開的 hello 服務。
先確認 Docker 有開,這是整篇的前提:
docker ps
有正常吐出表格就代表 Docker 活著。
如果看到 Cannot connect to the Docker daemon,去把 Docker Desktop 打開再回來。
裝 Kind 和 kubectl(macOS 用 Homebrew,其他平台看官方安裝頁):
brew install kind kubectl
kind version
kubectl version --client
兩個版本號都印出來就可以往下走。
蓋島:
kind create cluster --name hello
這行會跑一到兩分鐘,畫面上會一行行印出 Preparing nodes、Writing configuration、Starting control-plane。最後看到 Set kubectl context to "kind-hello",島就蓋好了。
看看島上有什麼樹:
kubectl get nodes
你會看到一列 hello-control-plane,STATUS 是 Ready。
這就是圖上那棵巢樹(Node)。如果 STATUS 是 NotReady,等十秒再打一次,它還在開機。
吹出第一顆泡泡(Pod),跑起這 30 天都會用的 Nginx hello 服務:
kubectl run hello --image=nginx:alpine
kubectl get pods
第一次打 get pods 可能看到 ContainerCreating,是正在拉 image。過幾秒再打一次,STATUS 變成 Running 就成功了。
把它接到瀏覽器:
kubectl port-forward pod/hello 8080:80
畫面會停在 Forwarding from 127.0.0.1:8080 -> 80 不動,這是正常的,別關掉它。打開瀏覽器輸入 http://localhost:8080,你會看到 Nginx 的 Welcome 頁。

這頁長得很陽春,但它是從你剛蓋好的叢集裡送出來的,島上第一顆泡泡(Pod)開始工作了。
如果它說 address already in use,代表 8080 被別的程式佔了,把指令改成 8081:80,網址也跟著改成 8081。前面那個數字是你電腦上的埠、後面那個是泡泡(Pod)裡的埠,改前面不會影響服務本身。
另外兩個常見狀況先寫在這裡,省得你自己撞:Pod 一直停在 ContainerCreating 超過一分鐘,通常是網路太慢還在拉 image,先等;瀏覽器打不開但 port-forward 沒報錯,先確認網址打的是 http 不是 https,Nginx 這裡只開 80。
要收工的時候,Ctrl+C 停掉 port-forward。
叢集留著,明天還要用。
真的想砍掉重來就打 kind delete cluster --name hello。
最後提醒一下,Kind 是拿來學和測試的,不是拿來上線的。
它的樹是 Docker 容器模擬的,整座島跑在一台筆電上,這台電腦關機島就沒了。
正式環境的叢集會有好幾棵真的機器當 Node,而且燈塔村本身也會開好幾份互相備援。
但這不影響你學:你這 30 天打的每一個指令、寫的每一份 YAML,搬到正式環境時,資源寫法大致相同,但儲存、網路、權限與叢集設定通常要調整。
差別主要在底下有幾棵樹、樹是什麼做的,以及環境相關設定,這也是 K8s 的好處。
另外,你電腦上可以同時有好幾座島,哨子(kubectl)靠 context 決定要對哪一座說話:
kubectl config get-contexts
前面有星號的那一行,就是哨子(kubectl)現在對著的島。
之後你如果同時開了公司的叢集和自己的 Kind,記得先看這行再打指令。
島是 Kind 蓋的,之後都靠哨子(kubectl)說話。