如何備份Kubernetes和Docker
用戶不必備份容器中的所有內(nèi)容,但在發(fā)生災(zāi)難時備份運行和管理容器的配置是很重要的。
用戶的容器基礎(chǔ)設(shè)施需要某種類型的備份。Kubernetes和Docker在災(zāi)難之后不會自己構(gòu)建。用戶無需備份每個容器的運行狀態(tài),但是需要備份用于運行和管理容器的配置。
以下是用戶需要備份的內(nèi)容。
配置和所需狀態(tài)信息
- Dockerfile用于構(gòu)建鐿像以及這些文件的所有版本
- 從Dockerfile創(chuàng)建并用于運行每個容器的鏡像
- Kubernetes etcd和其他有關(guān)集群狀態(tài)的K8s數(shù)據(jù)庫
- Deployments用于描述每個部署的YAML文件
容器創(chuàng)建或更改的持久數(shù)據(jù)
- 持久卷
- 數(shù)據(jù)庫
Dockerfiles
Docker容器從鏡像運行,其鏡像從Dockerfiles構(gòu)建。正確的Docker配置將首先使用某種存儲庫(例如GitHub)作為所有Dockerfile的版本控制系統(tǒng)。不要使用從臨時Dockerfile構(gòu)建的臨時鏡像創(chuàng)建臨時容器。所有Dockerfile都應(yīng)存儲在存儲庫中,如果當前版本存在問題,該存儲庫將允許用戶提取這個Dockerfile的歷史版本。
用戶還應(yīng)該具有存儲與每個K8s部署關(guān)聯(lián)的YAML文件的某種存儲庫,這些是可以從版本控制系統(tǒng)中受益的文本文件。
然后需要備份這些存儲庫。GitHub是比較受歡迎的存儲庫之一,它提供了許多備份存儲庫的方法。有多種腳本使用提供的API來下載存儲庫的當前備份。用戶還可以使用第三方商業(yè)工具來備份GitHub或用戶正在使用的任何存儲庫。
如果沒有遵循上述建議,而是根據(jù)不再具有Dockerfile的鏡像運行容器,則可以使用Docker 鏡像歷史命令或dfimage之類的工具從當前鏡像創(chuàng)建Dockerfile。將這些Dockerfile放入存儲庫中,然后開始備份。但是不要陷入這種情況,應(yīng)該始終存儲和備份用于創(chuàng)建環(huán)境的Dockerfile和YAML文件。
Docker鏡像
用于運行容器的當前鏡像也應(yīng)存儲在存儲庫中(當然,如果用戶正在Kubernetes中運行Docker鏡像,那么已經(jīng)在這樣做了)。用戶可以使用私有存儲庫(例如Docker注冊表)或公共存儲庫(例如Dockerhub)。云計算提供商還可以為用戶提供私人存儲庫來存儲鏡像。然后應(yīng)備份該回購的內(nèi)容。諸如“Dockerhub備份”之類的簡單搜索就可以產(chǎn)生令人驚訝的眾多選擇。
如果用戶沒有用于運行容器的當前鏡像,則可以使用docker commit命令創(chuàng)建一個。然后,使用Docker鏡像歷史記錄或工具dfimage從該鏡像創(chuàng)建Dockerfile。
Kubernetes etcd
Kubernetes etcd數(shù)據(jù)庫非常重要,應(yīng)使用etcdctl snapshot save db命令進行備份。這將在當前目錄中創(chuàng)建文件snapshot.db。然后應(yīng)將該文件備份到外部存儲。
如果使用的是商業(yè)備份軟件,則可以在創(chuàng)建snapshot.db的目錄備份之前輕松觸發(fā)etcdctl snapshot save命令。這是將備份集成到商業(yè)備份環(huán)境中的一種方法。
持久卷
容器可以通過多種方式訪問持久性存儲,而持久性存儲可用于存儲或創(chuàng)建數(shù)據(jù)。傳統(tǒng)的Docker卷位于Docker配置的子目錄中。綁定掛載只是Docker主機上安裝在容器內(nèi)(使用bind mount命令)的任何目錄。出于多種原因,Docker社區(qū)首先選擇傳統(tǒng)卷,但出于備份目的,傳統(tǒng)卷和綁定安裝實質(zhì)上是相同的。用戶還可以將網(wǎng)絡(luò)文件系統(tǒng)(NFS)目錄或?qū)ο髲膶ο蟠鎯ο到y(tǒng)作為卷裝入容器中。
用于備份持久卷的方法將基于用于容器的上述選項。但是,它們都會有相同的問題:如果數(shù)據(jù)正在更改,則需要處理該問題才能獲得一致的備份。
一種方法是關(guān)閉使用該特定卷的任何容器。這種做法雖然有些過時,但這是容器世界所面臨的挑戰(zhàn)之一,因為在容器中放置備份代理的典型方法并不是一種很好的選擇。一旦關(guān)閉,便可以備份該卷。如果它是傳統(tǒng)的Docker卷,則可以通過將其掛載到另一個在備份時不會更改其數(shù)據(jù)的容器中進行備份,然后在綁定安裝的卷中創(chuàng)建該卷的tar鏡像,然后使用備份系統(tǒng)使用的任何方法進行備份。
但是,這在Kubernetes中確實很難做到。這是有狀態(tài)信息最好存儲在數(shù)據(jù)庫而不是文件系統(tǒng)中的原因之一。而在設(shè)計K8s基礎(chǔ)設(shè)施時,需要考慮此問題。
另外,如果用戶使用綁定安裝目錄、NFS安裝文件系統(tǒng)或?qū)ο蟠鎯ο到y(tǒng)作為持久性存儲系統(tǒng),則可以使用優(yōu)秀的方法來備份該存儲系統(tǒng)。這可能是快照,然后是復(fù)制,或者只是在該系統(tǒng)上運行商業(yè)備份軟件。與相同卷的典型文件級備份相比,這些方法可能提供更加一致的備份。
數(shù)據(jù)庫
下一個備份挑戰(zhàn)是容器使用數(shù)據(jù)庫存儲其數(shù)據(jù)。這些數(shù)據(jù)庫需要以保證其完整性的方式進行備份。根據(jù)數(shù)據(jù)庫的不同,上述方法可能會起作用:關(guān)閉訪問數(shù)據(jù)庫的容器,然后備份存儲其文件的目錄。但是,這種方法所需的停機時間可能不合適。
另一種方法是直接連接到數(shù)據(jù)庫引擎本身,并要求它運行到文件的備份,然后可以對其進行備份。如果數(shù)據(jù)庫在容器內(nèi)運行,則首先需要使用綁定安裝來附加一個可以備份的卷,因此其備份可以存在于容器外部。然后運行數(shù)據(jù)庫使用的命令(例如mysqldump)創(chuàng)建備份。然后確保使用備份系統(tǒng)創(chuàng)建的文件。
如果用戶不知道哪些容器正在使用什么樣的存儲或什么樣的數(shù)據(jù)庫怎么辦?一種解決方案可能是使用docker ps命令列出正在運行的容器,然后使用docker inspect命令顯示每個容器的配置。有一個名為“掛載”的部分,它將告訴用戶將哪些卷掛載在何處。任何綁定安裝也將在用戶提交給Kubernetes的YAML文件中指定。
商業(yè)備份解決方案
有各種各樣的商業(yè)備份解決方案可以保護上述部分或全部數(shù)據(jù)。以下是一個非常簡短的摘要:
- Commvault的虛擬服務(wù)器代理可以充當備份容器及其鏡像的代理。
- Cohenity為K8s命名空間提供數(shù)據(jù)保護。
- Heptio(現(xiàn)為VMware公司)提供為K8s設(shè)計的Velero備份。
- Contino、Datacore和Portworx提供專為K8和容器設(shè)計的存儲,并且還支持備份該信息。
鑒于K8和Docker的配置方式多種多樣,很難涵蓋所有內(nèi)容。但是希望提供一些思考的機會,或者可以幫助用戶備份一些應(yīng)該但尚未備份的東西。




























