什么是回滚操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是回滚操作相关的知识,希望对你有一定的参考价值。

安装软件失败时,出现回滚。这是怎么回事?怎样解决?

是对没有提交的事务而又写入数据文件而言的,把没有提交的数据进行回滚。如果回滚段不存在没有提交的数据则会根据redo log的内容在前滚阶段生成回滚段。 参考技术A   概念
  回滚指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。回滚包括程序回滚和数据回滚等类型。
  定义
  删除由一个或多个部分完成的事务执行的更新。为保证应用程序、数据库或系统错误后还原数据库的完整性,需要使用回滚。
  回滚泛指程序更新失败, 返回上一次正确状态的行为。
  回滚对程序员意味着非常严重的失误。所以回滚次数往往与程序员的薪金直接联系。主流互联网公司通常都将回滚定位为最严重的事故。
  回滚与恢复有本质的区别。

再战 k8s:deployment

文章目录

Deployment

一、什么是Deployment?

用于部署无状态的服务,这个最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如configserver、zuul、springboot。他可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。
用于部署无状态的服务!!!

二、 创建一个Deployment

2.1、手动创建

[root@k8s-master01 ~]# kubectl create deployment nginx --image=nginx:1.15.2
deployment.apps/nginx created

2.2、使用文件创建

# 查看手动创建的nginx的yaml文件,然后把f开头的删了,且删了最后的status标签的内容,得到下面的yaml文件
[root@k8s-master01 ~]# kubectl  get deployment nginx -o yaml > nginx-deploy.yaml
cat > nginx-deploy.yaml << EFO
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2020-12-22T00:07:49Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
  resourceVersion: "73782"
  uid: 6186f4c7-50bc-45d0-9ed4-916b311802eb
spec:
  progressDeadlineSeconds: 600
  replicas: 1               # 副本数
  revisionHistoryLimit: 10  # 历史记录保留的个数
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.2
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: 
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: 
      terminationGracePeriodSeconds: 30
EFO
# 使用以下命令去新建一个deployment
[root@k8s-master01 ~]# kubectl replace -f nginx-deploy.yaml 
deployment.apps/nginx replaced

# 在线更改yaml,管理deployment    ---把副本数改为2
[root@k8s-master01 ~]# kubectl edit deploy  nginx 

# 查看是否生成2个副本
[root@k8s-master01 ~]# kubectl get po
NAME                     READY   STATUS             RESTARTS   AGE
nginx-66bbc9fdc5-c6l6t   1/1     Running            0          57s
nginx-66bbc9fdc5-hsv4d   1/1     Running  		    0          34m

2.3、状态解析

[root@k8s-master01 ~]# kubectl get deploy -owide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx   2/2     2            1           35m   nginx        nginx:1.15.2   app=nginx

 NAME: Deployment名称
 READY:Pod的状态,已经Ready的个数
 UP-TO-DATE:已经达到期望状态的被更新的副本数
 AVAILABLE:已经可以用的副本数
 AGE:显示应用程序运行的时间
 CONTAINERS:容器名称
 IMAGES:容器的镜像
 SELECTOR:管理的Pod的标签

三、Deployment的更新

3.1、更改deployment的镜像并记录

[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.15.3 --record
deployment.apps/nginx image updated

3.2、查看更新过程

[root@k8s-master01 ~]# kubectl rollout status deploy nginx
Waiting for deployment "nginx" rollout to finish: 1 out of 3 new replicas have been updated...

# 或者使用describe查看
[root@k8s-master01 ~]# kubectl describe deploy nginx 

四、Deployment的回滚

4.1、回滚到上一个版本(一般都是回滚到上一个版本)

# 例如错误的更新到了一个xxx版本
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:xxx --record   
deployment.apps/nginx image updated

# 查看kubectl更新的历史命令
[root@k8s-master01 ~]# kubectl rollout history deploy nginx 
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
3         kubectl set image deploy nginx nginx=nginx:xxx --record=true

# 回滚到上一个版本
[root@k8s-master01 ~]# kubectl rollout undo deploy nginx
deployment.apps/nginx rolled back

4.2、回滚到指定版本(较少,但是得掌握)

# 多次更新错误版本
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:aa --record
deployment.apps/nginx image updated
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:bb --record
deployment.apps/nginx image updated
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:cc --record
deployment.apps/nginx image updated

# 查看kubectl更新的历史命令
[root@k8s-master01 ~]# kubectl rollout history deploy nginx 
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
1         <none>
3         kubectl set image deploy nginx nginx=nginx:xxx --record=true
4         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
5         kubectl set image deploy nginx nginx=nginx:aa --record=true
6         kubectl set image deploy nginx nginx=nginx:bb --record=true
7         kubectl set image deploy nginx nginx=nginx:cc --record=true

# 查看指定版本的详细信息 ---看revision对应的数字即可
[root@k8s-master01 ~]# kubectl rollout history deploy nginx --revision=4
deployment.apps/nginx with revision #4
Pod Template:
  Labels:       app=nginx
        pod-template-hash=5dfc8689c6
  Annotations:  kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
  Containers:
   nginx:
    Image:      nginx:1.15.3
    Port:       <none>
    Host Port:  <none>
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>
  
# 回滚到指定版本
[root@k8s-master01 ~]# kubectl rollout undo deploy nginx --to-revision=4
deployment.apps/nginx rolled back

五、Deployment的扩容与缩容

5.1、Deployment的扩容

# Deployment的扩容与缩容,不会生成新的rs
[root@k8s-master01 ~]# kubectl  scale  --replicas=4  deploy nginx 
deployment.apps/nginx scaled

# --replicas  # 指定副本数
# nginx  	  # pod的名字

# 查看rs
[root@k8s-master01 ~]# kubectl get rs

5.2、Deployment的缩容

# Deployment的扩容与缩容,不会生成新的rs
[root@k8s-master01 ~]# kubectl  scale  --replicas=1  deploy nginx
deployment.apps/nginx scaled

# --replicas  # 指定副本数
# nginx  	  # pod的名字

# 查看rs
[root@k8s-master01 ~]# kubectl get rs

六、Deployment的暂停和恢复

  • deployment可以在线edit更改(可以一次性更改多个)
  • 也可以用kubectl set image更改(也可以一次性更改多个,但是需要使用到Deployment的暂停和恢复功能)

6.1、Deployment 暂停功能

# 暂停
[root@k8s-master01 ~]# kubectl rollout pause deployment nginx
deployment.apps/nginx paused

# 第一次更新
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.15.4 --record
deployment.apps/nginx image updated

# 第二次更新、添加内存、CPU
[root@k8s-master01 ~]# kubectl set resources deploy nginx -c nginx --limits=cpu=200m,memory=128Mi --requests=cpu=10m,memory=16Mi
deployment.apps/nginx resource requirements updated

# 查看被更改以后的nginx镜像的deployment
[root@k8s-master01 ~]# kubectl get deploy nginx -oyaml

6.2、Deployment 恢复功能

# 更新完想更新的内容后,然后恢复镜像
[root@k8s-master01 ~]# kubectl rollout resume deploy nginx 
deployment.apps/nginx resumed

# 查看rs,看到有新的
[root@k8s-master01 ~]# kubectl get rs
NAME                DESIRED   CURRENT   READY   AGE
nginx-5b6bc78b67    1         1         0       41s

七、Deployment注意事项

.spec.revisionHistoryLimit:设置保留RS旧的revision的个数,设置为0的话,不保留历史数据

.spec.minReadySeconds:可选参数,指定新创建的Pod在没有任何容器崩溃的情况下视为Ready最小的秒数,默认为0,即一旦被创建就视为可用。

滚动更新的策略:
	.spec.strategy.type:更新deployment的方式,默认是RollingUpdate
		RollingUpdate:滚动更新,可以指定maxSurge和maxUnavailable
			maxUnavailable:指定在回滚或更新时最大不可用的Pod的数量,可选字段,默认25%,可以设置成数字或百分比,如果该值为0,那么maxSurge就不能0
			maxSurge:可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果该值为0,那么maxUnavailable不能为0
		Recreate:重建,先删除旧的Pod,在创建新的Pod

以上是关于什么是回滚操作的主要内容,如果未能解决你的问题,请参考以下文章

@transactional 回滚以后方法执行吗

Hadoop升级和回滚

在不自动提交的情况下,回滚段有啥用。

安装VS2008过程中取消了安装,在回滚过程中强制关闭了该程序

@tranactional回滚只能限于一个方法内吗

Oracle中的回滚?