越来越多的应用尝试使用容器平台部署。为防止数据的误操作(误删、误覆盖)也需要方便的备份恢复机制和异构存放。请问目前容器数据备份有哪些好的方案?备份整个容器?还是提取容器中的数据来备份?
收起容器的数据备份,其实就是有状态应用在k8s的备份问题(不包括容器的镜像),个人认为实际上已经不能把容器本身以及应用的数据分开来了。备份的时候,应该把应用以及应用相关的资源,如configmap,secret,pv,pvc,service,以及pv里面的数据,一起备份下来,并且拷贝或者上传到第二存储,同主存储隔离开来。
目前国外主流的产品有kasten的K10,Portworx PX backup,以及社区的开源项目velero。
这些产品的主流做法,就是把应用的资源以及数据打包,一起备份到S3对象存储,或者NFS等第二存储。其中,PV,PVC还可以抓取CSI快照,然后对快照进行备份,或者对快照进行有选择的数据导出。
之所以这样做,是因为在k8s容器时代,容器是一个动态变化的资源,例如正在运行在哪个node上、配置的参数、版本等等信息都可能是变化的。而最关键的数据,是靠PV,PVC这样的资源来描述的。换句话说,PV,PVC其实就记录了容器同应用数据的mapping关系。在备份的时候,如果容器跟底下使用的存储(如分布式存储)分开备份,这样可能带来几个问题:
总之,如果备份时候对容器和存储分开考虑,那还是基本沿用了虚机时代备份的思路,在容器时代要用的好可能有点困难。在备份的时候,把应用相关的资源一起打包备份,其实就是把资源跟数据的关系在同一个时间点一起备份下来,形成一个比较完整的可用的恢复点,将来恢复时候,也是根据应用的颗粒度来进行恢复的。