文章目录
声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记
当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有
pod,然后下载新版本镜像并创建新的pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。
kubernetes提供了滚动升级功能来解决上述问题。
如果pod是通过Deployment创建的,则用户可以在运行时修改Deployment的
pod定义(spec.template)或镜像名称,并应用到Deployment对象上,系统即可完成Deployment的rollout动作,rollout可被视为Deployment的自动更新或者自动部署动作,如果在更新过程中发生了错误,则还可以通过回滚操作恢复pod的版本。
以nginx的deployment为例:
apiversion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
可以看到已运行的副本数有3个:

那么如果想升级nginx的版本为1.9.1,该如何操作呢?
可以通过kubectl set image命令为Deployment设置新的镜像名称:

另一种更新的方法是使用kubectl edit命令修改Deployment的配置,将 spec.template.spec.containers[0].image从nginx: 1.7.9更改为nginx:1.9.1:

镜像名(或pod定义)一旦发生了修改,则将触发系统完成Deployment所有运行pod的滚动升级操作。
可以使用kubectl rollout status命令查看Deployment的更新过程:

查看当前运行的pod,名称已经更新了:

查看pod使用的镜像,已经更新为Nginx:1.9.1了:

Deployment升级pod的流程如下:

我们可以使用kubectl describe deployments/nginx-deployment命令仔细观察
Deployment的更新过程:

运行kubectl get rs命令,查看两个ReplicaSet的最终状态:

在整个升级过程中,系统会保证至少有两个pod可用,并且最多同时运行4个
pod,这是Deployment通过复杂的算法完成的。
Deployment需要确保在整个更新 过程中只有一定数量的pod可能处于不可用状态。在默认情况下,Deployment确保可用的pod总数量至少为所需的副本数量(DESIRED)减1,也就是最多1个不可用(maxUnavailables=1)。
Deploymenti还需要确保在整个更新过程中pod的总数量不会超过所需的副本数量太多。在默认情况下,Deployment确保pod的总数量最多比所需的pod数量多1个,也就是最多1个浪涌值(maxSurge=-1)。
Kubernetes从1.6版本开始,maxUnavailable和maxSurgef的默认值将从1、1更新为 所需副本数量的25%、25%。这样,在升级过程中,Deployment就能够保证服务不中断,并且副本数量始终维持为用户指定的数量(DESIRED)。
如果在Deployment升级过程中出现意外,比如写错新镜像的名称、新镜像还没被放入镜像仓库里、新镜像的配置文件发生不兼容性改变、新镜像的启动参数不对,以及因可能更复杂的依赖关系而导致升级失败等,就需要回退到之前的旧版本,这时就可以用到Deploymentl的回滚功能了。
我们将Deployment回滚到之前的版本时,只有Deployment的pod模板部分会被修改,在默认情况下,所有Deployment的发布历史记录都被保留在系统中(可以配置历史记录数量),以便于我们随时进行回滚操作。
注意,在创建Deployment时使用-record参数,就可以在CHANGE-CAUSE列看到每个版本使用的命令了,如果需要查看特定版本的详细信息,则可以加上-revision-=<N>参数:

现在我们决定撤销本次发布并回滚到上一个部署版本:
kubectl rollout undo deployment/nginx-deployment
deployment "nginx-deployment" rolled back
这样,该Deployment就回滚到之前的稳定版本了,可以从Deployment的事件信息中查看到回滚到版本2的操作过程:

通过kubectl rollout pause命令暂停Deployment的更新操作:
kubectl rollout pause deployment/nginx-deployment
deployment "nginx-deployment" paused
然后修改Deployment的镜像信息:
kubectl set image deploy/nginx-deployment nginx=nginx:1.9.1
deployment "nginx-deployment"image updated
查看Deployment的历史记录,发现并没有触发新的Deployment部署操作:

最后,恢复这个Deployment的部署操作:
$ kubectl rollout resume deploy nginx-deployment
deployment "nginx-deployment"resumed
可以看到一个新的ReplicaSet被创建出来了:

目前DaemonSet的升级策略(updateStrategy)包括两种:
| 升级策略 | 描述 |
|---|---|
| OnDelete | DaemonSet的默认升级策略,与1.5及之前版本的Kubernetes保持一致。当使用OnDelete作为升级策略时,在创建好新的DaemonSeti配置之后,新的Pod并不会被自动创建,直到用户手动删除旧版本的Pod,才触发新建操作,即只有手工删除了DaemonSet创建的Pod副本,新的Pod 副本才会被创建出来。如果不设置updateStrategy的值,则在Kubernetes 1.6之后的版本中会被作为updateStrategyl的默认设置 |
| RollingUpdate | 从Kubernetes1.6版本开始引入。当使用RollingUpdate作为升级策略对DaemonSeti进行更新时,旧版本的Pod将被自动"杀 掉",然后自动创建新版本的DaemonSet Pod。整个过程与普通Deployment的滚动升级一样是可控的。不过有两点不同于普通Pod的滚动升级:一是目前Kubernetes还不支持查看和管理DaemonSetl的更新历史记录;二是DaemonSet的 回滚(Rollback)并不能如同Deployment一样直接通过kubectl rollback命令来实现,必须通过再次提交旧版本配置的方式实现 |
下面是DaemonSet采用RollingUpdate升级策略的YAML定义:
apiversion: apps/v1
kind: DaemonSet
metadata:
name: goldpinger
spec:
updatestrategy:
type: RollingUpdate
StatefulSet实现了RollingUpdate、OnDelete和Partitioned这几种策略,以保证StatefulSet中各Pod有序地、逐个地更新,并且能够保留更新历史,也能回滚到某个历史版本(如果用户未设置updateStrategy字段,则系统默认使用RollingUpdate策略):
| 策略 | 描述 |
|---|---|
| RollingUpdate | StatefulSet Controller会删除并创建StatefulSet:相关的每个Pod对象,其处理顺序与StatefulSet终止Pod的顺序一致,即从序号最大的Pod开始重建,每次更新一个Pod |
| OrderedReady | 可能在更新过程中发生一些意外,从而导致StatefulSet陷入奔溃状态,此时需要用户手动修 复 |
| OnDelete | StatefulSet Controller并不会自动更新StatefulSet中的Pod实例,而是需要用户手动删除这些Pod并触发StatefulSet Controller创建新的Pod实例来弥补,因此这其实是一种手动升级模式 |
| Partitioned | 在这种模式下, 用户指定一个序号,StatefulSet中序号大于等于此序号的Pod实例会全部被升级, 小于此序号的Pod实例则保留旧版本不变,即使这些Pod被删除、重建,也仍然保 持原来的旧版本。这种分区升级策略通常用于按计划分步骤的系统升级过程中。 |
本文主要讲解了pod的升级与回滚的相关概念与案例,希望能帮助到大家,谢谢大家的阅读,本文完!
尝试通过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
我在我的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服务器更新战俘
我实际上是在尝试使用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
我最近决定从我的系统中卸载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版本,并且我希望我的系统上只有一个版本。 最佳答案
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
我完全不是程序员,正在学习使用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
我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa