Kubernetes StatefulSet滚动更新:如何先启新Pod再终止旧Pod?
StatefulSet 实现先启新Pod再停旧Pod的滚动更新
先澄清一个关键点:StatefulSet 默认的
RollingUpdate更新策略,本身就是先启动新Pod并等它就绪后,再终止对应旧Pod的逻辑,但这个逻辑只在通过更新StatefulSet模板(比如镜像、配置)触发滚动更新时生效——手动删除单个Pod的场景不算,手动删Pod时StatefulSet会直接重建(先删旧再启新),这是它对Pod的故障自愈机制,和滚动更新不是一回事。要实现你要的“旧Pod保持运行,新Pod就绪后再终止”,必须通过更新StatefulSet的方式触发滚动更新,而非手动删Pod,具体配置和操作如下:
- 确保StatefulSet的
updateStrategy配置为RollingUpdate(这是默认值,也可以显式声明):spec: updateStrategy: type: RollingUpdate rollingUpdate: partition: 0 # 默认值为0,代表所有Pod都会参与滚动更新;若设为N,则序号≥N的Pod会先被更新 - 触发更新时,直接修改StatefulSet的Pod模板内容,比如更新镜像:
这时StatefulSet会默认按照Pod序号从高到低的顺序,逐个创建新Pod,等新Pod进入kubectl set image statefulset/<你的STS名称> <容器名>=<新镜像>:<新版本>Ready状态后,才会删除对应的旧Pod,完全符合你的需求。
- 确保StatefulSet的
关于和Deployment的对比:StatefulSet的
RollingUpdate和Deployment的滚动更新逻辑核心一致,都是先启新再停旧,但因为StatefulSet的Pod有固定的网络标识和存储卷绑定,更新时会严格按序号串行处理(默认);而Deployment可以通过maxSurge和maxUnavailable控制并行更新的Pod数量。如果你想让StatefulSet并行更新,可将podManagementPolicy设为Parallel,这样会同时启动多个新Pod,等它们全部就绪后再批量终止旧Pod,适合支持并行更新的应用。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

