- 金融級IT架構與運維:云原生、分布式與安全
- 魏新宇等
- 3315字
- 2022-01-14 14:23:06
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所示。

圖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所示。

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

圖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所示。

圖4-56 創建存儲集群
如前文所述,OCS有內置和外置兩種模式。我們先選擇內置模式,如圖4-57所示。

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

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

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

圖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所示。

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

圖4-62 查看新創建的存儲類
接下來,我們查看ceph-rbd、cephfs這兩個存儲類的相關內容。
查看ceph-rbd,看到其相關的參數和該存儲類對應的存儲池,如圖4-63所示。

圖4-63 查看新創建的ceph-rbd的內容
查看cephfs,發現該存儲類不對應pool,而是對應fs,且可以看到fsName,如圖4-64所示。

圖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所示。

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

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

圖4-67 查看Ceph集群存儲空間使用情況
查看Ceph版本,為14.2.8,如圖4-68所示。

圖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所示。

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

圖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。

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

圖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中的第一個卷。

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

圖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所示。此時的應用是沒有持久化存儲的。

圖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重啟后,發現上傳的文件仍在,證明文件已經被存入持久化存儲中。由于篇幅有限,具體步驟不再展開說明。

圖4-76 瀏覽器訪問應用
至此,我們介紹了如何使用OCS的rbd和CephFS為容器提供持久化存儲。在以上環境中,我們使用了OCS的內置模式,將Ceph安裝在OCP內部。但在生產環境中,如果客戶對Ceph的容量和性能要求較高,就需要使用OCS的外置模式。接下來,我們介紹通過OCS納管外部Ceph存儲。
4.3.5 OCS Operator對接外部存儲
在創建存儲集群時,我們選擇外部存儲,會看到界面將提示下載一個Python腳本,如圖4-77所示。

圖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的應用場景會越來越廣。