長期以來,我們一直在談論將工作負載遷移到云中,但是對許多IT組織的應用程序組合的觀察表明,仍有許多工作要做。在許多情況下,盡管云中的數據庫已經可用了多年,但在云中持久存儲和移動數據的挑戰仍然是阻礙云采用的主要限制因素。因此,最近對數據基礎結構的興趣激增,旨在充分利用云計算所提供的好處。一個云計算的本地數據庫是一個實現的可擴展性,彈性,可觀測性和自動化的目標,該K8ssandra項目就是一個很好的例子。它將ApacheCassandra和支持工具打包到可用于生產的Kubernetes部署中。
這就提出了一個有趣的問題:必須將在Kubernetes上運行的數據庫視為云原生數據庫嗎?雖然Kubernetes最初是為無狀態工作負載設計的,但Kubernetes的最新改進(例如StatefulSets和持久卷)也使運行有狀態工作負載成為可能。甚至對Kubernetes上運行數據庫持懷疑態度的長期DevOps從業人員也開始浮出水面,并且最佳實踐也開始浮出水面。
但是當然,勉強接受在Kubernetes上運行數據庫并不是我們的目標。如果我們不希望在云原生數據庫中尋求更大的成熟度,那么我們將錯過一個巨大的機會。為了使數據庫成為最“云原生”的數據庫,我們需要包含Kubernetes必須提供的所有內容。真正的云原生方法意味著采用Kubernetes設計范例的關鍵元素。云原生數據庫必須是可以在Kubernetes上有效運行的數據庫。讓我們探索一些指明方向的Kubernetes設計原則。
原則1:將計算,網絡和存儲作為商品API
云計算成功的關鍵之一是計算,網絡和存儲的商品化,這是我們可以通過簡單的API進行配置的資源。考慮以下AWS服務樣本:
·計算:我們通過EC2和自動伸縮組(ASG)分配虛擬機
·網絡:我們使用ElasticLoadBalancer(ELB),Route53和VPC對等管理流量
·存儲:我們使用諸如簡單存儲服務(S3)進行長期對象存儲或彈性塊存儲(EBS)卷之類的選項來持久化數據。
Kubernetes提供了自己的API來為世界范??圍內的容器化應用程序提供類似的服務:
·計算:容器,部署和副本集管理計算硬件上容器的調度和生命周期
·網絡:服務和入口公開了容器的網絡接口
·存儲:持久性卷和有狀態集可實現容器與存儲的靈活關聯
Kubernetes資源促進了Kubernetes發行版和服務提供商之間應用程序的可移植性。這對數據庫意味著什么?它們只是利用計算,網絡和存儲資源來提供數據持久性和檢索服務的應用程序:
·計算:數據庫需要足夠的處理能力來處理傳入的數據和查詢。每個數據庫節點均作為Pod部署并分組在StatefulSets中,從而使Kubernetes能夠管理橫向擴展和橫向擴展。
·網絡:數據庫需要公開用于數據和控制的接口。我們可以使用KubernetesServices和IngressControllers公開這些接口。
·存儲:數據庫使用指定存儲類的持久卷來存儲和檢索數據。
從數據庫的計算,網絡和存儲需求的角度考慮,消除了在Kubernetes上部署所涉及的許多復雜性。
原理2:將控制平面和數據平面分開
Kubernetes促進了控制平面和數據平面的分離。KubernetesAPI服務器是用于請求計算資源的關鍵數據平面接口,而控制平面則管理將這些請求映射到基礎IaaS平臺的細節。
原則3:簡化可觀察性
可觀察系統的三大支柱是日志記錄,指標和跟蹤。通過將每個容器的日志暴露給第三方日志聚合解決方案,Kubernetes提供了一個很好的起點。度量和跟蹤需要花費更多的精力來實現,但是有多種解決方案可用。
原則4:確保默認配置安全
Kubernetes網絡默認是安全的:必須顯式公開端口才能從外部訪問Pod。這為數據庫部署樹立了有用的先例,迫使我們仔細考慮如何公開每個控制平面和數據平面接口,以及應該通過KubernetesService公開哪些接口。
原則5:首選聲明式配置
在Kubernetes聲明性方法中,您可以指定所需的資源狀態,并且控制器可以操縱底層基礎結構以實現該狀態。Cass-operator允許您指定集群中所需的節點數,并管理放置新節點以按比例放大以及選擇要刪除的節點以按比例縮小的詳細信息。
關于為什么Kubernetes是運行云原生數據庫的最佳技術相信大家已經知曉了吧,想了解更多關于數據庫的信息,請繼續關注中培偉業。