kubernetes 每次更新资源会记录资源的历史版本, 方便我们进行回滚操作。真的 k8s 解决了很多运维的痛点问题, 想起来以前没有用 k8s 的时候,用 jenkins 和 ansible 来做的发布和回滚…

查看历史版本

1
2
3
4
5
6
7
8
kubectl rollout history deployment nfs-client-provisioner

deployment.apps/nfs-client-provisioner
REVISION CHANGE-CAUSE
1 <none>
2 <none>
4 <none>
5 <none>

这里列出的就是版本, 为什么没有 3, 因为从版本 4 回滚到了版本 3, 则版本 3 就变成了版本 5

查看指定版本详情

1
kubectl rollout history deployment nfs-client-provisioner --revision=4

也可以以 yaml 格式输出

1
kubectl rollout history deployment nfs-client-provisioner --revision=4 -o yaml

回滚到指定版本

1
kubectl rollout undo deployment nfs-client-provisioner --to-revision=4

回滚到上一个版本可以不用增加 --to-revision=4 参数, 默认就是回滚上一个版本

记录版本变化

执行命令记录变化

在第一步查看历史版本, CHANGE-CAUSE 显示的是 none, 如果需要记录 kubectl 执行的命令,则执行命令的时候需要添加参数

1
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true

这样就会把当前的命令记录到版本的 CHANGE-CAUSE 这一栏

设置历史版本数量

在 yml 文件里面可以设置历史版本的数量, 比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
revisionHistoryLimit: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80