官术网_书友最值得收藏!

4.3 容器原生存儲的選擇

在容器云中,Pod會經常被創建和銷毀,也會在不同的主機之間快速遷移。為了保證容器在重啟或者遷移以后能夠使用原來的數據,容器必須使用持久化存儲。因此,持久化存儲的管理對于PaaS平臺來說非常重要。

Kubernetes/OpenShift通過PV(PVC)管理持久化存儲。PV分為動態PV和靜態PV。如果使用靜態PV,我們就需要手工創建PV或者預先創建大量的PV。在生產中,這種方式會給運維帶來極大的困擾,因此我們推薦使用動態PV。接下來介紹如何基于Ceph實現容器原生存儲,從而實現動態PV。

為了實現容器存儲接口標準化,開源界提出容器存儲接口(Container Storage Interface,CSI)。CSI旨在提供一種標準,讓塊存儲和文件系統可以在符合這種標準的情況下,為Kubernetes上的容器提供持久化存儲。隨著CSI的應用,Kubernetes存儲層變得真正可擴展。CSI使得第三方存儲提供商可以編寫和部署插件,發布支持Kubernetes的存儲系統,而無須觸及核心Kubernetes代碼。CSI為Kubernetes用戶提供了更多存儲選項,使容器中的應用系統更加安全、可靠。

Ceph從v14開始支持CSI。也就是說,從Ceph v14開始,OpenShift訪問Ceph時必須要通過CSI Driver。但是,在部署Ceph集群時,CSI Driver不會被自動部署到集群中,需要手工安裝,步驟較為復雜,也不利于運維。出于方便Kubernetes納管Ceph的目的,開源社區提出了Rook項目。

Rook(https://rook.io/)是一個開源項目,紅帽是該項目的頂級代碼貢獻商之一。Rook由Operator提供,它可以實現Ceph的部署、配置、供應、擴展、升級、遷移、災難恢復、監視和資源管理自動化。紅帽OpenShift容器存儲架構就是通過Rook納管Ceph實現的。

4.3.1 OpenShift容器存儲架構

基于Ceph和Rook,紅帽構建了OpenShift容器存儲架構(OpenShift Container Storage,OCS)。需要指出的是,新版本的OCS已經改名為Data Foundation。OCS是Rook和Ceph的企業級解決方案,其架構如圖4-53所示。

123-1

圖4-53 OCS架構圖

從圖4-53可以看出,OCS的組件都是以Pod形式運行在OpenShift中,Pod的具體作用會在后文展開說明。

OCS有兩種工作模式,分析如下。

  • 內置(Internal)模式:把OCS整體(OCS Operator和Ceph集群)部署在OpenShift集群中,把OpenShift的本地存儲空間作為Ceph存儲空間。這種模式的部署、使用都非常方便,適合開發測試和PoC環境。
  • 外置(External)模式:在OpenShift上部署OCS Operator,對接在外部物理機上安裝的Ceph;然后OpenShift以Rook的方式,管理外部物理機上的Ceph。外置模式的優勢是實現了OpenShift和存儲的解耦,而且存儲性能較高,適合生產環境。

在介紹了OCS的架構后,接下來我們介紹OCS的部署步驟。

4.3.2 創建OCS存儲

在OpenShift的Operator Hub中找到對應的Operator(圖中顯示名稱仍為更名之前的稱呼),如圖4-54所示。

124-1

圖4-54 選擇OCS Operator

OCS Operator部署成功后會提供三個API:Storage Cluster、Backing Store、Bucket Class,如圖4-55所示。

124-2

圖4-55 OCS Operator提供的API

OCS Operator安裝成功后,會在openshift-storage項目中部署三個Operator:

# oc get pods -n openshift-storage
NAME                                  READY   STATUS    RESTARTS   AGE
noobaa-operator-5c6dcb944b-8cds4      1/1     Running   0          42s
ocs-operator-56d4d7ddc7-4qfxq         1/1     Running   0          45s
rook-ceph-operator-7b46bff769-t9h8c   1/1     Running   0          45s

使用OCS Operator中的Storage Cluster API創建存儲集群,如圖4-56所示。

125-1

圖4-56 創建存儲集群

如前文所述,OCS有內置和外置兩種模式。我們先選擇內置模式,如圖4-57所示。

125-2

圖4-57 創建存儲集群

選擇內置模式后,OCS會列出OpenShift集群中可創建存儲集群的節點。需要注意的是,OCS要求加入存儲集群的OpenShift節點至少有16個CPU和64 GB內存,同時節點至少要選擇三個,且不在一個故障域中。我們選擇3個OpenShift節點,如圖4-58所示。

126-1

圖4-58 選擇節點

存儲空間選擇2TiB,這代表三個存儲節點,每個節點的內存是2TiB,做三副本,如圖4-59所示。

126-2

圖4-59 查看OCS相關Pod

存儲集群創建后,會在openshift-storage項目中部署對應的Pod,以CSI開頭的Pod為與CSI Driver相關的Pod,因此使用OCS時,我們不必單獨安裝CSI Driver;以rook開頭的Pod為被Rook納管的容器化Ceph組件,如圖4-60所示。

126-3

圖4-60 查看OCS相關Pod

所有Pod部署完畢后,在OpenShift中查看存儲集群,顯示已經部署成功:

# oc get storagecluster -n openshift-storage
NAME                 AGE    PHASE     EXTERNAL        CREATED AT      VERSION
ocs-storagecluster   39m    Ready     2020-10-11T     14:20:27Z       4.5.0

查看storagecluster對象中的內容,看到集群有2TiB空間(每個存儲節點大小為2TiB,有三個副本),如圖4-61所示。

127-1

圖4-61 查看存儲集群

查看OCS新創建的三個存儲類,分別為ceph-rbd、cephfs、ceph-rgw,如圖4-62所示。

127-2

圖4-62 查看新創建的存儲類

接下來,我們查看ceph-rbd、cephfs這兩個存儲類的相關內容。

查看ceph-rbd,看到其相關的參數和該存儲類對應的存儲池,如圖4-63所示。

127-3

圖4-63 查看新創建的ceph-rbd的內容

查看cephfs,發現該存儲類不對應pool,而是對應fs,且可以看到fsName,如圖4-64所示。

128-1

圖4-64 查看新創建的cephfs的內容

如果我們想要從Ceph集群角度查看集群的狀態和資源,可以使用Rook-Ceph工具。Rook-Ceph工具需要手工部署:

#oc patch ocsInitialization ocsinit -n openshift-storage --type json --patch
    '[{ "op": "replace", "path": "/spec/enableCephTools", "value": true }]'

在rook-ceph-tools Pod運行之后,采用如下方法訪問工具。首先設置變量:

#TOOLS_POD=$(oc get pods -n openshift-storage -l app=rook-ceph-tools -o name)

登錄工具Pod:

#oc rsh -n openshift-storage $TOOLS_POD

登錄后,就可以使用Ceph命令行來檢查存儲集群。我們可以看到集群的health、mon、mgr、mds的狀態,如圖4-65所示。

128-2

圖4-65 查看新創建的集群狀態

查看Ceph集群OSD狀態,可以看到Ceph集群中一共有3個OSD節點,每個節點提供2TiB存儲空間,如圖4-66所示。

129-1

圖4-66 查看Ceph集群存儲節點

查看存儲空間的使用情況,可以看到rbd和CephFS的使用情況,如圖4-67所示。

129-2

圖4-67 查看Ceph集群存儲空間使用情況

查看Ceph版本,為14.2.8,如圖4-68所示。

129-3

圖4-68 查看Ceph版本

在成功部署了OCS以后,我們接下來介紹如何基于OCS的存儲空間創建應用。在以下兩節中,我們主要介紹如何使用OCS的rbd和CephFS來為OpenShift容器應用提供持久化存儲。

4.3.3 使用rbd為應用提供持久化存儲

接下來,我們在OpenShift中使用OCS-storagecluster-ceph-rbd存儲類來創建RWO(ReadWriteOnce)持久性存儲,供新建的應用使用。

我們使用rails-pgsql-persistent模板在OpenShift上部署應用(包含前端應用和一個數據庫)。該模板包含一個參數STORAGE_CLASS,在部署應用時,我們通過這個參數指定pvc使用的STORAGE_CLASS。

首先創建項目:

oc new-project my-database-app

通過模板創建應用,指定使用名為ocs-storagecluster-ceph-rbd的存儲類,所需空間大小為5GiB。

#oc new-app -f /opt/app-root/src/support/ocslab_rails-app.yaml -p STORAGE_CLASS=
    ocs-storagecluster-ceph-rbd -p VOLUME_CAPACITY=5Gi

查看應用的部署情況:前端應用和后端PostgreSQL數據庫都已經部署成功,如圖4-69所示。

130-1

圖4-69 查看成功部署的應用

查看pvc,發現PostgreSQL已經和pvc自動綁定,如圖4-70所示。這個pvc是OCS根據部署應用時指定的容量和讀寫模式最終在Ceph存儲上自動創建的rbd卷,如圖4-70所示。

130-2

圖4-70 查看pvc

接下來,我們從Ceph存儲集群角度,確認OCS自動創建的rbd卷。再次登錄Ceph工具。

#TOOLS_POD=$(oc get pods -n openshift-storage -l app=rook-ceph-tools -o name)
#oc rsh -n openshift-storage $TOOLS_POD

我們先獲取rbd存儲池的名稱,如圖4-71所示,為ocs-storagecluster-cephblockpool。

131-1

圖4-71 查看rbd存儲池

查看存儲池中的卷,如圖4-72所示。

131-2

圖4-72 查看rbd卷

如果想確認我們剛部署的應用具體使用哪個卷,使用如下腳本:

#CSIVOL=$(oc get pv $(oc get pv | grep my-database-app | awk '{ print $1 }')
    -o jsonpath='{.spec.csi.volumeHandle}' | cut -d '-' -f 6- | awk '{print "csi-
    vol-"$1}')
#echo $CSIVOL

從圖4-73所示的輸出中,我們可以看到,PostgreSQL數據庫使用的pv對應的rbd卷為csi-vol-85766b1b-f719-11ea-b9a2-0a580a830405,即圖4-72中的第一個卷。

131-3

圖4-73 查看數據庫使用的rbd卷

使用如下腳本查看rbd卷的具體信息,可以看到卷的大小,如圖4-74所示。

131-4

圖4-74 查看rbd卷的信息

TOOLS_POD=$(oc get pods -n openshift-storage -l app=rook-ceph-tools -o name)
    oc rsh -n openshift-storage $TOOLS_POD rbd -p ocs-storagecluster-cephblockpool info $CSIVOL

在介紹了如何通過rbd為容器應用提供持久化存儲后,接下來我們介紹如何通過CephFS為容器應用提供持久化存儲。

4.3.4 使用CephFS為應用提供持久化存儲

使用rbd創建的pv,只能被一個Pod讀寫。但有些時候,我們需要提供可被多個Pod共享的持久化存儲,這就需要使用RWX(ReadWriteMany)模式的pvc。接下來我們通過使用ocs-storagecluster-cephfs存儲類,創建可同時由多個Pod使用的存儲空間。

首先部署PHP應用程序示例,名為file-uploader:

#oc new-app openshift/php:7.2~https://github.com/christianh814/openshift-php-
    upload-demo --name=file-upload

應用部署成功后,如圖4-75所示。此時的應用是沒有持久化存儲的。

132-1

圖4-75 查看部署成功的Pod

為應用創建路由,并將應用的副本數增加到3:

#oc expose svc/file-uploader -n my-shared-storage
#oc scale --replicas=3 dc/file-uploader

接下來,我們使用OCS-storagecluster-cephfs存儲類創建一個PersistentVolumeClaim,并使用oc set volume命令將其附加到應用程序中,指定pvc需要的存儲空間大小、讀寫模式:

#oc set volume dc/file-uploader --add --name=my-shared-storage \
-t pvc --claim-mode=ReadWriteMany --claim-size=1Gi \
--claim-name=my-shared-storage --claim-class=ocs-storagecluster-cephfs \
--mount-path=/opt/app-root/src/uploaded \

獲取應用的路由:

#oc get route file-uploader -n my-shared-storage -o jsonpath --template="{.spec.host}"

通過瀏覽器訪問應用,如圖4-76所示,可以上傳文件,將應用Pod重啟后,發現上傳的文件仍在,證明文件已經被存入持久化存儲中。由于篇幅有限,具體步驟不再展開說明。

133-1

圖4-76 瀏覽器訪問應用

至此,我們介紹了如何使用OCS的rbd和CephFS為容器提供持久化存儲。在以上環境中,我們使用了OCS的內置模式,將Ceph安裝在OCP內部。但在生產環境中,如果客戶對Ceph的容量和性能要求較高,就需要使用OCS的外置模式。接下來,我們介紹通過OCS納管外部Ceph存儲。

4.3.5 OCS Operator對接外部存儲

在創建存儲集群時,我們選擇外部存儲,會看到界面將提示下載一個Python腳本,如圖4-77所示。

133-2

圖4-77 Operator對接外部存儲

我們在外置的Ceph的mon節點上執行這個腳本。首先查看腳本的使用幫助:

#python ceph-external-cluster-details-exporter.py --help

在下面的命令中,rbd-data-pool-name指定要創建的存儲池的名稱;rgw-endpoint指定Ceph集群對象網關地址:

#python ceph-external-cluster-details-exporter.py --rbd-data-pool-name abc --rgw-
    endpoint 192.168.18.203:8080

命令執行后,會以JSON格式返回一串輸出結果,將結果粘貼到圖4-77所示的空白處,即可完成添加。后續的操作步驟與內置模式類似,這里不再展開說明。

通過本節,相信你會對容器原生存儲有一定的了解。通過Rook Operator,Kubernetes/OpenShift可以方便地使用持久化存儲,解決了容器云在運維方面使用持久化存儲的困擾。隨著容器云的普及,相信Ceph的應用場景會越來越廣。

主站蜘蛛池模板: 环江| 万安县| 永德县| 大城县| 诸城市| 合阳县| 烟台市| 桑植县| 中江县| 罗平县| 甘肃省| 柏乡县| 顺义区| 房产| 盖州市| 成安县| 泸水县| 莆田市| 江西省| 临潭县| 遂川县| 嘉义县| 巴南区| 邵武市| 通渭县| 星子县| 泽州县| 南开区| 闸北区| 长寿区| 绥德县| 崇礼县| 陆河县| 浙江省| 嘉善县| 屏边| 类乌齐县| 漯河市| 蓬溪县| 肇源县| 商城县|