You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动