草庐IT

K8s 滚动升级与回退

云计算-Security 2023-06-11 原文


目录


前言

Rolling Update 即滚动更新,先更新一部分副本,成功后再继续更新更多副本,最终完成所有的副本更新。前面说到动态伸缩容并不会触发上线,仅当 Deployment Pod 模板(即 .spec.template)发生改变时才会触发上线。且上线实现了滚动特点,其好处就是无需停服的状态下即可完成服务升级,从而保证了业务的连续性。

接下来以更新 Nginx 容器镜像的版本号为例进行演示与验证。

一、升级

刚刚把副本数从 2 ——> 3,执行 kubectl apply -f nginx.yml 启动服务,可看到并没有触发上线/滚动更新:

接着修改镜像的版本号,从 1.20.0 ——> 1.21.4

再次启动服务,看看镜像版本是否已更新:

看看 Pod 是否正常运行:

小结:可看到,原来 ReplicaSet nginx-6b6cf7569 的三个 nginx:1.20.0 Pod已经被ReplicaSet nginx-7bfd89cc74的三个nginx:1.21.4 Pod替换了。

再来看看 deployment 的详情,看看具实现过程:

其流程就是:

  • ReplicaSet nginx-7bfd89cc74 新增一个 Pod,总数为 1;
  • ReplicaSet nginx-6b6cf7569 减少一个 Pod,总数为 2(也就是说至少还有两个 Pod 是正常对外提供服务的);
  • ReplicaSet nginx-7bfd89cc74 新增一个 Pod,总数为 2;
  • ReplicaSet nginx-6b6cf7569 减少一个 Pod,总数为 2(也就是说至少还有一个 Pod 是正常对外提供服务的);
  • ReplicaSet nginx-7bfd89cc74 新增一个 Pod,总数为 3;
  • ReplicaSet nginx-6b6cf7569 减少一个 Pod,总数为 0(此时 ReplicaSet nginx-6b6cf7569 已经没有 Pod 了)。

可看到,其更新方式是以滚动的形式实现的,从而保证了业务的连续性。

二、回滚

K8s 在每次 kubectl apply 更新应用时,都会记录当前的配置,比如我原本的 Nginx 镜像为 1.20.0,那这个 1.20.0 及其其他信息都会被记录下来,其目的就是方便我们上线失败后可以回到正常的那个镜像版本。

默认情况下,K8s 只会保留近 10 个的 revision,我们可以在 Deployment 配置文件中使用 revisionHistoryLimit 字段来指定 revision 的保留数量。

kubectl edit deployment nginx

看看可回滚的历史版本:

kubectl rollout history deployment nginx

虽然可看到有 2、3、4 这三个可会退的版本,但是 CHANGE-CAUSE 这个字段均为 <none>,这就不太利于我们进行版本会退,想要显示CHANGE-CAUSE 值,需要在 kubectl apply 时添加 --record 参数。所以这里重新在写两个 Deployment 的 YML 文件再来启动服务。

  • nginx-a.yml

  • nginx-b.yml

分别进行 kubectl apply 更新应用:

kubectl apply -f nginx-a.yml --record
kubectl apply -f nginx-b.yml --record

这样就能看到你是指定的哪个 YAML 文件启动的,但是这个 --record 已经被弃用了,除了这种方法之外,我们可以通过指定具体的 revision 编号来查看其详细信息,这样你就可以根据实际情况会退到具体版本,比如我们查看 revision 为 4 的版本信息。

kubectl rollout history deployment nginx --revision=4

版本会退验证:

  • 先看看当前的 Pod 的 image 版本

    kubectl get deployment nginx -o wide
    

  • 比如就回到我们 revision 为 4 的版本

    kubectl rollout undo deployment nginx --to-revision=4
    

  • 会退完成,再次验证当前 image 镜像

    kubectl get deployment nginx -o wide
    

    可看到版本会退成功!

以上就是 K8s Pod 版本升级/回滚的详细流程。


有关K8s 滚动升级与回退的更多相关文章

  1. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  4. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  5. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  6. ruby-on-rails - 从 Rails 2.3 升级到 Rails 4.0 - 2

    我们有一个目前在Rails2.3.12版和Ruby1.8.7版上运行的应用程序。我们想将我们的应用程序更新到Rails4.0和Ruby2.1.0。我们有大约200个模型和150个Controller。我想知道升级过程需要多大的努力。您还可以提供升级可以遵循的步骤。我们应该先升级Ruby然后再升级Rails还是相反? 最佳答案 您想要实现的目标将是史诗般的努力。我无法为您提供分步说明,因为不可能在一个答案中涵盖所有情况。我建议不要同时升级Ruby和Rails,而是分步升级。升级本身的复杂性是巨大的,但只要您的应用程序具有合理的测试覆盖

  7. ruby-on-rails - Rails 4.1.0.beta1 升级失败 - 2

    我最近尝试安装rails4.1.0.beta1,但是railss导致以下错误。[RVM]/gems/ruby-2.0.0-p247/gems/activesupport-4.1.0.beta1/lib/active_support/core_ext/module/aliasing.rb:32:in`alias_method':undefinedmethod`graft'forclass`ActiveRecord::Associations::JoinDependency'(NameError)[RVM]/gems/ruby-2.0.0-p247/gems/activesupport-4

  8. ruby-on-rails - ActionCable 无需升级到 Rails 5 beta - 2

    我目前有一个运行在4.2.5上的Rails应用程序,我想使用ActionCable而不必将整个应用程序升级到Rails5.0.0.beta3版本并冒破坏所有其他gem的风险。按照我在互联网上看到的指南,我已经尝试过gem'actioncable',github:'rails/actioncable'这不起作用,因为ActionCable存储库已合并到Rails存储库中。我什至试过gem'actioncable',github:'rails/rails'但这似乎不适用于ActionCable合并到Rails时发生的版本重新编号。(唯一低于5.0.0.beta*的版本是0.0.0,这似乎是

  9. ruby-on-rails - Rails 5 升级 :/actionpack-5. 0.0/lib/action_controller/test_case.rb:49:in `initialize':参数数量错误(0 代表 2)(ArgumentError) - 2

    我最近正在进行Rails5升级,当我尝试启动Rails控制台时遇到了这个错误:/actionpack-5.0.0/lib/action_controller/test_case.rb:49:ininitialize':wrongnumberofarguments(0for2)(ArgumentError)当前bundleupdaterails已经完成了gem依赖项的解决,足以更新到5.0.0,rspec正在运行(尽管我正在修复很多中断)。我也可以运行railss没有错误。这里是代码中断行:https://github.com/rails/rails/blob/master/action

  10. ruby-on-rails - 无法加载 lib 目录模块 - 未初始化的常量 - rails 2 到 rails 3 升级 - 2

    我目前正在将Railsv2中的应用程序迁移到v3在我的lib/我在子目录中有一些模块,例如,我有lib/search/host_search.rb有一个moduleHostSearchdefdo_search(args)#...endend然后我需要在名为Discovery::HostController的Controller中使用它defsearch_resultsoutput=HostSearch.do_search(:search_string=>@search_string,:page=>params[:page],:user=>@current_user)#...end但是我

随机推荐