Deployment
Deployment资源是一种更为高阶的资源,它通过创建ReplicaSet的资源的方式,接管匹配标签的Pods。
通常我们使用Deployment来部署应用程序,从而方便通过声明的方式升级应用,即通过Deployment可以更容易地更新应用程序,通过声明Deployment资源需要到达的状态,Kubernetes会帮我们达到最终需要的状态。
创建Deployment
如其他资源一样,可以通过编写YAML配置文件的格式创建Deployment资源。
下面介绍一个具体的Deployment的YAML配置文件:
然后可以使用kubectl apply -f
生成该资源。
通过kubectl get deployments
可以看到创建出来的Deployment资源的名字为httpd
,再通过kubectl get rs
可以看到创建出来的RS的名字为httpd-xxxxxx
,再通过kubectl get pods
可以看到创建的Pods的名字为httpd-xxxxxx-yyyy
(xxxxxxx和yyyy为自动生成的值)。
通过Deployment更新
通过Deployment进行滚动升级是声明式的,即只需要通过修改Deployment中的Pod模板,它会自动将集群中的状态收敛至该目标状态。
Deployment有两种更新策略,具体配置可以看上面的Deployment的YAML配置文件详情:
RollingUpdate
:默认策略,滚动升级,逐个删除旧Pod的同时创建新Pod;Recreate
:一次性删除所有旧Pod,然后创建新Pod;
更新过程
之前提到,Deployment首先创建ReplicaSet,再由ReplicaSet负责创建并接管Pod。
从上图中,可以将升级流程归纳为以下几步:
Deployment创建一个新的RS,负责创建并接管新的Pod,其与旧RS具有不同值的pod-template-hash标签;
逐步对旧RS缩容的同时,对新RS扩容,直至更新完毕。
在更新完毕后,会保存旧的RS,当使用Deployment进行回滚时,可以使用保存的旧的RS扩容旧的Pod的同时,使用新的RS缩容新的Pod。若Deployment接管的RS总数超过了
spec.revisionHistoryLimit
(默认为10),则删除保存时间最久的RS;
更新流程均由Deployment这个控制器完成,与kubectl客户端解耦;
用户不用关心创建或删除RS,对用户无感,Deployment的标签无需修改;
由于Deployment可以保存历史RS,所以可以方便应用回滚;
maxSurge和maxUnavailable
在RollingUpdate
这种滚动更新策略中,可以指定maxSurge和maxUnavailable两个属性。
maxSurge:定义除Deployment的
spec.replicas
个Pod外,最多能超过的Pod数量,默认值为25%,向上取整。例如,spec.replicas=4
,则maxSurge=4*25%=1
,也就是说当前的最多的Pod数不超过4+1=5个;maxUnavailable:定义了相对于Deployment的
spec.replicas
允许有多少Pod实例处于不可用状态,默认值为25%,向下取整。例如,spec.replicas=4
,则maxUnavailable=4*25%=1
,也就是说在滚动更新过程中,原本4个可用的Pod中,可以有一个被替换(若maxSurge计算得1,也就是Pod数不超过5,那么还可以再部署一个新的Pod,也就是同一时间可能有2个Pod不可用,3个Pod可用)。
下面举一个例子,更直观的观察滚动更新的流程,Deployment的spec.replicas=4
,maxSurge=25%
,maxUnavailable=25%
:
假设A=maxSurge,B=maxUnavailable,X=spec.replicas,那么可以得到下面的公式:
更新过程中,最少可用Pod数 = X - B;
每轮更新过程中,新RS可创建最大Pod数 = 旧RS可删除最大Pod数 = A + B;
使用rollout控制更新流程
观察升级过程
可以通过rollout status
观察Deployment资源对象的升级过程。例如,观察Deployment对象kubia的升级过程:
查看滚动升级历史
可以通过rollout history
查看Deployment资源对象的滚动升级历史。例如,观察Deployment对象kubia的滚动升级历史:
回滚升级
可以通过rollout undo
进行回滚,可以加上--to-revision
标志,指定回滚的确切版本。例如,针对Deployment对象进行回滚:
暂停和恢复升级流程
可以通过rollout pause
暂停Deployment资源对象的滚动升级流程,从而方便用户验证新的版本行为是否符合预期,即金丝雀版本(灰度),一部分为新版本,一部分为旧版本。例如,将Deployment对象kubia的滚动更新流程暂停:
恢复流程可以通过rollout resume
来实现。例如:
Last updated
Was this helpful?