隨着K8S存儲接口逐漸成熟並順勢推出CSI接口規範後,原來“in-tree”(樹內)模式的很多存儲插件也逐步遷移到了“out-of-tree”(樹外)模式的CSI插件上,甚至有些原來支持的存儲卷類型都被直接移除了(例如在K8S v1.26上直接移除了 glusterfs 卷類型),查閱了一下K8S官方最新版本的存儲相關(Storage/Volumes)的說明,綜合最新存儲支持情況,我們選擇Ceph作爲K8S集羣的存儲提供者。
首先,進入Ceph官網文檔查看其安裝部署方法,主要看下是否有基於K8S的安裝方法,最後在官網“Installing ceph>Recommended methods”(推薦的Ceph安裝方法)果然發現了基於K8S的安裝方法:
Ceph官方推薦在K8S集羣上使用Rook來部署和管理Ceph集羣!
我們進入Rook官網看看,從官網可以看出Rook是爲K8S量身定製的,那就它了:
Ceph是一個在大規模生產集羣中提供文件、塊和對象存儲的分佈式存儲系統,而Rook是一個專門支持Ceph與雲原生環境集成的開源雲原生存儲協調器。Rook利用K8S的Operator機制推出了自己的Rook operator,實現自動化的Ceph部署和管理。Rook作爲雲原生存儲平臺已經從CNCF順序畢業!
以上是對Rook簡要說明,接下來正式藉助Rook在K8S集羣上部署和管理Ceph。
Rook支持K8S v1.19+的版本,CPU架構爲amd64、x86_64或arm64均可,除此之外部署Ceph存儲集羣還必須至少滿足以下先決條件之一:
- 每個節點至少有一塊裸設備(Raw devices,未分區未進行文件系統格式化)
- 裸分區(Raw partitions,未進行文件系統格式化)
- LVM邏輯卷(LVM Logical Volumes,未進行文件系統格式化)
- block模式下存儲類(storage class)中可用的持久卷(PV)
這裏我們選擇爲K8S集羣的每個工作節點添加一塊額外的未格式化磁盤(裸設備),步驟見以下截圖:
將新增的磁盤設置成獨立模式(模擬公有云廠商提供的獨立磁盤),然後啓動K8S集羣虛擬機,在工作節點上使用以下命令檢查一下磁盤條件是否符合Ceph部署要求:
[root@node1 ~]# lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sdb sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00 sda ├─sda2 LVM2_member 45inUD-qJ4O-Fq9E-L6KD-8eJV-mofD-BuJDq6 │ └─centos_node1-root xfs 704f37f0-ae59-4995-80ec-58cba66e023b / └─sda1 xfs 67243cc8-c3fb-490f-b0da-cc439371d5e1 /boot
上述命令輸出中 sdb 磁盤就是我們爲工作節點新添加的裸設備(它的FSTYPE爲空),我們可以把它分配給Ceph使用。
需要在K8S集羣中啓用Rook准入控制器,用於驗證使用自定義資源(CR)設置正確地配置了Rook。該准入控制器在身份認證和授權之後,並在持久化對象之前,攔截髮往K8S API Server的請求以進行驗證。我們可以在安裝Rook之前,使用以下命令在K8S集羣中安裝Rook準備入控制器:
#在master1節點直接應用在線yaml文件 kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml #在master1將cert-manager.yaml下載到本地的方式(推薦) kubectl apply -f /etc/kubernetes/rook/cert-manager.yaml
...... service/cert-manager created service/cert-manager-webhook created deployment.apps/cert-manager-cainjector created deployment.apps/cert-manager created deployment.apps/cert-manager-webhook created mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
另外,Ceph OSD在以下情況下需要依賴於LVM(邏輯卷):
- 在裸設備或裸分區上創建OSD
- 如果啓用了加密(在集羣CR中設置了encryptedDevice: "true")
- 指定了元數據設備(metadata device)
在以下情況下OSD不需要LVM
- 在使用 storageClassDeviceSets 的PVC上創建OSD
目前大多數Linux發生版的LVM由lvm2包提供,在K8S集羣中運行Ceph OSD的所有存儲節點上都需要有這個包。雖然沒有這個包Rook也能夠成功創建Ceph OSD,但是當相應的節點(node)重啓之後,其上運行的OSD pod將會啓動失敗。所以需要確保作爲存儲節點的操作系統上安裝了LVM(從上面磁盤條件查驗的結果中看到我們是有LVM卷的),CentOS可以使用以下命令安裝LVM:
sudo yum install -y lvm2
Ceph需要一個帶有RBD模塊的Linux內核。大多數Linux發行版都有這個模塊,但不是所有,你可以在K8S集羣中作爲存儲的節點上運行 lsmod|grep rbd 命令檢測一下,如果該命令返回 空或‘not found’,那說明當前系統內核沒有加載RBD模塊,可以使用以下命令嘗試加載RBD模塊:
#將RBD模塊加載命令放入開機加載項裏 cat > /etc/sysconfig/modules/rbd.modules << EOF #!/bin/bash modprobe rbd EOF #爲上述爲腳本添加執行權限 chmod +x /etc/sysconfig/modules/rbd.modules #執行上述腳本(如果返回'not found',你可能需要安裝一個新的內核、或重新編譯一個帶有RBD模塊的內核、或換一個帶有RBD的Linux 發行版) /bin/bash /etc/sysconfig/modules/rbd.modules #查看RBD模塊是否加載成功 lsmod|grep rbd
Rook默認的RBD配置只指定了分層特性,以便與較舊的內核廣泛兼容。如果K8S節點運行在5.4+的系統內核上,則可以啓用其他功能特性。例如特別有用的 fast-diff 和 object-map 特性,主要的功能特性如下(在進行塊存儲的StorageClass定義時指定):
imageFeatures: layering,fast-diff,object-map,deep-flatten,exclusive-lock
如果你將來會從Ceph共享文件系統(CephFS)創建卷(volume),那麼需要使用4.17+的系統內核,PVC請求的存儲配額只在高於該版本的內核上生效。
------------------------------- 以上爲使用Rook在K8S集羣部署Ceph存儲的前提條件 -------------------------------
接下來正式使用Rook在K8S集羣部署Ceph存儲集羣!
首先在K8S所有集羣節點上安裝Git客戶端:
#安裝Git yum install -y git #查看Git版本 git --version git version 1.8.3.1
使用Rook官方提供的示例部署組件清單(manifests)部署一個簡單的Ceph集羣(測試環境夠用了):
#使用git將部署組件清單示例下載到本地(慢或無法接通的話自己想法辦FQ) git clone --single-branch --branch v1.10.11 https://github.com/rook/rook.git #進入到本地部署組件清單示例目錄 cd rook/deploy/examples #執行以下命令將Rook和Ceph相關CRD資源和通用資源創建到K8S集羣(其中psp.yaml是K8S集羣受Pod安全策略保護的情況下的可選資原文件) kubectl create -f crds.yaml -f common.yaml -f psp.yaml
接下來部署Rook Operator組件,該組件爲Rook與Kubernetes交互的組件,整個集羣只需要一個副本,特別注意 operator 的配置在Ceph集羣安裝後不能修改,否則Rook會刪除Ceph集羣並重建,所以部署之前一定要做好規劃,修改好operator.yaml的相關配置:
修改 rook/deploy/examples/operator.yaml文件中的
#執行以下命令在K8S集羣中部署Rook Ceph Operator(鏡像拉取可能需要一定時間,耐心等待,可用後一條命令監控相關Pod部署情況) kubectl create -f operator.yaml #使用以下命令監控Rook Ceph Operator相關Pod的部署情況(rook-ceph爲默認Rook Ceph Operator部署命令空間) watch kubectl get pods -n rook-ceph
修改
#確保rook-ceph-operator相關Pod都運行正常的情況下,就可以使用cluster.yaml部署Ceph存儲集羣了,
kubectl create -f cluster.yaml
Ceph集羣運行後,就可以創建塊、對象或文件存儲,供集羣中的其他應用程序使用了!
接下來部署Rook Operator