k8s重启deployments5种的方法
在 Kubernetes 中,重启 Deployment 的方式有多种,以下是详细的分类和说明:
1. 使用 kubectl rollout restart(推荐)
适用场景:快速、安全地触发滚动重启,无需修改配置或镜像。
- 步骤:
kubectl rollout restart deployment <deployment-name> -n <namespace> - 特点:
- 触发滚动更新(Rolling Update),逐个替换 Pod,确保服务高可用。
- 不需要修改镜像或配置,仅通过更新
Deployment的template的annotations或labels来触发重启。 - 要求集群版本 >= 1.15。
- 回滚:
# 查看历史版本 kubectl rollout history deployment/<deployment-name> -n <namespace> # 回滚到上一个版本 kubectl rollout undo deployment/<deployment-name> -n <namespace> # 回滚到指定版本 kubectl rollout undo deployment/<deployment-name> --to-revision=<version> -n <namespace>
2. 通过修改镜像(kubectl set image)
适用场景:需要更新镜像或间接触发重启。
- 步骤:
kubectl set image deployment/<deployment-name> <container-name>=<new-image> -n <namespace>- 例如:
kubectl set image deployment/nginx-deployment nginx=nginx:1.21 -n default
- 例如:
- 特点:
- 修改容器镜像会触发滚动更新,即使镜像未变化(如使用相同标签),但 Kubernetes 会强制重启。
- 需要确保新镜像存在,否则会失败。
- 回滚:
同rollout restart的回滚方法。
3. 通过修改环境变量或配置
适用场景:需要更新配置或环境变量,同时触发重启。
- 步骤:
# 使用 patch 命令添加/修改环境变量 kubectl patch deploy <deployment-name> -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"<container-name>","env":[{"name":"RESTART_TIME","value":"'$(date +%s)'"}]}]}}}}'- 或通过
kubectl set env:kubectl set env deploy/<deployment-name> RESTART_TIME=$(date +%s) -n <namespace>
- 或通过
- 特点:
- 修改
PodTemplateSpec的环境变量会触发滚动更新。 - 添加无意义的环境变量(如时间戳)仅用于强制触发重启。
- 修改
- 回滚:
同rollout restart的回滚方法。
4. 删除 Pod
适用场景:快速重启单个或多个 Pod,适合小规模或紧急情况。
- 步骤:
# 删除所有 Pod(通过标签选择器) kubectl delete pod -l app=<app-label> -n <namespace>- 例如:
kubectl delete pod -l app=nginx -n default
- 例如:
- 特点:
- 依赖
Deployment的控制器自动重建 Pod,实现滚动重启。 - 无需修改配置或镜像。
- 缺点:手动删除 Pod 可能导致短暂服务中断(取决于副本数)。
- 依赖
- 回滚:
通过Deployment的历史版本回滚。
5. 编辑 Deployment 的 YAML 文件
适用场景:需要修改配置并触发重启。
- 步骤:
# 直接编辑 Deployment 的 YAML kubectl edit deployment <deployment-name> -n <namespace>- 在编辑器中修改无关紧要的字段(如注释、标签),保存后触发更新。
- 特点:
- 任何修改(即使无关)都会触发滚动更新。
- 回滚:
同rollout restart的回滚方法。
6. 通过 kubectl scale(不推荐)
适用场景:极端情况下强制重启(不推荐,可能中断服务)。
- 步骤:
# 先缩容到 0,再扩容回来 kubectl scale deployment <deployment-name> --replicas=0 -n <namespace> kubectl scale deployment <deployment-name> --replicas=<original-replicas> -n <namespace> - 特点:
- 会短暂中断服务(所有 Pod 被删除后再重建)。
- 仅在非关键场景使用。
对比与选择建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
rollout restart | 安全、无配置变更、滚动更新 | 需集群版本 >=1.15 | 快速重启且需保持服务高可用 |
| 修改镜像/环境变量 | 灵活,可结合配置更新 | 需额外操作 | 需要同时更新配置或镜像 |
| 删除 Pod | 快捷,无需修改配置 | 可能短暂中断服务 | 小规模或紧急情况 |
| 编辑 YAML | 可视化修改配置 | 需手动操作 | 需要修改配置时 |
kubectl scale | 强制重启 | 中断服务 | 极端情况(不推荐) |
注意事项
- 滚动更新:大多数方法会触发滚动更新,确保服务在重启过程中保持可用。
- 回滚机制:所有方法生成新的
ReplicaSet,可通过kubectl rollout undo回滚。 - 数据持久化:若 Pod 持有数据(如数据库),需确保使用
PersistentVolume,否则重启会丢失数据。
根据实际需求选择最合适的方法,推荐优先使用 kubectl rollout restart。