# 工作负载升级与回退
创建工作负载后，CCE支持对其进行升级以及升级后回退操作。通过灵活的升级与回退机制，您可在不中断服务的情况下平滑切换至新版本，若升级过程中出现异常，也可快速恢复至此前的稳定状态。升级与回退机制适用于多种类型的工作负载，具体如下：
- 升级机制：适用于Deployment、StatefulSet类型工作负载。
- 回退机制：适用于Deployment类型工作负载。
#### 工作负载升级
对于Deployment、StatefulSet类型的工作负载，支持两种升级策略，以满足不同业务场景下的发布需求：
- RollingUpdate（默认）：表示滚动升级，即先启动新版本Pod并确认就绪后，再逐步终止旧版本Pod，从而保证服务持续可用。适用于需要零停机更新的场景。
- Recreate：表示替换升级，即先完全终止所有旧版本Pod，再一次性创建新版本Pod，会导致服务短暂中断。适用于开发测试环境、后台批处理任务或能够容忍停机更新的无状态应用。
您可以在创建工作负载时直接指定升级策略，具体步骤如下：
- [控制台方式]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称进入集群，在左侧导航栏选择"工作负载"，在右上角单击"创建工作负载"。
  
  3. 在"高级配置"的"升级策略"页签中，配置升级策略。滚动升级与替换升级公共参数含义一致。 
     图1工作负载升级策略   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002532783055.png "点击放大")
     
     
     表1工作负载升级策略 
     | 参数                                     | 说明                                                                                                                                                                                                                                                                                         | 限制                 |
     |:---|:---|:---|
     | 最大无效实例数（maxUnavailable）                | 表示在滚动更新过程中，允许处于不可用状态的最大实例数量或比例，即实际运行Pod数可低于期望副本数的最大允许范围，默认为25%。实际升级过程中，比例会换算为绝对数，并**向下取整**。 例如spec.replicas为2，默认状态下最多有2\*0.25=0个（向下取整）Pod失效，即实际运行Pod数不可低于期望副本数，系统中最少有2个Pod处于运行状态。换言之，在升级过程中，一直会有2个Pod处于运行状态，每次新建一个Pod，等这个Pod创建成功后再删掉一个旧Pod，直至Pod全部为新Pod。     | 仅Deployment支持配置。 |
     | 最大浪涌（maxSurge）                        | 表示在滚动更新过程中，允许超出期望副本数的最大实例数或比例，即决定可以同时创建多少个新Pod替换旧Pod，默认值为25%。实际升级过程中，比例会换算为绝对数，并**向上取整**。 例如spec.replicas为2，默认状态下最多同时创建2\*0.25=1个（向上取整）Pod，即系统中最多同时存在3个Pod。                                                                                                     | 仅Deployment支持配置。  |
     | 实例可用最短时间（minReadySeconds）            | 表示新创建的Pod在进入可用状态前，需持续保持就绪状态的最小时长。 该参数相当于引入了一个"稳定观察期"，可防止短暂就绪但不稳定的Pod过早参与服务，从而提升应用部署过程的稳定性和可靠性。                                                                                                                                                                   | -                 |
     | 最大保留版本数（revisionHistoryLimit）        | 表示在执行回退操作时，系统最多保留多少个旧版本的 ReplicaSet。这些旧ReplicaSet会占用etcd中的资源，并在执行kubectl get rs时显示在输出结果中。 每个Deployment的历史配置都会保存在对应的ReplicaSet中。因此，如果旧的ReplicaSet被删除，将无法回退至对应版本。系统默认保留最近的10个旧ReplicaSet，                                                                         | -                 |
     | 升级最大时长（progressDeadlineSeconds）       | 表示Deployment更新失败之前，允许的最长无进展时间，以秒为单位。如果指定，则此字段值需要大于minReadySeconds取值。 当Deployment在滚动更新过程中超过progressDeadlineSeconds且无进展时，其资源状态将反应为Type=Progressing、Status=False、Reason=ProgressDeadlineExceeded。这表示Deployment的更新被判定为失败，系统会记录相关事件，但不会自动回滚，需由用户手动干预或通过外部机制触发回退操作。 | 仅Deployment支持配置   |
     | 缩容时间窗（terminationGracePeriodSeconds） | 表示Pod在被删除时，Kubelet给容器预留的最大终止等待时间，默认为30秒。容器应在这段时间内优雅退出，否则系统将会发送SIGKILL的系统信号强制终止。                                                                                                                                                                                                             | -                 |
        
     
     
  
  4. 填写其他参数后，单击"创建工作负载"。等待一段时间后，工作负载状态将变为"运行中"。
   
- [kubectl命令行方式]
  以Deployment类型工作负载为例，展示如何配置工作负载升级策略。
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)，使用kubectl连接集群。
  
  2. 创建一个名为nginx-deployment.yaml的文件。其中，nginx-deployment.yaml为自定义名称，您可以随意命名。 
     ```
     vi nginx-deployment.yaml
     ```
     文件示例如下，关于Deployment配置的详细说明请参见[Kubernetes官方文档](https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/deployment-v1/)。
     ```
     apiVersion: apps/v1
     kind: Deployment  
     metadata:
       name: nginx   
       namespace: default  
     spec:
       replicas: 2   
       selector:
         matchLabels:   
           app: nginx
       template:  
         metadata:
           labels:  
             app: nginx
         spec:
           containers:
           - image: nginx:latest    
             imagePullPolicy: Always  
             name: nginx  
             resources:  
               requests:  
                 cpu: 250m
                 memory: 512Mi
               limits:  
                 cpu: 250m
                 memory: 512Mi
           imagePullSecrets:  
           - name: default-secret  
           terminationGracePeriodSeconds: 30
       strategy:
         type: RollingUpdate # 表示滚动升级，Recreate表示替换升级
         rollingUpdate: # 用于配置滚动升级参数
           maxUnavailable: 25%
           maxSurge: 25%
       minReadySeconds: 0
       revisionHistoryLimit: 10
       progressDeadlineSeconds: 600
     ```
     表2工作负载升级策略 
     | 参数                           | 说明                                                                                                                                                                                                                                                                                                                  | 限制     |
     |:---|:---|:---|
     | maxUnavailable               | 表示在滚动更新过程中，允许处于不可用状态的最大实例数量或比例，即实际运行Pod数可低于期望副本数的最大允许范围，默认为25%。实际升级过程中，比例会换算为绝对数，并**向下取整**。 例如spec.replicas为2，默认状态下最多有2\*0.25=0个（向下取整）Pod失效，即实际运行Pod数不可低于期望副本数，系统中最少有2个Pod处于运行状态。换言之，在升级过程中，一直会有2个Pod处于运行状态，每次新建一个Pod，等这个Pod创建成功后再删掉一个旧Pod，直至Pod全部为新Pod。     | 仅滚动升级支持配置 |
     | maxSurge                     | 表示在滚动更新过程中，允许超出期望副本数的最大实例数或比例，即决定可以同时创建多少个新Pod替换旧Pod，默认值为25%。实际升级过程中，比例会换算为绝对数，并**向上取整**。 例如spec.replicas为2，默认状态下最多同时创建2\*0.25=1个（向上取整）Pod，即系统中最多同时存在3个Pod。                                                                                                     | 仅滚动升级支持配置 |
     | minReadySeconds               | 表示新创建的Pod在进入可用状态前，需持续保持就绪状态的最小时长。 该参数相当于引入了一个"稳定观察期"，可防止短暂就绪但不稳定的Pod过早参与服务，从而提升应用部署过程的稳定性和可靠性。                                                                                                                                                                   | -      |
     | revisionHistoryLimit         | 表示在执行回退操作时，系统最多保留多少个旧版本的 ReplicaSet。这些旧ReplicaSet会占用etcd中的资源，并在执行kubectl get rs时显示在输出结果中。 每个Deployment的历史配置都会保存在对应的ReplicaSet中。因此，如果旧的ReplicaSet被删除，将无法回退至对应版本。系统默认保留最近的10个旧ReplicaSet，                                                                         | -         |
     | progressDeadlineSeconds      | 表示Deployment更新失败之前，允许的最长无进展时间，以秒为单位。如果指定，则此字段值需要大于minReadySeconds取值。 当Deployment在滚动更新过程中超过progressDeadlineSeconds且无进展时，其资源状态将反应为Type=Progressing、Status=False、Reason=ProgressDeadlineExceeded。这表示Deployment的更新被判定为失败，系统会记录相关事件，但不会自动回滚，需由用户手动干预或通过外部机制触发回退操作。 | -        |
     | terminationGracePeriodSeconds | 表示Pod在被删除时，Kubelet给容器预留的最大终止等待时间，默认为30秒。容器应在这段时间内优雅退出，否则系统将会发送SIGKILL的系统信号强制终止。                                                                                                                                                                                                                         | -        |
        
     
     
  
  3. 执行以下命令，创建Deployment。 
     ```
     kubectl create -f nginx-deployment.yaml
     ```
     回显如下表示已开始创建Deployment。
     ```
     deployment.apps/nginx created
     ```
     
     
  
  4. 执行以下命令，查看Deployment状态。 
     ```
     kubectl get deployment
     ```
     回显结果如下，则表示Deployment已创建成功。
     ```
     NAME           READY     UP-TO-DATE   AVAILABLE   AGE 
     nginx          2/2       2            2           4m5s
     ```
     
     
  
  5. 执行以下命令，将上述工作负载的镜像改为nginx:alpine。 
     ```
     kubectl edit deploy nginx
     ```
     请在spec.containers.image字段中修改镜像，修改完成后，保存并退出。
     
     
  
  6. 执行以下命令，查看上述工作负载的副本情况。 
     ```
     kubectl get rs
     ```
     回显结果如下：
     ```
     NAME               DESIRED   CURRENT   READY     AGE 
     nginx-6f9f58dffd   2         2         2         1m    # 新版本 ReplicaSet（活跃） 
     nginx-7f98958cdf   0         0         0         48m   # 旧版本 ReplicaSet（已停用）
     ```
     由于spec.replicas设置为2，且maxSurge和maxUnavailable均设置为25%，在实际升级过程中：
     - maxSurge = 1（2 × 25% = 0.5，向上取整为1）→ 最多允许新增1个额外Pod；
     
     - maxUnavailable = 0（2 × 25% = 0.5，向下取整为0）→ 不允许有不可用的Pod。
     
     
     因此，升级期间总Pod数最多为3个，且始终有2个可用Pod对外服务。CCE会采用"先创建新Pod、验证就绪后再删除旧Pod"的方式，逐个替换，直到全部升级完成。
     
     
  
  7. 待升级完成后，执行以下命令，查看Pod状态。 
     ```
     kubectl get pods
     ```
     回显结果如下，Pod的状态皆为Running，则说明升级成功。
     ```
     NAME                     READY     STATUS    RESTARTS   AGE
     nginx-6f9f58dffd-tdmqk   1/1       Running   0          1m
     nginx-6f9f58dffd-tesqr   1/1       Running   0          1m
     ```
     
     
   
#### 工作负载回退
回退也称为回滚，当发现升级出现问题时，可以采用回退的方式将Deployment类型工作负载回退至之前版本。Deployment支持回滚，是因为每次升级都会保留旧版本的ReplicaSet。回滚操作本质上是重新启用旧ReplicaSet来替换当前版本，可通过revisionHistoryLimit控制最多保留的历史版本数量（默认10个）。
- [控制台方式]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称进入集群，在左侧导航栏选择"工作负载"，在右侧选择工作负载类型。
  
  3. 在右侧对应工作负载的操作列单击"更多 \> 回退"。 
     图2回退操作   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002532863097.png "点击放大")
     
     
     
   
- [kubectl命令行方式]
  您可以通过以下命令进行回退操作：
  ```
  kubectl rollout undo deployment nginx
  ```
  回显结果如下，则说明回退成功。
  ```
  deployment.apps/nginx rolled back
  ```
#### 相关文档
- [创建工作负载](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0673.html)：了解工作负载的更多参数。
- [管理工作负载](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0007.html)：工作负载创建后，您可以对其执行升级、编辑YAML、查看日志等操作。
- 如果工作负载创建失败，请参考[工作负载异常问题排查](https://support.huaweicloud.com/cce-autopilot_faq/cce_13_0016.html)进行处理。
 
