在 Kubernetes v1.33 之前,如果你想要調整 Pod 的 CPU 或記憶體配置,常見的做法只有兩條路:
直接編輯 Pod:
kubectl edit pod my-api
嘗試修改 resources.requests/limits
,結果不是被拒絕,就是只能:
kubectl get pod my-api -o yaml > pod.yaml
kubectl replace --force -f pod.yaml # 本質是刪掉重建
=服務中斷。
修改 Deployment/StatefulSet 模板:
kubectl set resources deploy my-api \
--requests=cpu=250m,memory=512Mi \
--limits=cpu=500m,memory=1Gi
這會觸發滾動更新,舊 Pod 仍需被重建,還是避免不了中斷。
這就是痛點:調整資源 ≠ 重建 Pod。對長連線、stateful workload 或緊急救火的情境尤其不友善。
memory requests
可以降。memory limits
,該容器必須設 resizePolicy.memory=RestartContainer
,否則會被拒絕。apiVersion: v1
kind: Pod
metadata:
name: my-api
spec:
containers:
- name: app
image: ghcr.io/example/my-api:1.0.0
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "200m"
memory: "512Mi"
kubectl get pod my-api -o yaml > pod.yaml
# 修改 requests/limits
kubectl replace --force -f pod.yaml # 舊 Pod 被刪 + 新 Pod 被建
kubectl patch pod my-api --type='merge' -p '{
"spec": {
"containers": [{
"name": "app",
"resources": {
"requests": {"cpu": "500m", "memory": "512Mi"},
"limits": {"cpu": "1", "memory": "1Gi"}
}
}]
}
}'
驗證:
# 確認容器沒有重啟
kubectl get pod my-api -o jsonpath='{.status.containerStatuses[0].restartCount}{"\\n"}'
# 確認容器 ID 沒變
kubectl get pod my-api -o jsonpath='{.status.containerStatuses[0].containerID}{"\\n"}'
kubectl edit
改 Pod 資源會被拒絕,或只能 replace --force
→ 中斷。