Kubernetes改變了開發的方式,資料庫是應用程式的重要組成部分。在本文中,我們將展示如何在Kubernetes中部署資料庫,以及可以使用哪些方法在Kubernetes中部署資料庫。
資料庫是一種用於在計算機系統上存儲和處理數據的系統。資料庫引擎可以在資料庫上創建,讀取,更新和刪除。資料庫由資料庫管理系統(DBMS)控制。
在大多數資料庫中,數據按行和列進行建模,稱為關係型,這種類型的資料庫在80年代佔主導地位。在2000年代,非關係資料庫開始流行,被稱為No-SQL,它們使用不同的查詢語言,並且這些類型的資料庫可用於鍵值對。
在本文中,我們將在Kubernetes中部署資料庫,因此我們必須了解什麼是StatefulSet。
StatefulSet是用於管理有狀態應用程式的工作負載。它管理一組Pod的實現和擴展,並保證這些Pod的順序和唯一性。
像Deployment一樣,StatefulSet也管理具有相同容器規範的一組Pod。由StatefulSets維護的Pod具有唯一的,持久的身份和穩定的主機名,而不用管它們位於哪個節點上。如果我們想要一個跨存儲的持久性,我們可以創建一個持久性卷並將StatefulSet用作解決方案的一部分。即使StatefulSet中的Pod容易發生故障,存儲卷與新Pod進行匹配也很容易。
StatefulSet對於需要以下一項或多項功能的應用程式很有價值:
在Kubernetes上部署資料庫時,我們需要使用StatefulSet,但是使用StatefulSet有一些局限性:
我們可以將資料庫作為有狀態應用程式部署到Kubernetes。通常,當我們部署Pod時,它們具有自己的存儲空間,但是該存儲空間是短暫的-如果容器被殺死了,則其存儲空間將隨之消失。
因此,我們需要有一個Kubernetes資源對象來解決這種情況:當我們想要數據持久化時,我們就把Pod和持久化存儲卷聲明關聯。通過這種方式,如果我們的容器被殺死了,我們的數據仍將位於集群中,新的pod也能夠相應地訪問數據。
Pod -> PVC-> PV
https://github.com/oracle/mysql-operator
https://github.com/CrunchyData/postgres-operator
https://github.com/mongodb/mongodb-enterprise-kubernetes
在當今世界上,越來越多的公司致力於容器技術。在進行深入研究之前,讓我們回顧一下用於運行資料庫的選項。
完全託管的資料庫是那些不用自己來管理的資料庫-這種管理可以由AWS Google,Azure或Digital Cloud等雲提供商完成。託管資料庫包括Amazon Web Services,Aurora DynamoDB或Google Spanner等。
使用這些完全託管的資料庫的優勢是操作少,雲提供商可以處理許多維護任務,例如備份,擴展補丁等。你只需創建資料庫即可構建應用程式,其他的由雲提供商幫你處理。
使用此選項,你可以將資料庫部署到任何虛擬機(EC2或Compute Engine),並且將擁有完全控制權。你將能夠部署任何版本的資料庫,並且可以設置自己的安全性和備份計劃。
另一方面,這意味著你將自行管理,修補,擴展或配置資料庫。這將增加基礎架構的成本,但具有靈活性的優勢。
在Kubernetes中部署資料庫更接近full-ops選項,但是從Kubernetes提供的自動化方面來看,你將獲得一些好處–能夠保持資料庫應用程式的正常運行。
要注意,pod是短暫的,因此資料庫應用程式重新啟動或失敗的可能性更大。另外,你將負責更具體的資料庫管理任務,例如備份,擴展等。
選擇在Kubernetes上部署資料庫時要考慮的一些重要點是:
上面,我們用一個簡單的圖表來顯示在Kubernetes上部署資料庫時的決策。
首先,我們需要嘗試了解資料庫是否具有與Kubernetes友好的功能,例如MySQL或PostgreSQL,然後我們查找kubernetes operators將資料庫與其他功能打包在一起。
第二個問題是-考慮到在Kubernetes中部署資料庫需要多少工作量,這是可以接受的?我們是否有一個運維團隊,或者在託管資料庫上部署資料庫是否可行?
apiVersion: v1kind: Servicemetadata:name: mysqlspec:ports:- port: 3306selector:app: mysqlclusterIP: None
首先,我們在埠3306上為MySQL資料庫部署服務,所有Pod均具有標籤鍵app: mysql。
接下來,創建以下資源:
Kubectl create -f mysql_service.yaml
apiVersion: apps/v1 Use secret in real usage- name: MYSQL_ROOT_PASSWORDvalue: passwordports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pv-claim
此Deployment在3306埠上創建帶有MySQL5.6鏡像和密碼(使用secret)的Pod。我們還將附加一個持久卷mysql-pv-claim,將在接下來的步驟中進行顯示。
創建資源:
Kubectl create -f mysql_deployment.yaml
apiVersion: v1kind: PersistentVolumemetadata:name: mysql-pv-volumelabels:type: localspec:storageClassName: manualcapacity:storage: 20GiaccessModes:- ReadWriteOncehostPath:path: &34;
這將創建一個持久卷,我們將使用它來附加到容器,以確保Pod重啟時的數據安全。該持久卷具有ReadWriteOne訪問模式,擁有20GB的存儲空間,存放路徑是/ mnt/data,我們所有的數據都將保存在該路徑中。
創建以下資源:
Kubectl create -f persistence_volume.yaml
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: mysql-pv-claimspec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 20Gi
該聲明從上面創建的「持久卷」中聲明20GB,並具有與上面的「持久卷」相同的訪問模式。
創建以下資源:
Kubectl create -f pvClaim.yaml
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
此命令在運行MySQL的集群中創建一個新的Pod,並連接到MySQL伺服器。如果連接成功,則說明你的MySQL資料庫已啟動並正在運行。
Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: falseIf you don't see a command prompt, try pressing enter.mysql>
以上完整代碼存放在這個位置:https://github.com/zarakM/mysql-k8.git
譯者:王延飛
原文連結:https://www.magalix.com/blog/kubernetes-and-database