阿里云ACK 在几个月前上线了 kubernetes (K8S) 应用备份-公测版,该功能是基于开源项目 Velero 开发的一款产品,用来对 K8S 集群中的应用和持久卷提供:
- 备份和恢复
- 容灾
- 迁移
本文通过示例的方式来了解该应用备份功能。
前提条件
- 通过工单申请开通应用备份公测版
- 创建ACK K8S集群
- 创建OSS bucket资源并授权ACK K8S 集群 OSS读写权限 用于应用备份
安装步骤
在容器服务-Kubernetes 下选择指定ACK集群
在左侧运维管理菜单中选择 应用备份(公测)
在页面 "安装组件",点击 开始安装 按钮,进行 Velero 组件安装;
安装成功后,右侧会显示如下应用备份管理界面
配置备份仓库
部署应用实例
使用经典的wordpress + mysql 有状态应用作为 应用备份的测试用例。
参考 https://github.com/jibutech/examples/blob/master/mysql-wordpress-pd/wordpress-mysql-acs-pvc.yaml 在ACS 集群中部署应用 kubectl apply -f https://raw.githubusercontent.com/jibutech/examples/master/mysql-wordpress-pd/wordpress-mysql-acs-pvc.yaml
在ACS console 选择 网络 -> 路由,创建 访问 wordpress 所需的 ingress 服务,如下
通过 ingress URL 安装 wordpress,并且创建一篇 blog 作为应用数据
备份
在 ACS console 应用备份界面, 选择备份并创建, 选择之前添加的 OSS 备份仓库,指定备份命名空间,此处为 wordpress
。
选择 开启 备份存储卷 来备份 wordpress 和 mysql 中的应用数据。 此处选择 restic 文件系统进行数据复制 (云盘快照测试失败)
创建完 备份请求后,等待备份状态变成 Completed
表示备份成功 (两次尝试后成功)
恢复
删除 wordpress 命名空间,模拟数据丢失场景
[root@k8smaster ~]# kubectl delete ns wordpress
namespace "wordpress" deleted
在 ACS console 应用备份界面,选择恢复,从备份列表选择已完成的备份名称,进行恢复
创建完 恢复请求后, 等待恢复状态变成 Completed
表示恢复成功 (此处示例中虽为PartiallyFailed,但实际应用和数据恢复成功)
访问之前的 ingress URL, 验证恢复的数据正确
体验感受
- 通过ACS console提供基于Velero的应用和数据备份 功能,简化了用户日常通过使用velero命令行的方式来备份和恢复数据。
- 目前该应用备份尚处于公测版本,从稳定性角度,仍然需要进一步提高来满足日常运维的需要。
- 当前版本只针对单个ACS 集群提供备份和恢复服务,尚未提供容灾和迁移功能。
问题
- snapshot 备份失败
- 从web 界面 删除 backup 失败
- 通过
kubectl -n velero delete backups.velero.io wordpress-backup
删除velero backup 资源后,backup 资源会重新创建
- 安装成功后,刷新 应用备份 页面,仍然提示 需要 安装组件
- 关闭页面,重新选择ACS 集群,选择运维管理,进入应用备份 页面
- 恢复完成,但恢复状态显示为
PartiallyFailed
问题调试
应用备份服务 在ACS K8S 环境中 安装 Velero 命令空间以及响应的 restic pods 来实现 K8S 中应用和存储卷的备份以及恢复功能。通过以下命令可以查看当前 velero 和备份/恢复资源
kubectl -n velero get backups.velero.io test-wp-backup -o yaml
kubectl -n velero get backupstoragelocations.velero.io
kubectl -n velero get restores.velero.io restore-wp -o yaml
kubectl -n velero logs velero-c4dbd9dc7-nlqfz velero > velero.log
更多调试方法,请参考 velero troubleshoot