Files
kuboard-press/learning/k8s-intermediate/workload/wl-deployment/rollback.md
huanqing.shao 1b69a42777 vssue
2019-09-22 21:56:32 +08:00

227 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 36
layout: LearningLayout
description: 本文描述了如何在 Kubernetes 中回滚 Deployment
---
# 回滚 Deployment
[返回 Deployment](./#deployment-概述)
某些情况下您可能想要回滚rollbackDeployment例如Deployment 不稳定可能是不断地崩溃。默认情况下kubernetes 将保存 Deployment 的所有更新rollout历史。您可以设定 revision history limit 来确定保存的历史版本数量。
::: tip
当且仅当 Deployment 的 `.spec.template` 字段被修改时例如您修改了容器的镜像kubernetes 将为其创建一个 Deployment revision版本。Deployment 的其他更新(例如:修改 `.spec.replicas` 字段)将不会创建新的 Deployment reviesion版本
:::
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 回滚 Deployment">
<h2>模拟更新错误</h2>
* 假设您在更新 Deployment 的时候,犯了一个拼写错误,将 `nginx:1.9.1` 写成了 `nginx:1.91`
``` sh
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
```
输出结果如下所示:
```
deployment.apps/nginx-deployment image updated
```
* 该更新将卡住,您可以执行命令 `kubectl rollout status deployment.v1.apps/nginx-deployment` 检查其状态,输出结果如下所示:
```
Waiting for rollout to finish: 1 out of 3 new replicas have been updated...
```
* 执行命令 `kubectl get rs` 您将看到两个旧的 ReplicaSetnginx-deployment-1564180365 and nginx-deployment-2035384211和一个新的 ReplicaSet (nginx-deployment-3066724191) 。如下所示:
```
NAME DESIRED CURRENT READY AGE
nginx-deployment-1564180365 3 3 3 25s
nginx-deployment-2035384211 0 0 0 36s
nginx-deployment-3066724191 1 1 0 6s
```
* 执行命令 `kubectl get pods`,您将看到 1 个由新 ReplicaSet 创建的 Pod 卡在抓取 image 的死循环里:
```
NAME READY STATUS RESTARTS AGE
nginx-deployment-1564180365-70iae 1/1 Running 0 25s
nginx-deployment-1564180365-jbqqo 1/1 Running 0 25s
nginx-deployment-1564180365-hysrc 1/1 Running 0 25s
nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s
```
::: tip
Deployment Controller 将自动停止有问题的更新rollout不会继续 scale up 新的 ReplicaSet。maxUnavailable 参数指定了最多会有几个 Pod 副本卡住,该参数的默认值是 25%。
:::
* 执行命令 `kubectl describe deployment` 查看 Deployment 的详情,输出结果如下所示:
```
Name: nginx-deployment
Namespace: default
CreationTimestamp: Tue, 15 Mar 2016 14:48:04 -0700
Labels: app=nginx
Selector: app=nginx
Replicas: 3 desired | 1 updated | 4 total | 3 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.91
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True ReplicaSetUpdated
OldReplicaSets: nginx-deployment-1564180365 (3/3 replicas created)
NewReplicaSet: nginx-deployment-3066724191 (1/1 replicas created)
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3
22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1
22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2
22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2
21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 1
21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3
13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0
13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 1
```
为了修复这个问题,您需要将其回滚到之前的一个稳定版本。
<h2>检查 Deployment 的更新历史</h2>
1. 执行命令 `kubectl rollout history deployment.v1.apps/nginx-deployment` 检查 Deployment 的历史版本,输出结果如下所示:
```
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true
2 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
3 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
```
**CHANGE-CAUSE** 是该 revision版本创建时从 Deployment 的 annotation `kubernetes.io/change-cause` 拷贝而来。
您可以通过如下方式制定 **CHANGE-CAUSE** 信息:
* 为 Deployment 增加注解,`kubectl annotate deployment.v1.apps/nginx-deployment kubernetes.io/change-cause="image updated to 1.9.1"`
* 执行 kubectl apply 命令时,增加 `--record` 选项
* 手动编辑 Deployment 的 `.metadata.annotation` 信息
2. 执行命令 `kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2`,查看 revision版本的详细信息输出结果如下所示
```
deployments "nginx-deployment" revision 2
Labels: app=nginx
pod-template-hash=1159050644
Annotations: kubernetes.io/change-cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
QoS Tier:
cpu: BestEffort
memory: BestEffort
Environment Variables: <none>
No volumes.
```
<h2>回滚到前一个 revision版本</h2>
下面的步骤可将 Deployment 从当前版本回滚到前一个版本version 2
1. 执行命令 `kubectl rollout undo deployment.v1.apps/nginx-deployment` 将当前版本回滚到前一个版本,输出结果如下所示:
```
deployment.apps/nginx-deployment
```
或者,您也可以使用 `--to-revision` 选项回滚到前面的某一个指定版本,执行如下命令:
```sh
kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2
```
输出结果如下:
```
deployment.apps/nginx-deployment
```
更详细的信息,请参考 [kubectl rollout](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#rollout)
此时Deployment 已经被回滚到前一个稳定版本。您可以看到 Deployment Controller 为该 Deployment 产生了 DeploymentRollback event。
2. 执行命令 `kubectl get deployment nginx-deployment`检查该回滚是否成功Deployment 是否按预期的运行,输出结果如下:
```
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 30m
```
3. 执行命令 `kubectl describe deployment nginx-deployment` 查看 Deployment 的详情,输出结果如下:
```
Name: nginx-deployment
Namespace: default
CreationTimestamp: Sun, 02 Sep 2018 18:17:55 -0500
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision=4
kubernetes.io/change-cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-c4747d96c (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set nginx-deployment-75675f5897 to 3
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 3
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 0
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-595696685f to 1
Normal DeploymentRollback 15s deployment-controller Rolled back deployment "nginx-deployment" to revision 2
Normal ScalingReplicaSet 15s deployment-controller Scaled down replica set nginx-deployment-595696685f to 0
```
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 回滚 Deployment">
正在撰写中
</el-tab-pane>
</el-tabs>
[返回 Deployment](./#deployment-概述)