本文介绍: 当我们在生产环境发布应用时,必须要考虑当前系统还有用户正在使用的情况,所以尽量需要做到不停机发版。所以在发布过程中理论上之前的 v1 版本依然存在,必须得等待 v2 版本启动成功后再删除历史的 v1 版本。如果 v2 版本启动失败 v1 版本不会做任何操作,依然能对外提供服务滚动更新image.png这是我们预期中的发布流程,要在 kubernetes 使用功能也非常简单,只需要spec

b2712c9c9da737d828b1377af0070627.png



当我们在生产环境发布应用时,必须要考虑当前系统还有用户正在使用的情况,所以尽量需要做到不停机发版

所以在发布过程中理论上之前的 v1 版本依然存在,必须得等待 v2 版本启动成功后再删除历史的 v1 版本。

如果 v2 版本启动失败 v1 版本不会做任何操作,依然能对外提供服务

滚动更新

2b036a6343df695b6db026e1dfbd96dd.png

image.png

这是我们预期中的发布流程,要在 kubernetes 使用功能也非常简单,只需要spec配置相关策略即可

spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

这个配置的含义是:

这样一旦我们更新了 Pod镜像时,kubernetes 就会先创建一个新版本的 Pod 等待他启动成功后再逐步更新剩下的 Podb1bcfc8fd34d1b74e908b0425f004491.png

优雅停机

滚动升级过程中不可避免的又会碰到一个优雅停机的问题,毕竟是需要停掉老的 Pod

这时我们需要注意两种情况:

第一个问题如果我们使用的是 Go可以使用一个钩子来监听  kubernetes 发出的退出信号

quit := make(chaos.Signal)  
signal.Notify(quitsyscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGPIPE)  
go func() {  
    <-quit  
    log.Printf("quisignareceived, exit n")  
    os.Exit(0)  
}()

这里执行对应资源释放。

如果使用的是 spring boot 也有对应配置

server: 
 shutdown: "graceful"
spring: 
 lifecycle: 
  timeout-per-shutdown-phase: "20s"

应用收到退出信号后,spring boot 将不会再接收新的请求,并等待现有请求处理完毕。

kubernetes 也不会无限等待应用将 Pod 将任务执行完毕,我们可以在 Pod 中配置

terminationGracePeriodSeconds: 30

定义需要等待多长时间这里是超过 30s 之后就会强行 kill Pod。

具体值大家可以根据实际情况配置


spec:
  containers:
  - nameexample-container
    imageexample-image
    lifecycle:
      preStop:
        exec:
          command: ["sh", "-c", "sleep 10"]

同时我们也可以配置 preStop一个 sleep 来确保 kubernetes准备删除的 Pod 在 Iptable 中已经更新了之后再删除 Pod

这样可以避免第二种情况:已经删除Pod 依然还有请求路由过来。具体可以参考 spring boot 文档

https://docs.spring.io/spring-boot/docs/2.4.4/reference/htmlsingle/#clouddeployment-kubernetescontainer-lifecycle

回滚

回滚其实也可以看作是升级的一种,只是升级到了历史版本,在 kubernetes回滚应用非常简单。

回滚到上一个版本
 k rollout undo deployment/abc回滚指定版本
k rollout unddaemonset/abc --to-revision=3

同时 kubernetes 也能保证是滚动回滚的。

优雅重启

在之前的 如何优雅重启 kubernetes 的 Pod篇文章中写过,如果想要优雅重启 Pod 也可以使用 rollout 命令,它也也可以保证是滚动重启

k rollout restart deployment/nginx

使用 kubernetes 的滚动更新确实要比我们以往的传统运维简单许多,就几个命令的事情之前得写一些复杂运维脚本才能实现

本文的所有源码这里可以访问: 

https://github.com/crossoverJie/k8s-combat

PS:最近也在更新视频号,也会有一些技术干货,动动小手帮主播点播关注a26f2518b9a2e40ff404391fca4c4eb8.jpeg

cc9a81ad9bee9de40eb57ae1ecde6cca.jpeg

往期推荐

五分钟 k8s 实战-应用探针

升级到 Pulsar3.0 后深入了解 JWT 鉴权

五分钟k8s实战-Istio 网关

k8s-服务网格实战-配置 Mesh(灰度发布)

k8s-服务网格实战-入门Istio

f150e5993227f8afc5adfaf8a7471ec8.gif

分享

76fd0452f3410ee8b297bfbd0a3275a0.gif

收藏

f08525b022972fff1bca7d4808a695eb.gif

点赞

48355add49b6a1fcc60ae5c681db3494.gif

点在看

原文地址:https://blog.csdn.net/qq_18661793/article/details/134724719

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_28610.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注