備份Kubernetes和Docker方法

用戶不必備份容器中的所有內容,但在發生災難時備份運行和管理容器的配置是很重要的。用戶的容器基礎設施需要某種類型的備份。Kubernetes和Docker在災難之後不會自己構建。用戶無需備份每個容器的運行狀態,但是需要備份用於運行和管理容器的配置。

用戶的容器基礎設施需要某種類型的備份。Kubernetes和Docker在災難之後不會自己構建。用戶無需備份每個容器的運行狀態,但是需要備份用於運行和管理容器的配置。

以下是用戶需要備份的內容。

配置和所需狀態信息

  • Dockerfile用於構建鐿像以及這些文件的所有版本
  • 從Dockerfile創建並用於運行每個容器的鏡像
  • Kubernetes etcd和其他有關集羣狀態的K8s數據庫
  • Deployments用於描述每個部署的YAML文件

容器創建或更改的持久數據

  • 持久卷
  • 數據庫

Dockerfiles

Docker容器從鏡像運行,其鏡像從Dockerfiles構建。正確的Docker配置將首先使用某種存儲庫(例如GitHub)作爲所有Dockerfile的版本控制系統。不要使用從臨時Dockerfile構建的臨時鏡像創建臨時容器。所有Dockerfile都應存儲在存儲庫中,如果當前版本存在問題,該存儲庫將允許用戶提取這個Dockerfile的歷史版本。

用戶還應該具有存儲與每個K8s部署關聯的YAML文件的某種存儲庫,這些是可以從版本控制系統中受益的文本文件。

然後需要備份這些存儲庫。GitHub是比較受歡迎的存儲庫之一,它提供了許多備份存儲庫的方法。有多種腳本使用提供的API來下載存儲庫的當前備份。用戶還可以使用第三方商業工具來備份GitHub或用戶正在使用的任何存儲庫。

如果沒有遵循上述建議,而是根據不再具有Dockerfile的鏡像運行容器,則可以使用Docker 鏡像歷史命令或dfimage之類的工具從當前鏡像創建Dockerfile。將這些Dockerfile放入存儲庫中,然後開始備份。但是不要陷入這種情況,應該始終存儲和備份用於創建環境的Dockerfile和YAML文件。

Docker鏡像

用於運行容器的當前鏡像也應存儲在存儲庫中(當然,如果用戶正在Kubernetes中運行Docker鏡像,那麼已經在這樣做了)。用戶可以使用私有存儲庫(例如Docker註冊表)或公共存儲庫(例如Dockerhub)。雲計算提供商還可以爲用戶提供私人存儲庫來存儲鏡像。然後應備份該回購的內容。諸如“Dockerhub備份”之類的簡單搜索就可以產生令人驚訝的衆多選擇。

如果用戶沒有用於運行容器的當前鏡像,則可以使用docker commit命令創建一個。然後,使用Docker鏡像歷史記錄或工具dfimage從該鏡像創建Dockerfile。

Kubernetes etcd

Kubernetes etcd數據庫非常重要,應使用etcdctl snapshot save db命令進行備份。這將在當前目錄中創建文件snapshot.db。然後應將該文件備份到外部存儲。

如果使用的是商業備份軟件,則可以在創建snapshot.db的目錄備份之前輕鬆觸發etcdctl snapshot save命令。這是將備份集成到商業備份環境中的一種方法。

持久卷

容器可以通過多種方式訪問​​持久性存儲,而持久性存儲可用於存儲或創建數據。傳統的Docker卷位於Docker配置的子目錄中。綁定掛載只是Docker主機上安裝在容器內(使用bind mount命令)的任何目錄。出於多種原因,Docker社區首先選擇傳統卷,但出於備份目的,傳統卷和綁定安裝實質上是相同的。用戶還可以將網絡文件系統(NFS)目錄或對象從對象存儲系統作爲卷裝入容器中。

用於備份持久卷的方法將基於用於容器的上述選項。但是,它們都會有相同的問題:如果數據正在更改,則需要處理該問題才能獲得一致的備份。

一種方法是關閉使用該特定卷的任何容器。這種做法雖然有些過時,但這是容器世界所面臨的挑戰之一,因爲在容器中放置備份代理的典型方法並不是一種很好的選擇。一旦關閉,便可以備份該卷。如果它是傳統的Docker卷,則可以通過將其掛載到另一個在備份時不會更改其數據的容器中進行備份,然後在綁定安裝的卷中創建該卷的tar鏡像,然後使用備份系統使用的任何方法進行備份。

但是,這在Kubernetes中確實很難做到。這是有狀態信息最好存儲在數據庫而不是文件系統中的原因之一。而在設計K8s基礎設施時,需要考慮此問題。

另外,如果用戶使用綁定安裝目錄、NFS安裝文件系統或對象存儲系統作爲持久性存儲系統,則可以使用優秀的方法來備份該存儲系統。這可能是快照,然後是複製,或者只是在該系統上運行商業備份軟件。與相同卷的典型文件級備份相比,這些方法可能提供更加一致的備份。

數據庫

下一個備份挑戰是容器使用數據庫存儲其數據。這些數據庫需要以保證其完整性的方式進行備份。根據數據庫的不同,上述方法可能會起作用:關閉訪問數據庫的容器,然後備份存儲其文件的目錄。但是,這種方法所需的停機時間可能不合適。

另一種方法是直接連接到數據庫引擎本身,並要求它運行到文件的備份,然後可以對其進行備份。如果數據庫在容器內運行,則首先需要使用綁定安裝來附加一個可以備份的卷,因此其備份可以存在於容器外部。然後運行數據庫使用的命令(例如mysqldump)創建備份。然後確保使用備份系統創建的文件。

如果用戶不知道哪些容器正在使用什麼樣的存儲或什麼樣的數據庫怎麼辦?一種解決方案可能是使用docker ps命令列出正在運行的容器,然後使用docker inspect命令顯示每個容器的配置。有一個名爲“掛載”的部分,它將告訴用戶將哪些卷掛載在何處。任何綁定安裝也將在用戶提交給Kubernetes的YAML文件中指定。

商業備份解決方案

有各種各樣的商業備份解決方案可以保護上述部分或全部數據。以下是一個非常簡短的摘要:

  • Commvault的虛擬服務器代理可以充當備份容器及其鏡像的代理。
  • Cohenity爲K8s命名空間提供數據保護。
  • Heptio(現爲VMware公司)提供爲K8s設計的Velero備份。
  • Contino、Datacore和Portworx提供專爲K8和容器設計的存儲,並且還支持備份該信息。

鑑於K8和Docker的配置方式多種多樣,很難涵蓋所有內容。但是希望提供一些思考的機會,或者可以幫助用戶備份一些應該但尚未備份的東西。

本文地址:https://www.linuxprobe.com/kubernetes-docker.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章