<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何在Kubernetes上部署MySQL數(shù)據(jù)庫(kù)

          共 5347字,需瀏覽 11分鐘

           ·

          2020-10-29 20:42

          來(lái)源:https://my.oschina.net/u/4342648/blog/4504728


          Kubernetes改變了開(kāi)發(fā)的方式,數(shù)據(jù)庫(kù)是應(yīng)用程序的重要組成部分。在本文中,我們將展示如何在Kubernetes中部署數(shù)據(jù)庫(kù),以及可以使用哪些方法在Kubernetes中部署數(shù)據(jù)庫(kù)。

          數(shù)據(jù)庫(kù)

          數(shù)據(jù)庫(kù)是一種用于在計(jì)算機(jī)系統(tǒng)上存儲(chǔ)和處理數(shù)據(jù)的系統(tǒng)。數(shù)據(jù)庫(kù)引擎可以在數(shù)據(jù)庫(kù)上創(chuàng)建,讀取,更新和刪除。數(shù)據(jù)庫(kù)由數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)控制。

          在大多數(shù)數(shù)據(jù)庫(kù)中,數(shù)據(jù)按行和列進(jìn)行建模,稱(chēng)為關(guān)系型,這種類(lèi)型的數(shù)據(jù)庫(kù)在80年代占主導(dǎo)地位。在2000年代,非關(guān)系數(shù)據(jù)庫(kù)開(kāi)始流行,被稱(chēng)為No-SQL,它們使用不同的查詢語(yǔ)言,并且這些類(lèi)型的數(shù)據(jù)庫(kù)可用于鍵值對(duì)。

          StatefulSet

          在本文中,我們將在Kubernetes中部署數(shù)據(jù)庫(kù),因此我們必須了解什么是StatefulSet。

          StatefulSet是用于管理有狀態(tài)應(yīng)用程序的工作負(fù)載。它管理一組Pod的實(shí)現(xiàn)和擴(kuò)展,并保證這些Pod的順序和唯一性。

          像Deployment一樣,StatefulSet也管理具有相同容器規(guī)范的一組Pod。由StatefulSets維護(hù)的Pod具有唯一的,持久的身份和穩(wěn)定的主機(jī)名,而不用管它們位于哪個(gè)節(jié)點(diǎn)上。如果我們想要一個(gè)跨存儲(chǔ)的持久性,我們可以創(chuàng)建一個(gè)持久性卷并將StatefulSet用作解決方案的一部分。即使StatefulSet中的Pod容易發(fā)生故障,存儲(chǔ)卷與新Pod進(jìn)行匹配也很容易。

          StatefulSet對(duì)于需要以下一項(xiàng)或多項(xiàng)功能的應(yīng)用程序很有價(jià)值:

          • 穩(wěn)定的唯一網(wǎng)絡(luò)標(biāo)識(shí)符。

          • 穩(wěn)定,持久的存儲(chǔ)。

          • 有序,順暢的部署和擴(kuò)展。

          • 有序的自動(dòng)滾動(dòng)更新。


          在Kubernetes上部署數(shù)據(jù)庫(kù)時(shí),我們需要使用StatefulSet,但是使用StatefulSet有一些局限性:

          • 需要使用持久性存儲(chǔ)卷為Pod提供存儲(chǔ)。

          • 刪除副本或按比例縮小副本將不會(huì)刪除附加到StatefulSet的存儲(chǔ)卷。存儲(chǔ)卷確保數(shù)據(jù)的安全性。

          • StatefulSet當(dāng)前需要Headless Service 來(lái)負(fù)責(zé)Pod的網(wǎng)絡(luò)標(biāo)識(shí)。

          • 與Deployment 不同,StatefulSet不保證刪除StatefulSet資源時(shí)刪除所有Pod,而Deployment在被刪除時(shí)會(huì)刪除與Deployment關(guān)聯(lián)的所有Pod。在刪除StatefulSet之前,你必須將pod副本數(shù)量縮小到0 。

          Kubernetes上的數(shù)據(jù)庫(kù)

          我們可以將數(shù)據(jù)庫(kù)作為有狀態(tài)應(yīng)用程序部署到Kubernetes。通常,當(dāng)我們部署Pod時(shí),它們具有自己的存儲(chǔ)空間,但是該存儲(chǔ)空間是短暫的-如果容器被殺死了,則其存儲(chǔ)空間將隨之消失。

          因此,我們需要有一個(gè)Kubernetes資源對(duì)象來(lái)解決這種情況:當(dāng)我們想要數(shù)據(jù)持久化時(shí),我們就把Pod和持久化存儲(chǔ)卷聲明關(guān)聯(lián)。通過(guò)這種方式,如果我們的容器被殺死了,我們的數(shù)據(jù)仍將位于集群中,新的pod也能夠相應(yīng)地訪問(wèn)數(shù)據(jù)。

          Pod -> PVC-> PV

          • PV =持久性存儲(chǔ)

          • PVC =持久性存儲(chǔ)聲明

          Operators將數(shù)據(jù)庫(kù)部署到Kubernetes

          • 我們可以使用由Oracle開(kāi)發(fā)的Kubernetes Operators來(lái)部署MySQL數(shù)據(jù)庫(kù):

          ????????https://github.com/oracle/mysql-operator

          • 使用Crunchydata開(kāi)發(fā)的PostgreSQL Operators,、將PostgreSQL部署到Kubernetes:

          ????????https://github.com/CrunchyData/postgres-operator

          • 使用MongoDB開(kāi)發(fā)的Operators,可將MongoDB Enterprise部署到Kubernetes集群:

          ????????https://github.com/mongodb/mongodb-enterprise-kubernetes

          在Kubernetes上部署數(shù)據(jù)庫(kù)是否可行?

          在當(dāng)今世界上,越來(lái)越多的公司致力于容器技術(shù)。在進(jìn)行深入研究之前,讓我們回顧一下用于運(yùn)行數(shù)據(jù)庫(kù)的選項(xiàng)。

          1.完全托管的數(shù)據(jù)庫(kù)

          完全托管的數(shù)據(jù)庫(kù)是那些不用自己來(lái)管理的數(shù)據(jù)庫(kù)-這種管理可以由AWS Google,Azure或Digital Cloud等云提供商完成。托管數(shù)據(jù)庫(kù)包括Amazon Web Services,Aurora DynamoDB或Google Spanner等。

          使用這些完全托管的數(shù)據(jù)庫(kù)的優(yōu)勢(shì)是操作少,云提供商可以處理許多維護(hù)任務(wù),例如備份,擴(kuò)展補(bǔ)丁等。你只需創(chuàng)建數(shù)據(jù)庫(kù)即可構(gòu)建應(yīng)用程序,其他的由云提供商幫你處理。

          2.在VM或本地自行部署

          使用此選項(xiàng),你可以將數(shù)據(jù)庫(kù)部署到任何虛擬機(jī)(EC2或Compute Engine),并且將擁有完全控制權(quán)。你將能夠部署任何版本的數(shù)據(jù)庫(kù),并且可以設(shè)置自己的安全性和備份計(jì)劃。

          另一方面,這意味著你將自行管理,修補(bǔ),擴(kuò)展或配置數(shù)據(jù)庫(kù)。這將增加基礎(chǔ)架構(gòu)的成本,但具有靈活性的優(yōu)勢(shì)。

          3.在Kubernetes上運(yùn)行

          在Kubernetes中部署數(shù)據(jù)庫(kù)更接近full-ops選項(xiàng),但是從Kubernetes提供的自動(dòng)化方面來(lái)看,你將獲得一些好處–能夠保持?jǐn)?shù)據(jù)庫(kù)應(yīng)用程序的正常運(yùn)行。

          要注意,pod是短暫的,因此數(shù)據(jù)庫(kù)應(yīng)用程序重新啟動(dòng)或失敗的可能性更大。另外,你將負(fù)責(zé)更具體的數(shù)據(jù)庫(kù)管理任務(wù),例如備份,擴(kuò)展等。

          選擇在Kubernetes上部署數(shù)據(jù)庫(kù)時(shí)要考慮的一些重要點(diǎn)是:

          • 有一些自定義資源和 operators可用于在Kubernetes上管理數(shù)據(jù)庫(kù)。

          • 具有緩存層和瞬時(shí)態(tài)存儲(chǔ)的數(shù)據(jù)庫(kù)更適合Kubernetes。

          • 你必須了解數(shù)據(jù)庫(kù)中可用的復(fù)制模式。異步復(fù)制模式為數(shù)據(jù)丟失留有空間,因?yàn)槭聞?wù)可能會(huì)提交給主數(shù)據(jù)庫(kù),而不會(huì)提交給從數(shù)據(jù)庫(kù)。

          上面,我們用一個(gè)簡(jiǎn)單的圖表來(lái)顯示在Kubernetes上部署數(shù)據(jù)庫(kù)時(shí)的決策。

          首先,我們需要嘗試了解數(shù)據(jù)庫(kù)是否具有與Kubernetes友好的功能,例如MySQL或PostgreSQL,然后我們查找kubernetes operators將數(shù)據(jù)庫(kù)與其他功能打包在一起。

          第二個(gè)問(wèn)題是-考慮到在Kubernetes中部署數(shù)據(jù)庫(kù)需要多少工作量,這是可以接受的?我們是否有一個(gè)運(yùn)維團(tuán)隊(duì),或者在托管數(shù)據(jù)庫(kù)上部署數(shù)據(jù)庫(kù)是否可行?

          在Kubernetes上部署有狀態(tài)應(yīng)用程序:

          步驟1:部署MySQL服務(wù)

          apiVersion: v1kind: Servicemetadata:  name: mysqlspec:  ports:  - port: 3306  selector:    app: mysql  clusterIP: None

          首先,我們?cè)诙丝?306上為MySQL數(shù)據(jù)庫(kù)部署服務(wù),所有Pod均具有標(biāo)簽鍵app: mysql。

          接下來(lái),創(chuàng)建以下資源:

          Kubectl create -f mysql_service.yaml

          步驟2:部署MySQL Deployment

          apiVersion: apps/v1kind: Deploymentmetadata:  name: mysqlspec:  selector:    matchLabels:      app: mysql  strategy:    type: Recreate  template:    metadata:      labels:        app: mysql    spec:      containers:      - image: mysql:5.6        name: mysql        env:          # Use secret in real usage        - name: MYSQL_ROOT_PASSWORD          value: password        ports:        - containerPort: 3306          name: mysql        volumeMounts:        - name: mysql-persistent-storage          mountPath: /var/lib/mysql      volumes:      - name: mysql-persistent-storage        persistentVolumeClaim:          claimName: mysql-pv-claim

          此Deployment在3306端口上創(chuàng)建帶有MySQL5.6鏡像和密碼(使用secret)的Pod。我們還將附加一個(gè)持久卷mysql-pv-claim,將在接下來(lái)的步驟中進(jìn)行顯示。

          創(chuàng)建資源:

          Kubectl create -f mysql_deployment.yaml

          第3步:創(chuàng)建持久卷

          apiVersion: v1kind: PersistentVolumemetadata:  name: mysql-pv-volume  labels:    type: localspec:  storageClassName: manual  capacity:    storage: 20Gi  accessModes:    - ReadWriteOnce  hostPath:    path: "/mnt/data"

          這將創(chuàng)建一個(gè)持久卷,我們將使用它來(lái)附加到容器,以確保Pod重啟時(shí)的數(shù)據(jù)安全。該持久卷具有ReadWriteOne訪問(wèn)模式,擁有20GB的存儲(chǔ)空間,存放路徑是/ mnt/data,我們所有的數(shù)據(jù)都將保存在該路徑中。

          創(chuàng)建以下資源:

          Kubectl create -f persistence_volume.yaml

          第4步:創(chuàng)建持久卷聲明

          apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: mysql-pv-claimspec:  storageClassName: manual  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 20Gi

          該聲明從上面創(chuàng)建的“持久卷”中聲明20GB,并具有與上面的“持久卷”相同的訪問(wèn)模式。

          創(chuàng)建以下資源:

          Kubectl create -f pvClaim.yaml

          步驟5:測(cè)試MySQL數(shù)據(jù)庫(kù)

          kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppasswordCopy

          ?此命令在運(yùn)行MySQL的集群中創(chuàng)建一個(gè)新的Pod,并連接到MySQL服務(wù)器。如果連接成功,則說(shuō)明你的MySQL數(shù)據(jù)庫(kù)已啟動(dòng)并正在運(yùn)行。

          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>

          以上完整代碼存放在這個(gè)位置:https://github.com/zarakM/mysql-k8.git

          總結(jié)

          • 有狀態(tài)應(yīng)用程序是存儲(chǔ)用戶會(huì)話狀態(tài)的應(yīng)用程序,保存的數(shù)據(jù)稱(chēng)為應(yīng)用程序狀態(tài)。

          • StatefulSet是一個(gè)Kubernetes資源對(duì)象,用于管理有狀態(tài)應(yīng)用程序,并提供有關(guān)Pod順序和唯一性的保證。

          • 通過(guò)刪除StatefulSet,不會(huì)刪除StatefulSet中的pod。相反如果刪除,你必須將有狀態(tài)應(yīng)用程序副本數(shù)量縮小為0。

          • Kubernetes上的數(shù)據(jù)庫(kù)部署有一個(gè)持久存儲(chǔ)卷,只要你的集群正在運(yùn)行,該存儲(chǔ)卷就可以永久存儲(chǔ)數(shù)據(jù)。這意味著它可以抵御pod的破壞,并且創(chuàng)建的任何新pod將能夠再次使用該存儲(chǔ)卷。

          • 完全托管的數(shù)據(jù)庫(kù)是由云提供商管理的數(shù)據(jù)庫(kù)。我們不必管理數(shù)據(jù)庫(kù)。這些數(shù)據(jù)庫(kù)需要額外的費(fèi)用,但是如果你想專(zhuān)注于應(yīng)用程序,它們是最佳選擇。

          • 你可以通過(guò)VM部署數(shù)據(jù)庫(kù)。但你將必須處理所有數(shù)據(jù)庫(kù)操作,例如擴(kuò)展,設(shè)置和修補(bǔ)。

          • 最后,我們展示了如何在Kubernetes上部署數(shù)據(jù)庫(kù)。


          - END -


          ?推薦閱讀?

          31天拿下K8s最具有含金量的CKA認(rèn)證?
          Jenkins vs GitLab CI:CI/CD工具之戰(zhàn)
          搞懂 Nginx,這篇就夠了!
          Linux系統(tǒng)常用命令速查手冊(cè)
          Linux服務(wù)器高并發(fā)調(diào)優(yōu)實(shí)戰(zhàn)
          kubernetes 常見(jiàn)問(wèn)題總結(jié)
          搭建一套高可用的Harbor容器鏡像倉(cāng)庫(kù)
          互聯(lián)網(wǎng)公司招聘運(yùn)維工程師【內(nèi)推】



          點(diǎn)亮,服務(wù)器三年不宕機(jī)

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人精品三级麻豆 | 秘 韩国免费网站18禁 | 国产拍拍视频 | 操逼操逼操逼 | 日韩 国产 在线 |