Deployment Update Strategy
Recreate Strategy
當部署的 pod 需要更新時,Kubernetes 會先將現有的 pod 刪除,然後再重新建立新的 pod。這種策略稱為 Recreate Strategy。
優點
- 簡單易懂
- 可以確保 pod 是全新的
缺點
- 會造成服務中斷
- 會造成短暫的性能下降
YAML 檔案範例
apiVersion: apps/v1
kind: Deployment
metadata:
name: fastapi-deployment
spec:
selector:
matchLabels:
app: fastapi-app
replicas: 3
strategy:
type: Recreate # 使用 Recreate Strategy
template:
metadata:
labels:
app: fastapi-app
spec:
containers:
- name: fastapi
image: kevinxo328/fastapi:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
Rolling Update Strategy
Rolling Update Strategy 是 Kubernetes 中另一種更新策略,它會逐步更新 pod,而不會一次性刪除所有 pod。
優點
- 不會造成服務中斷
- 可以確保服務的可用性
缺點
- 需要更多的資源
- 更新速度較慢
YAML 檔案範例
apiVersion: apps/v1
kind: Deployment
metadata:
name: fastapi-deployment
spec:
selector:
matchLabels:
app: fastapi-app
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 如果 replicas 是 3,maxSurge 是 1,那麼在更新過程中,Kubernetes 最多會有 4 個 Pods 在運行(3 個舊的 + 1 個新的)
maxUnavailable: 1 # 允許不可用的 Pod 數量。例如,如果 replicas 是 3,maxUnavailable 是 1,那麼在更新過程中,Kubernetes 會確保至少有 2 個 Pods 在運行
template:
metadata:
labels:
app: fastapi-app
spec:
containers:
- name: fastapi
image: kevinxo328/fastapi:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
如何每次拉取最新 Docker Image
情境
在一些情況下,為了進行測試或節省容量,docker image 可能不會每次都更新標籤。但同時可能需要以不停機的方式更新 Kubernetes 的 pod。
解決辦法
- 在 Kubernetes 的 YAML 檔案中,將容器的
imagePullPolicy
設置為Always
- 當 image 更新後,執行
kubectl rollout restart deployment <deployment_name>
。當執行這個命令時,Kubernetes 將會對所指定的部署進行滾動更新,即強制重新建立該部署所管理的所有 pod - 當 deployment 的
replica
數量大於等於兩個時,可以盡量避免服務中斷
YAML 檔案範例
apiVersion: apps/v1
kind: Deployment
metadata:
name: fastapi-deployment
spec:
selector:
matchLabels:
app: fastapi-app
replicas: 2 # 設置 replica 數量為 2
template:
metadata:
labels:
app: fastapi-app
spec:
containers:
- name: fastapi
image: kevinxo328/fastapi:latest
imagePullPolicy: Always # 每次都拉取最新的 image
ports:
- containerPort: 8000