在 Day 07 中,我們親手撰寫了第一個 Pod YAML 檔。但如果你在生產環境中只用 Pod,會遇到一個致命問題:Pod 是拋棄式且脆弱的(Ephemeral)。
apply。在 Kubernetes 的設計哲學中,獨立建立的 Pod 就像「孤兒」,沒有任何控制器在背後監護它。為了實現高可用(High Availability)與自動修復(Self-healing),我們需要引入更高層級的控制器——Deployment。
Kubernetes 採用了非常優雅的階層式設計,這三者的關係可以用「俄羅斯套娃」或「公司組織架構」來理解:
Deployment(高階專案經理):
ReplicaSet(現場工頭):
Pod(基層工人):
ReplicaSet 是如何知道「哪些 Pod 歸它管」的?答案就是 Labels(標籤) 與 Selector(選擇器)。
app: nginx-app)。app: nginx-app 標籤的 Pod,全部歸我監控與管理」。nginx-deployment.yaml在工作目錄建立檔案,內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-app
spec:
replicas: 3
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
解析:spec.template 底下的內容,本質上就是我們在 Day 07 寫的 Pod 定義!Deployment 就是拿這份 template 作為模具,一口氣開出 3 個副本。
執行指令部署 Deployment:
kubectl apply -f nginx-deployment.yaml
輸出預期:
deployment.apps/nginx-deployment created
依序查看 Deployment、ReplicaSet 與 Pods:
# 查看 Deployment
kubectl get deployments
# 查看 ReplicaSet (簡寫 rs)
kubectl get rs
# 查看 Pods
kubectl get pods -l app=nginx-app
你會發現 K8s 自動幫我們建立了 1 個 Deployment、1 個 ReplicaSet,以及 3 個命名帶有隨機後綴的 Pod。
現在我們手動刪除其中一個 Pod,看看會發生什麼事:
# 隨機挑選其中一個 Pod 刪除
kubectl delete pod <POD-NAME>
刪除後立刻再次執行:
kubectl get pods -l app=nginx-app
你會發現被刪除的 Pod 正在被終止,但 ReplicaSet 已經在一秒內自動為你生成了一個全新的 Pod! 這就是 Kubernetes 最強大的自癒保證——永遠維持期望的副本數量。
今天我們搞懂了 Deployment、ReplicaSet 與 Pod 的三層管理體系,也透過親手刪除 Pod 驗證了 K8s 的自動修復能力。
既然 Deployment 可以穩定維持多個 Pod,那麼當軟體有新版本要釋出時,Deployment 又是如何在不停機的情況下幫我們完成升級的?
明天 Day 09,我們將深入探索核心維運場景:「零停機更新:Rolling Update 滾動升級與 Rollback 退回舊版」!