當我們在 Kubernetes 上部署應用時,最常見的需求就是:
在 Kubernetes 中,這些需求主要透過 ReplicaSet 與 Deployment 來實現,而 自動擴展 (HPA) 與 滾動更新 (Rolling Update) 更是 DevOps 環境不可或缺的能力。今天就帶大家深入了解這兩個核心物件。
ReplicaSet 是什麼?
ReplicaSet 的用途
簡單範例
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
Deployment 是什麼?
Deployment 是比 ReplicaSet 更高層級的抽象。它不僅能建立並管理 ReplicaSet,還提供:
Deployment vs ReplicaSet
| 特性 | ReplicaSet | Deployment |
|---------------|-------------------|-----------------------|
| 維持 Pod 數量 | ✅ | ✅ (透過內部 ReplicaSet) |
| 滾動更新 | ❌ | ✅ |
| 回滾 | ❌ | ✅ |
| 推薦使用情境 | 測試或特殊需求 | 正式生產環境 |
自動擴展 (Horizontal Pod Autoscaler, HPA)
滾動更新 (Rolling Update)
回滾 (Rollback)
kubectl rollout undo deployment nginx-deployment
我們來做一個完整流程:建立 Deployment → 滾動更新 → 自動擴展
Step 1. 建立 Deployment
建立一個 nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
部署並確認:
kubectl apply -f nginx-deployment.yaml
kubectl get pods
Step 2. 滾動更新
假設我們要將 nginx 升級到 1.27:
kubectl set image deployment/nginx-deployment nginx=nginx:1.27
檢查更新狀態:
kubectl rollout status deployment/nginx-deployment
如果出現問題,立刻回滾:
kubectl rollout undo deployment/nginx-deployment
⸻
Step 3. 自動擴展 (HPA)
建立 HPA:
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=2 --max=10
觀察自動擴展:
kubectl get hpa
製造流量壓力:
kubectl run -it --rm load-generator --image=busybox /bin/sh
在容器內執行
while true; do wget -q -O- http://nginx-deployment; done
回到另一個終端機,觀察 Pod 數量變化:
kubectl get pods -w