如何在Kubernetes中不修改Deployment YAML实现Pod滚动重启?
无需修改YAML实现Kubernetes Pod滚动重启的方法
当然有不用碰Deployment YAML就能实现Pod滚动重启的办法!我日常运维里常用这几个方案,分享给你:
使用
kubectl rollout restart命令(最推荐)
这是Kubernetes 1.15及以后版本支持的原生命令,直接触发Deployment的滚动重启,完全不用修改任何配置文件。执行命令:kubectl rollout restart deployment/<你的Deployment名称>这个命令会偷偷给Deployment的Pod模板添加一个自动生成的重启标记,Kubernetes检测到模板变化后就会开始滚动重启所有Pod,全程是无停机的,和滚动更新的逻辑一致,非常省心。
通过
kubectl patch修改Pod模板的注解/环境变量
如果你的K8s版本比较老(低于1.15),可以用patch命令给Pod模板加个唯一的注解,触发滚动重启。比如:kubectl patch deployment/<你的Deployment名称> -p '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'$(date +%Y-%m-%dT%H:%M:%S)'"}}}}}'这里我们给Pod模板加了一个带当前时间的注解,Kubernetes会因为Pod模板的元数据变化,自动启动滚动更新流程,替换所有旧Pod。你也可以用类似的方式修改一个无关紧要的环境变量,效果是一样的,只是注解的方式更直观。
不推荐:缩容再扩容(有停机风险)
还有一种办法是先把Deployment的副本数缩到0,再扩回去:kubectl scale deployment/<你的Deployment名称> --replicas=0 kubectl scale deployment/<你的Deployment名称> --replicas=<原副本数>但这个方法有明显缺点:如果是多副本,缩容扩容过程中会有短暂的服务中断;如果是单副本,那服务会完全停机,所以除非万不得已,不建议用这个方法。
这些方法都不需要你手动编辑YAML文件,直接通过命令行就能完成滚动重启,而且前两种都是遵循滚动更新的无停机逻辑,能保证服务的可用性。
内容的提问来源于stack exchange,提问作者muratcavus




