如何使用Kubernetes的Rollbacks实现应用的回滚?
Kubernetes中的Rollback实现应用回滚
1 什么是Rollback
Rollback 是 Kubernetes 中应用更新出现问题时进行回滚的一套机制。它可以有效防止写错配置或者更新应用过程中产生的需要更新的时候导致的服务中断。通过这个功能可以方便的实现应用的变更和回滚,也能够大大提升了系统的稳定性,安全性和可靠性。
2 Rollback的原理
Rollback 是通过 Kubernetes 的 API controller 全自动的完成的,它主要使用的原理是在容器的资源更新操作中都存在记录和检查点。在每次更新容器资源的时候,API controller 会通过对比相关节点记录的旧版本和最新版本,来识别哪些信息发生了变化,然后针对有变化的资源,采取相应的操作,从而完成对有变化资源的更新或者回滚。
3 Rollback的使用
3.1 通过kubectl实现Rollback
通过kubectl可以实现Rollback功能,实现方式如下: 例如 f2e-order 服务使用了 deployment 的管理方式,可以通过 kubectl rollout undo 来完成回滚操作,具体操作如下:
$ kubectl get deployment f2e-order
NAME READY UP-TO-DATE AVAILABLE AGE
f2e-order 3/3 3 3 10m
$ kubectl rollout undo deployment.v1.apps/f2e-order
deployment.apps/f2e-order rolled back
$ kubectl get deployment f2e-order
NAME READY UP-TO-DATE AVAILABLE AGE
f2e-order 3/3 2 3 14m
3.2 通过使用 Kubectl 命令进行回滚
通过使用 kubectl rollout history 命令可以查看 deployment 的更新历史,当需要回滚一个不稳定的更新,并且已知更新版本号等信息,可以使用 kubectl rollout undo 命令进行回滚操作。
$ kubectl get deployment f2e-order -o yaml >f2e-order.yaml
3.3 删除k8s原有 deployment
$ kubectl delete deployment f2e-order
3.4 复原
$ kubectl apply -f f2e-order.yaml
3.5 回滚
$ kubectl rollout undo deployment.v1.apps/f2e-order --to-revision=2
3.6 通过 Operator 实现运行环境的 Rollback
Operator 是一个可以控制 Kubernetes 中 Deployment、StatefulSet、DaemonSet 等服务的一键部署和回滚的工具,可以通过 Operator 配置一系列的用于回滚的规约,实现环境的自动化管理和回滚功能。 例如通过 Operator 创建一个服务,可以实现自动化管理和回滚:
apiVersion: operators.coreos.com/v1alpha1
kind: Service
metadata:
name: f2e-order
accepted-resource-versions:
- v1
- v2
rollback-strategy:
use-max-revision: "2"
spec:
replicas: 3
template:
spec:
containers:
- name: f2e-order
image: gcr.io/f2e-order:v1
在这里使用了 v1,可以指定最大的 v2 进行回滚,因此在应用了新的 v2 后,可以通过 Service 内的 rollback-strategy 来指定回滚部署最大的 v2 就可以实现自动化的回滚操作。