跳至主要内容

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