▌ 技术引导
你要是真在做集群部署,滚动更新这件事绝对不能靠运气。我见过太多人搞不定,不是资源搞没,就是服务断了,最后连回滚都没法做。真实场景里,大家都会用 kubectl rollout 或者 helm 来控制,但关键是要把 upgrade 与 rollback 操作搞清楚。比如在 Kubernetes 里,升级前得确保 readinessProbe 指标正确,否则会卡在 pending 状态。还要留意 maxSurge 和 maxUnavailable 的配置,这两个参数决定的是更新方式,不是你想象的那样。如果用的是 Docker Swarm,那就得在 service 配置里加上 update_config 里的 parallelism 和 delay,不然整个集群会像断线的机器人一样卡死。别忘了在升级前做一次全量的健康检查,跑完单元测试再部署,否则你可能一整天都得在排查日志里度过。
我之前在生产环境踩过坑,升级过程中因为没有设置 pause 命令,直接把整个服务推上去了,结果新版本有内存泄漏,连运维都找不到问题在哪里,因为所有节点都同时失败。后来用 kubectl set image 做一次 partial rollout,发现问题点,再逐步推进。这种策略能帮你省去大量排查时间。如果你是用 Terraform 来管理集群,记得用 apply 的 -target 参数来控制更新顺序,否则整个状态文件会像病毒一样蔓延。
另外,团队协同升级这件事,最怕两个人同时改同一个配置,搞不好就冲突了。用 GitOps 的话,就得走 CI/CD 管道,确保每次提交都经过测试,再触发部署。如果你用 Argo CD,记得配置 syncStrategy 为 Recreate,不然会卡在 rolling update 状态。还有,别忘了设置 feature gates,特别是 Kubernetes 1.25 之后的版本,有些新特性需要手动开启。
最后,如果遇到资源不足的问题,记得在 Kubernetes 集群里增加 Horizontal Pod Autoscaler,这样可以自动调整副本数,避免服务中断。如果你是用 Helm,千万别用 helm upgrade --install,这会破坏你当前的状态,导致回滚困难。用 helm upgrade --recreate-pods 要配好 --wait 参数,否则你可能会看到服务在升级过程中反复上下线。总之,别把这些动作当成简单命令,每个细节都要踩在实地上。
▌ 技术参考
一 你要是真在做集群部署,滚动更新这件事绝对不能靠运气。我见过太多人搞不定,不是资源搞没,就是服务断了,最后连回滚都没法做。真实场景里,大家都会用 kubectl rollout 或者 helm 来控制,但关键是要把 upgrade 与 rollback 操作搞清楚。比如在 Kubernetes 里,升级前得确保 readinessProbe 指标正确,否则会卡在 pending 状态。还要留意 maxSurge 和 maxUnavailable 的配置,这两个参数决定的是更新方式,不是你想象的那样。如果用的是 Docker Swarm,那就得在 service 配置里加上 update_config 里的 parallelism 和 delay,不然整个集群会像断线的机器人一样卡死。别忘了在升级前做一次全量的健康检查,跑完单元测试再部署,否则你可能一整天都得在排查日志里度过。
二 我之前在生产环境踩过坑,升级过程中因为没有设置 pause 命令,直接把整个服务推上去了,结果新版本有内存泄漏,连运维都找不到问题在哪里,因为所有节点都同时失败。后来用 kubectl set image 做一次 partial rollout,发现问题点,再逐步推进。这种策略能帮你省去大量排查时间。如果你是用 Terraform 来管理集群,记得用 apply 的 -target 参数来控制更新顺序,否则整个状态文件会像病毒一样蔓延。
三 在 Kubernetes 中执行滚动更新,核心命令是 kubectl set image,但必须指定 --record 参数,这样可以在 rollout history 中记录变更。如果你用的是 Helm,一定要在 values.yaml 里设置 image.tag,然后再 helm upgrade。千万不要直接修改 Deployment 的 YAML,这样会导致版本混乱。比如这样写:`kubectl set image deployment/myapp myapp=image:tag --record`,然后用 `kubectl rollout history deployment/myapp` 查看版本记录。
四 如果是 Docker Swarm,你得用 docker service update 命令,加上 --update-delay 和 --parallelism 参数。比如 `docker service update --image myapp:latest --update-delay 10s --parallelism 5 myapp`,这样可以控制更新速度,避免资源争抢。如果服务有多个副本,记得检查 update_config 的配置,比如 `update_config: { parallelism: "5", delay: "10s" }`,这些配置决定了每个副本更新的间隔和并发数量。
五 一个常见的踩坑场景是 readinessProbe 设置不当,导致服务在更新过程中无法正确检测状态。比如,如果你的 readinessProbe 没有设置 initialDelaySeconds,服务可能会在启动不久后就进入就绪状态,但实际上还没准备好。这时候,新 Pod 会立即开始接收流量,引发服务不稳定。解决方案是给 readinessProbe 加上初始延迟,同时设置 failureThreshold,比如:`readinessProbe: { httpGet: { path: /health, port: 80 }, initialDelaySeconds: 30, failureThreshold: 5 }`。
六 在团队协同升级时,最容易的问题是多人同时修改同一个配置文件。解决方法是用 GitOps 工具,比如 Argo CD 或 Flux,确保每次提交都经过审核和测试。如果你用的是 Argo CD,记得在配置文件里添加 syncStrategy: Recreate,这样能避免滚动更新带来的潜在问题。同时,可以设置 autoSync: false,让团队成员在修改后需要手动触发同步。
七 如果你用的是 Helm,可以利用 helm upgrade 和 helm rollback 命令来控制版本。例如,执行 `helm upgrade --recreate-pods myrelease mychart`,这样会强制重新创建 Pod,确保旧版本被正确替换。同时,可以使用 `helm rollback myrelease 1` 来回退到某个历史版本。关键是要确保每次升级都记录日志,方便后续排查。
八 在 Kubernetes 中,如果你发现服务升级后无法正常访问,可以使用 `kubectl rollout undo deployment/myapp` 来回滚。但要注意,这个命令只能回退到最近一次的 rollout 历史。如果你需要回退到某个特定版本,需要用 `kubectl rollout undo deployment/myapp --to=1`,其中 1 是 rollout 的历史序号。这种情况下,确保你有完整的 rollout history 是关键。
九 有些时候,升级会因为资源不足而失败。比如在 Kubernetes 中,如果集群的可用内存不足以支撑新版本的容器,就会触发滚动失败。这时候可以使用 Horizontal Pod Autoscaler 来动态调整副本数,或者在 Deployment 里设置 resources.limits,限制每个 Pod 的资源使用。例如:`resources: { limits: { memory: "512Mi", cpu: "500m" } }`,这样可以防止资源争抢。
十 如果你用的是 Docker Swarm,还可以通过设置 `--no-deps` 标志来避免依赖服务同时重启。比如 `docker service update --no-deps myapp`,这样可以确保只有主服务被更新,而它的依赖服务保持不变。但是,这种方式可能会导致服务之间不一致,所以必须确保所有依赖服务已经同步到新版本。
十一 在 Kubernetes 中,还有一个容易忽略的配置是 maxUnavailable。如果设置为 0,那么所有 Pod 都会同时被替换,导致服务在更新过程中出现短暂中断。正确的做法是设置一个合理的值,比如 1,这样在更新时会保留至少一个可用 Pod。例如:`maxUnavailable: 1`。这能确保服务在更新期间仍能提供基本功能。
十二 如果你用的是 Kustomize 来管理配置,可以在 kustomization.yaml 中添加 patches,这样可以在不修改原始文件的前提下完成配置变更。例如,使用 `patches` 来更新 image.tag,同时保留其他配置不变。这种方式适合多团队协作,避免直接改动主配置文件。
十三 在团队协同升级时,建议用 CI/CD 管道来自动化部署。比如 Jenkins 或 GitLab CI 可以配置流水线,在每次 commit 后触发测试和部署。如果用的是 Argo CD,可以设置 sync interval,比如 `interval: 5m`,这样可以确保配置不会突然变化。同时,建议在部署前添加 pre-check 任务,比如运行 helm test 或 kubectl get pods 确认当前状态。
十四 如果你发现某个服务在升级后行为异常,可以使用 `kubectl rollout history` 查看历史记录,再通过 `kubectl rollout undo` 回退。同时,建议在每次部署后记录日志,比如使用 `kubectl logs -f` 来查看 Pod 的运行状态。这样能帮助你更快定位问题。
十五 我见过很多人在滚动更新中遇到资源争抢的问题,特别是在多节点集群中。解决方法是合理设置 maxSurge 和 maxUnavailable,避免资源一次性被大量占用。比如在 Kubernetes 中,设置 `maxSurge: 1` 和 `maxUnavailable: 0`,这样可以确保更新过程中资源不会被耗尽。此外,还可以使用 Kubernetes 的 PriorityClassName 来控制 Pod 的调度优先级,避免低优先级的 Pod 占用过多资源。
建议收藏:滚动更新 集群搭建教程 | 团队协同升级
你要是真在做集群部署,滚动更新这件事绝对不能靠运气。我见过太多人搞不定,不是资源搞没,就是服务断了,最后连回滚都没法做。真实场景里,大家都会用 kubectl rollout 或者 helm 来控制,但关键是要把 upgrade 与 rollback 操作搞清楚。比如在 Kubernetes 里,升级前得确保 readinessProbe
DevOps实战AI5 次阅读
Related
延伸阅读

新手必看:自然语言编程工作流搭建 | 5分钟学会AI工具实战 · 2026-07-14

新手必看:Cassandra性能优化实战 | 9分钟学会数据库 · 2026-07-10

Codex多文件编辑怎么用:7个方法Codex智能 · 2026-07-10

12个VS Code settings.json团队规范,避坑必备VS Code指南 · 2026-07-10

避坑 | SkyWalking镜像仓库(7分钟读完)DevOps实战 · 2026-07-10

缓存设计:DynamoDB,建议收藏数据库 · 2026-07-10