共計(jì) 2647 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
今天就跟大家聊聊有關(guān) Kubernetes 中怎么運(yùn)行數(shù)據(jù)庫服務(wù),可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1. 為何在 Kubernetes 上部署有狀態(tài)應(yīng)用比較困難?
我們能不能在 Pod 模板上附加一個(gè)卷? 這難道還不夠嗎? 從理論上講,你的應(yīng)用現(xiàn)在就可以寫入磁盤,但如果容器重啟或移動到另一個(gè)節(jié)點(diǎn)的話,那么這個(gè)卷將會被重新附加到容器的新位置。
對于簡單的案例來說,確實(shí)如此。但是對于 Elasticsearch、etcd、Consul 等服務(wù)來說,情況就要復(fù)雜得多了。
這些服務(wù)有一些常規(guī) Kubernetes 部署控制器無法滿足的要求。
例如,你可能需要為每個(gè) Pod 提供可預(yù)測的 DNS 名稱,以便使初始集群形成更加容易?;蛘?,你部署的系統(tǒng),可能需要確保 Pod 將按某種預(yù)定義的順序來啟動容器。
此外,你還可能希望為每個(gè) Pod 創(chuàng)建并附加單獨(dú)的卷,這些卷將在整個(gè) Pod 的生命周期中與其綁定。對于常規(guī) Pod,你只能附加一個(gè)卷,這個(gè)卷將在同一部署創(chuàng)建的所有 Pod 之間共享。
我們也沒有提到如何操作數(shù)據(jù)庫。你還需要確保制定一個(gè)計(jì)劃,確定何時(shí)以及如何執(zhí)行備份,或者在發(fā)生錯(cuò)誤時(shí)如何執(zhí)行恢復(fù) / 故障轉(zhuǎn)移。
2. 運(yùn)行有狀態(tài)應(yīng)用的可用選項(xiàng)
以下是一些關(guān)于如何在 Kubernetes 上部署數(shù)據(jù)庫的幾個(gè)選項(xiàng)。
(1)StatefulSet
StatefulSet,是一個(gè)內(nèi)置的控制器(譯者注:原稱 PetSet,首次出現(xiàn)在 Kubernetes 1.4,后在 1.5 更名為 StatefulSet),本質(zhì)上類似于 Kubernetes 的部署。
最終,它將基于你將指定的 Pod 模板創(chuàng)建和管理一組 Pod。
主要區(qū)別在于,它為底層應(yīng)用提供了以下保證:
每個(gè) Pod 都有一個(gè)穩(wěn)定、唯一的網(wǎng)絡(luò)標(biāo)識符。
每個(gè) Pod 可能有一個(gè)穩(wěn)定的、持久的存儲卷。
部署、擴(kuò)展或終止都將是有序而優(yōu)雅地執(zhí)行。
下面是一些使用 StatefulSet 的開源數(shù)據(jù)庫部署實(shí)現(xiàn)的示例:
Kubernetes Elasticsearch Cluster,作者:Paulo Pires
https://github.com/pires/kubernetes-elasticsearch-cluster/tree/master/stateful
Consul on Kubernetes,作者:Kelsey Hightower
https://github.com/kelseyhightower/consul-on-kubernetes
StatefulSet 是通用的,因此你可以使用它們來對數(shù)據(jù)庫的約束聚簇構(gòu)造 (unique cluster formation) 或主 / 從架構(gòu)進(jìn)行建模。
然而,最終的結(jié)果將在操作方面有所欠缺。你將需要添加其他資源或自動化,以確保能夠執(zhí)行定期備份或添加處理諸如故障轉(zhuǎn)移等邊緣情況的腳本。
最終,使用 StatefulSet 為更復(fù)雜的有狀態(tài)服務(wù)建模可能會有點(diǎn)笨拙的感覺,并且還不是 Kubernetes 原生的,而且,如上所述,它還將缺乏管理自動化。這就是 Operator 發(fā)揮作用之處:
StatefulSet 是 Kubernetes 提供的管理有狀態(tài)應(yīng)用的負(fù)載管理控制器 API。在 Pod 管理的基礎(chǔ)上,保證 Pod 的順序和一致性。與 Deployment 一樣,StatefulSet 也是使用容器的 Spec 來創(chuàng)建 Pod,與之不同 StatefulSet 創(chuàng)建的 Pod 在生命周期中會保持持久的標(biāo)記(例如 Pod Name)。簡單地說,StatefulSet 是一個(gè)給 Pod 提供唯一標(biāo)志的控制器,它可以保證部署和擴(kuò)展的順序。
(2)Operator
如果你決定在 Kubernetes 上運(yùn)行數(shù)據(jù)的原因之一,是為了統(tǒng)一所有應(yīng)用程序組件的管理,那么 Operator 可能會提供你想要擁有的體驗(yàn)!
與其將應(yīng)用程序放入 StatefulSet 模型中,不如編寫 (或者使用其他人的) 自定義控制器。
作為用戶,這允許你使用 Kubectl CLI 來控制有狀態(tài)應(yīng)用,將其作為本地 Kubernetes 資源。例如,如果你部署了 etcd Operator,那么可以使用下面的 kubectl 命令檢查集群的備份狀態(tài):
kubectl get EtcdBackup example-etcd-cluster
與 StatefulSet 相比,Operator 的主要優(yōu)勢在于,它們添加了一個(gè)自動化層,該層對于其操作的有狀態(tài)應(yīng)用是獨(dú)有的。你無需擔(dān)心如何在 Elasticsearch 集群中添加備份 cron,該集群使用 StatefulSet 實(shí)現(xiàn)。使用 Operator,你只需指定存儲此備份的存儲桶即可。
不幸的是,由于編寫新的 Operator 除了需要了解有狀態(tài)應(yīng)用的細(xì)節(jié)之外,還需要了解 Kubernetes 及其 API,因此,目前可用的 Operator 并不多,而且現(xiàn)有的 Operator 仍然相對較新。
譯注:Operator 是 CoreOS 推出的旨在簡化復(fù)雜有狀態(tài)應(yīng)用管理的框架,它是一個(gè)感知應(yīng)用狀態(tài)的控制器,通過擴(kuò)展 Kubernetes API 來自動創(chuàng)建、管理和配置應(yīng)用實(shí)例。Operator 基于 Third Party Resources (CRD)擴(kuò)展了新的應(yīng)用資源,并通過控制器來保證應(yīng)用處于預(yù)期狀態(tài)。比如 etcd operator 通過下面的三個(gè)步驟模擬了管理 etcd 集群的行為:通過 Kubernetes API 觀察集群的當(dāng)前狀態(tài); 分析當(dāng)前狀態(tài)與期望狀態(tài)的差別; 調(diào)用 etcd 集群管理 API 或 Kubernetes API 消除這些差別。
(3)其他
本節(jié)提到的定義較少,主要是為了說明對于特定的數(shù)據(jù)庫,比如我們稍后將看到的 PostgreSQL 示例,還有其他選項(xiàng)可以將它們作為 Docker 容器在 Kubernetes 上部署和管理。
有時(shí),除了 StatefulSet 或?qū)S玫?Operator 實(shí)現(xiàn)之外,還有其他可用的選項(xiàng)。
例如,Stolon 是一個(gè)“PostgreSQL 高可用性的云原生 PostgreSQL 管理器”,雖然我個(gè)人還沒有機(jī)會使用它,但看到過一些帖子中提到了 Stolon。
要在 Kubernetes 上部署 Stolon,可以使用提供的 StatefulSet 定義。但是,由于 Stolon 的功能,你不需要添加自己的集群管理自動化來控制 PostgreSQL 集群。Stolon 為此提供了自己的 CLI。
看完上述內(nèi)容,你們對 Kubernetes 中怎么運(yùn)行數(shù)據(jù)庫服務(wù)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。