Kubernetes-Deployment更新与回滚
1 Deployment介绍
1.1 相关术语
Pod:每个Pod是一个或一组紧密相关的容器,每个Pod就像是一个独立的逻辑机器,拥有自己的IP、主机名、进程等,运行一个独立的应用程序,是K8S调度的基本单位。
ReplicationController:简称RC,旨在创建和管理一个Pod的多个副本(replicas)。当Pod副本数少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。
ReplicaSet:是新一代的RC,其相比于RC,Pod选择器的表达能力更强,其选择器可匹配缺少某个标签或特定标签名的Pod。
Deployment:是一种更高阶的资源,用于部署应用程序并以声明的方式升级应用。当创建一个Deployment时,ReplicaSet资源会随之创建,ReplicaSet是新一代的ReplicationController,并推荐使用它替代ReplicationController来复制和管理Pod,在使用Deployment时,实际的Pod是由Deployment的ReplicaSet创建和管理的。
1.2 Deployment的使用机制
使用Deployment机制2 Deployment使用
2.1 Deployment生命周期
1、创建deployment
$ kubectl create -f xxx.yaml
2、查看当前运行的deployment
$ kubectl get deployment
3、更新deployment
$ kubectl edit deployment/deployment_name
4、删除deployment
$ kubectl delete deployment deployment_name
3 Deployment更新
3.1 更新策略
在Deployment中,可以通过spec.strategy指定Pod更新的策略,目前支持:Recreate(重建)和RollingUpdate(滚动更新),默认是RollingUpdate。
Recreate:设置spec.strategy.type=Recreate,更新方式为:Deployment在更新Pod时,会先杀掉所有正在运行的Pod,然后创建新的Pod。
RollingUpdate:设置spec.strategy.type=RollingUpdate,更新方式为:Deployment会以滚动的方式来渐变性的更新Pod,即Pod新版本的递增,旧版本的递减的一个过程。
3.2 滚动更新
3.2.1 概念
“滚动”,给人的是一种“圆”的印象,持续,不中断的意思,类似于“持续交付”的理念。RollingUpdate策略指一次仅更新一个Pod,并且逐个更新,而不是一次性将所有的服务都关闭,避免业务中断。
3.2.2 原理
滚动更新流程1)初始创建Deployment,系统创建了一个ReplicaSet,并按照用户的需求创建了3个Pod副本;
2)当更新Deployment时,系统创建一个新的ReplicaSet,并将其副本数量扩展到1,然后将旧的ReplicaSet缩减为2;
3)系统继续按照相同的更新策略对新旧两个ReplicaSet进行逐个调整。
4)最后,新的ReplicaSet运行了3个新版本的Pod副本,旧的ReplicaSet副本数量则缩减为0。
4 Deployment回滚
4.1 概念
回滚:通过滚动升级的策略可以平滑的升级Deployment,若升级出现问题,需要最快且最好的方式回退到上一次能够提供正常工作的版本。为此K8S提供了回滚机制。
revision:更新应用时,K8S都会记录当前的版次,即为revision,当升级出现问题时,可通过回滚到某个特定的revision,默认配置下,K8S只会保留最近的几个revision,可以通过Deployment配置文件中的spec.revisionHistoryLimit属性增加revision数量。
更新或回滚:每次更新或回滚时,revision都会自增1,回滚可以看作是一次更新,是一次更新为原版本的操作。
4.2 kubectl使用
1、查看修订版本记录
$ kubectl rollout history deployment deployment_name
2、查看某个历史记录的详细信息
$ kubectl rollout history deployment deployment_name --revision=2
其中--revision
表示指定修订版本;
3、回滚到上一个版本
$ kubectl rollout undo deployment deployment_name
4、回滚到指定版本
$ kubectl rollout undo deployment deployment_name --to-revision=2
其中,--to-revision
表示回滚到指定的修订版本。
4.3 API使用
POST
/apis/apps/v1beta1/namespaces/{namespace}/deployments/{name}/rollback
如:
curl -k -H 'Authorization: Bearer token_xxxx' -H 'Content-Type:application/json' -X POST -d '{
"kind": "DeploymentRollback",
"apiVersion": "extensions/v1beta1",
"name": "deployment_name",
"rollbackTo": {
"revision": 2
}
}' https://localhost:6443/apis/extensions/v1beta1/namespaces/default/deployments/deployment_name/rollback
其中:name和rollbackTo.revision为必须字段,name为资源名称,rollbackTo.revision为回退的版本,若要回退上一个版本,即为0。