Kubernetes 上是否運行數據庫,取決於哪些因素?

如今,越來越多的應用部署在 Kubernetes 上的容器中,因此 Kubernetes 也被稱爲「雲端的 Linux」。儘管在應用層(application layer)的容器化有了大量增長,但數據層(data layer)在容器化方面得到的關注並不多。這很正常,因爲容器化工作流本來就需要足夠的彈性,才能應對重啓、擴展、虛擬化和其他限制。所以處理數據庫的可持久化、對應用程序其他層的高可用性和數據庫的冗餘等方面,有非常具體的要求。這就使得數據庫在分佈式環境中運行起來很有挑戰性。

然而,數據層得到更多關注,是因爲很多開發者想要像處理 應用層技術棧一樣,處理數據層基礎架構。運維人員希望使用的同樣的工具來運維數據庫和應用程序,而且數據層和應用層能達到相同的收益:跨不同環境的快速啓動和可重複自動完成。在這篇文章中,我們將探討什麼時候,以及哪些類型的數據庫可以在 Kubernetes 上有效運行。

在深入探討 Kubernetes 上運行數據庫的注意事項之前,我們先簡單回顧一下 Google Cloud 平臺(GCP)上運行數據庫都有哪些選項,以及這些數據庫的最佳用法。

  • 完全託管的數據庫。包括 Cloud Spanner、Cloud Bigtable 和 Cloud SQL 等。這些都是低運維成本的選則,因爲 Google Cloud 會承擔很多日常維護的工作,如備份、補丁和擴展等。開發者或運維人員無需人爲干預,只要創建一個數據庫,構建自己的 APP,然後交給 Google Cloud 進行擴展。這也意味着你可能無法使用到自己想要的數據庫版本、擴展或某種類型的數據庫。

  • 在虛擬機上自行操作的數據庫。也可稱爲「全運維選項」,構建數據庫、擴展數據庫、管理可靠性、配置備份等通通需要自行設定。這雖然工程量巨大,但所有的功能和數據庫類型的選擇都在自己的掌握之中。

  • 在 Kubernetes 上運行的數據庫。在Kubernetes上運行數據庫更接近於全運維選項,但是可以從 Kubernetes 提供的自動化功能中,享受一些好處,以支持數據庫應用程序的運行。話雖如此,但需要記住的是,Pods(數據庫應用容器)是瞬時性的,所以數據庫應用重啓或故障切換的可能性較大。此外,由於容器化後增加了抽象功能,一些數據庫管理任務,如備份、縮放、調優等,都是不一樣的。

在 Kubernetes 上運行數據庫的技巧

如果選擇走 Kubernetes 路線,你需要思考運行哪些數據庫,以及當通盤考慮前文講到權衡時數據庫運行狀況。由於Pods至關重要,因此發生故障轉移事件的可能性,比傳統部署或完全託管的數據庫要高。如果這個數據庫內置支持分片(sharding)、故障選舉(failover election)和複製等設計(例如 ElasticSearch、Cassandra 或 MongoDB),那麼在 Kubernetes 上運行會更簡單。一些開源項目提供自定義資源和控制器,來幫助管理容器化的數據庫。

接下來,考慮數據庫在 應用 和業務的上下游中起到的作用。存儲更多臨時的和緩存層的數據庫更適合 Kubernetes。這種類型的數據層通常在應用中更有彈性,整體體驗更好。

最後,確保你瞭解數據庫中可用的複製模式。異步傳輸模式可能會出現數據丟失,因爲數據庫事務(transaction)可能會被提交到主要數據庫,而不會提交到次要數據庫。因此,一定要明確是否會產生數據丟失,以及在自己的應用程序中,有多少數據丟失是可以接受的。

在評估了以上這些方面後,你最終會得到一個類似於這樣的決策樹。

如何在 Kubernetes 上部署數據庫?

現在,讓我們深入瞭解一下如何使用 StatefulSets 在 Kubernetes 上部署數據庫。藉助StatefulSet,你的數據可以存儲在 Persistent Volume 上,將數據庫應用程序與持久化存儲解耦,因此當重新創建一個pod(如數據庫應用程序)時,所有的數據依然存在。此外,當在 StatefulSet 中重新創建一個 pod 時,它將保持相同的名稱,所以你會有一個一致的端點來連接。持久數據和一致的命名是 StatefulSets 最大的兩個特點。你可以查看 Kubernetes 文檔瞭解更多細節。

如果你要運行一個不完全適合 Kubernetes 承載的數據庫類型(如 MySQL 或PostgreSQL),可以考慮使用 Kubernetes Operators或包含其他改進特性的數據庫項目,使得數據庫適合容器化環境運行。Operator 會幫助你啓動這些數據庫,並執行數據庫維護任務,如備份和複製。特別是對於 MySQL 來說,可以參考 Oracle MySQL Operator 和 Crunchy Data for PostgreSQL。

Operator 藉助自定義資源和控制器,通過 Kubernetes API 來暴露 特定操作。例如,使用 Crunchy Data 執行備份,只需執行 pgo backup [cluster_name] 即可。要添加一個 Postgres 副本,使用 pgo scale cluster [cluster_name]。

還有一些其他項目你可能會感興趣,比如 PostgreSQL 的 Patroni。這些項目進一步用到了 Operator。它們圍繞着各自的數據庫構建了許多工具,從而可以在 Kubernetes 內部進行操作。可能包括的補充功能是,如分片、主從選舉,以及故障轉移功能,這些功能都是在 Kubernetes 中成功部署 MySQL 或 PostgreSQL 所需的。。

雖然在Kubernetes中運行數據庫獲得了越來越多的關注,但它遠不是一門精確的科學。在這個領域還有很多工作要做,隨着技術和工具的發展,在 Kubernetes 中運行數據庫將成爲常態。

如果你準備好了,可以訪問 GCP Marketplace,它提供了易於部署的 SaaS、虛擬機和容器化數據庫解決方案和 Operators,可以在任何地方部署到 GCP 或 Kubernetes 集羣。

原文鏈接

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