爲K8S集羣準備Ceph存儲

  隨着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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章