是的,您的容器基础结构需要某种类型的备用。Kubernetes和Docker不会在灾难后神奇地建立自己。讨论了在一个单独的文章,你不需要备份每个容器的运行状态,但你需要备份用于运行和管理您的容器配置。
下面是你需要备份的内容快速提醒。
配置和所希望的状态信息
- 该Dockerfiles用于构建您的图像和这些文件的所有版本
- 该图片从Dockerfile创建和使用运行每个容器
- Kubernetesetcd &其他- K8S数据库群集状态信息
- 部署 - YAML文件描述每个部署
由容器创建或更改的持久数据
- 持久卷
- 数据库
Dockerfiles
Docker容器是从图像运行的,而图像是从Dockerfiles构建的。一个合适的Docker配置应该首先使用诸如GitHub之类的存储库作为所有dockerfile的版本控制系统。不要使用从特别的Dockerfiles构建的特别的映像来创建特别的容器。所有的Dockerfile都应该存储在一个存储库中,这样你就可以在当前版本有问题的时候提取该Dockerfile的历史版本。
您还应该拥有某种存储库,在其中存储与每个K8s部署相关的YAML文件。这些文本文件可以从版本控制系统中获益。
这些库则需要进行备份。其中最流行的存储库是GitHub上,它提供了一个多种方式备份你的资料库。有多种使用提供的API来下载你的资料库的当前备份脚本。还有,你可以用它来备份GitHub上或任何存储库使用的是第三方的商业工具。
如果你没有按照上述建议,并运行基于图像的容器,你再也不用为Dockerfiles,您可以使用码头工人形象的历史命令或工具,如dfimage从当前图像创建Dockerfile。把那些Dockerfiles在仓库,并开始支持它!但是,说实话,不要在这种情况下得到的。存放和备份Dockerfiles和YAML文件用来创建您的环境。
码头工人的图片
用于运行容器当前图像也应该存储在库中。(当然,如果你在运行Kubernetes泊坞的图像,你已经这样做。)您可以使用一个私人回购协议,如码头工人登记,或公共回购像Dockerhub。云提供商还可以提供您的私人回购储存图像。那么回购的内容应进行备份。一个简单的谷歌搜索,如“Dockerhub备份”可以产生的期权数量惊人。
如果您没有用于运行容器的当前映像,则可以使用码头工人承诺命令。然后可以使用该映像创建Dockerfile码头工人形象的历史或工具dfimage。
Kubernetes etcd
Kubernetes etcd数据库非常重要,应该使用etcdctl快照保存数据库命令。这将创建文件snapshot.db在当前目录中。然后应该将该文件备份到外部存储。
如果您正在使用商业备份软件,您可以很容易地触发etcdctl快照保存命令,然后备份将创建快照.db的目录。这是将此备份集成到您的商业备份环境中的一种方法。看一看这次复苏的文档。
持久卷
容器可以通过多种方式访问用于存储或创建数据的持久存储。传统docker卷驻留在docker配置的子目录中。绑定挂载就是挂载在容器内的Docker主机上的任何目录(使用绑定挂载命令)。出于各种原因,Docker社区更喜欢使用传统卷,但为了备份传统卷和绑定挂载,两者本质上是相同的。您还可以将网络文件系统(NFS)目录或对象存储系统中的对象挂载为容器内的卷。
你用它来备份你的持久卷的方法将是在此基础上,你使用的容器上面的选项。然而,所有的人都会有同样的问题:如果数据发生了变化,你将需要处理,为了得到一个一致的备份。
一种方法是关闭使用该特定卷的任何容器。这是一个有点老派,但它是由容器的世界所带来的挑战之一,因为把一个备份代理容器的典型方法是不是一个真正的选择。一旦关机,音量可以备份。If it is a traditional Docker volume, you can back it up by mounting it to another container that won’t change its data while it’s backing up, and then creating a tar image of the volume in a bind-mounted volume that you then back up using whatever your backup system uses.
然而,这在Kubernetes是很难做到的。这就是为什么有状态信息最好存储在数据库中,而不是文件系统中。请在设计K8s基础架构时考虑这个问题。
另外,如果您使用绑定挂载的目录、nfs挂载的文件系统或对象存储系统作为持久存储系统,那么您可以使用任何备份该存储系统的最佳方式。这可以是复制后的快照,或者只是在该系统上运行您的商业备份软件。这些方法可能提供比相同卷的典型文件级备份更一致的备份。
数据库
当容器使用数据库来存储其数据的一个备份挑战。这些数据库需要的方式,将保证其完整性进行备份。根据不同的数据库上,上面可能会工作中提到的方法:关闭容器访问数据库,然后备份其中的文件存储的目录。然而,用这种方法所需的停机时间可能并不合适。
另一种方法是直接连接到数据库引擎本身,并要求它对一个文件运行备份,然后进行备份。如果数据库在容器内运行,则需要首先使用bind挂载来附加一个卷,以便它可以备份该卷,这样它的备份就可以存在于容器外。然后运行数据库使用的命令(例如mysqldump的)创建一个备份。然后确保备份它创建使用备份系统中的文件。
如果你不知道什么是什么容器使用的是什么存储或者什么数据库?一种解决方案是使用码头工人ps命令列出正在运行的容器,然后使用搬运工检查命令来显示每个容器的配置。有一节称为挂载,它将告诉您在何处挂载哪些卷。任何绑定挂载也将在您提交给Kubernetes的YAML文件中指定。
商业备份解决方案
有各种各样的商业备份解决方案,可以保护一些或所有上面提到的数据。下面是一个非常简单的总结:
- CommVault的虚拟服务器代理可以充当代理备份容器及其图像。
- 内聚性为K8s名称空间提供了数据保护
- Heptio(现在是VMware公司)提供Velero,备份设计K8S
- Contino、Datacore和Portworx提供为K8s和容器设计的存储,并支持备份这些信息
鉴于多种方式K8S和码头工人可以进行配置,这是很难覆盖所有的这单篇文章。但希望,这给了你一些思考,也可能帮助你认识到你的东西还没有被备份,但应该是。保证它的安全有!