1.滚动更新Rolling Update
滚动更新并不是一次全部更新,而是一次只更新一个,慢慢排队知道所有Pod更新完成。
滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新。滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性。
我们部署三副本应用,初始镜像为 httpd:2.2.31,然后将其更新到 httpd:2.2.32。
httpd:2.2.31 的配置文件如下:
通过 kubectl apply
部署。
部署过程如下:
- 创建 Deployment
httpd
- 创建 ReplicaSet
httpd-551879778
- 创建三个 Pod
- 当前镜像为
httpd:2.2.31
将配置文件中 httpd:2.2.31
替换为 httpd:2.2.32
,再次执行 kubectl apply
。
我们发现了如下变化:
- Deployment
httpd
的镜像更新为httpd:2.2.32
- 新创建了 ReplicaSet
httpd-1276601241
,镜像为httpd:2.2.32
,并且管理了三个新的 Pod。 - 之前的 ReplicaSet
httpd-551879778
里面已经没有任何 Pod。
结论是:ReplicaSet httpd-551879778
的三个 httpd:2.2.31
Pod 已经被 ReplicaSet httpd-1276601241
的三个 httpd:2.2.32
Pod 替换了。
具体过程可以通过 kubectl describe deployment httpd
查看。
每次只更新替换一个 Pod:
- ReplicaSet
httpd-1276601241
增加一个 Pod,总数为 1。 - ReplicaSet
httpd-551879778
减少一个 Pod,总数为 2。 - ReplicaSet
httpd-1276601241
增加一个 Pod,总数为 2。 - ReplicaSet
httpd-551879778
减少一个 Pod,总数为 1。 - ReplicaSet
httpd-1276601241
增加一个 Pod,总数为 3。 - ReplicaSet
httpd-551879778
减少一个 Pod,总数为 0。
2.版本回滚
kubectl apply
每次更新应用时 Kubernetes 都会记录下当前的配置,保存为一个 revision(版次),这样就可以回滚到某个特定 revision。
默认配置下,Kubernetes 只会保留最近的几个 revision,可以在 Deployment 配置文件中通过 revisionHistoryLimit
属性增加 revision 数量。
下面实践回滚功能。应用有如下三个配置文件 httpd.v1.yml
,httpd.v2.yml
和 httpd.v3.yml
,分别对应不同的 httpd 镜像 2.4.16
,2.4.17
和 2.4.18
:
通过 kubectl apply
部署并更新应用:
--record
的作用是将当前命令记录到 revision 记录中,这样我们就可以知道每个 revison 对应的是哪个配置文件。通过 kubectl rollout history deployment httpd
查看 revison 历史记录。历史记录是一1、2、3的,并没有具体的版本号,只是对应yaml文件名,可以不按版本号作为命名的一部分,这样可以方便观察。
CHANGE-CAUSE
就是 --record
的结果。如果要回滚到某个版本,比如 revision 1,可以执行命令 kubectl rollout undo deployment httpd --to-revision=1
:
此时,revison 历史记录也会发生相应变化。
revison 1 变成了 revison 4。不过我们可以通过 CHANGE-CAUSE
知道每个 revison 的具体含义。所以一定要在执行 kubectl apply
时加上 --record
参数。