前景提要
容器的持久化存儲(chǔ)是保存容器存儲(chǔ)狀態(tài)的重要手段,存儲(chǔ)插件會(huì)在容器里掛載一個(gè)基于網(wǎng)絡(luò)或者其他機(jī)制的遠(yuǎn)程數(shù)據(jù)卷,使得在容器里創(chuàng)建的文件,實(shí)際上是保存在遠(yuǎn)程存儲(chǔ)服務(wù)器上,或者以分布式的方式保存在多個(gè)節(jié)點(diǎn)上,而與當(dāng)前宿主機(jī)沒(méi)有任何綁定關(guān)系。這樣,無(wú)論你在其他哪個(gè)宿主機(jī)上啟動(dòng)新的容器,都可以請(qǐng)求掛載指定的持久化存儲(chǔ)卷,從而訪問(wèn)到數(shù)據(jù)卷里保存的內(nèi)容。
由于 Kubernetes 本身的松耦合設(shè)計(jì),絕大多數(shù)存儲(chǔ)項(xiàng)目,比如 Ceph、GlusterFS、NFS 等,都可以為 Kubernetes 提供持久化存儲(chǔ)能力。
1 Rook 簡(jiǎn)介
Rook 是一個(gè)開源的cloud-native storage編排, 提供平臺(tái)和框架;為各種存儲(chǔ)解決方案提供平臺(tái)、框架和支持,以便與云原生環(huán)境本地集成。
Rook 將存儲(chǔ)軟件轉(zhuǎn)變?yōu)樽晕夜芾?、自我擴(kuò)展和自我修復(fù)的存儲(chǔ)服務(wù),它通過(guò)自動(dòng)化部署、引導(dǎo)、配置、置備、擴(kuò)展、升級(jí)、遷移、災(zāi)難恢復(fù)、監(jiān)控和資源管理來(lái)實(shí)現(xiàn)此目的。
Rook 使用底層云本機(jī)容器管理、調(diào)度和編排平臺(tái)提供的工具來(lái)實(shí)現(xiàn)它自身的功能。
Rook 目前支持Ceph、NFS、Minio Object Store和CockroachDB。
Rook使用Kubernetes原語(yǔ)使Ceph存儲(chǔ)系統(tǒng)能夠在Kubernetes上運(yùn)行。下圖說(shuō)明了Ceph Rook如何與Kubernetes集成:

隨著Rook在Kubernetes集群中運(yùn)行,Kubernetes應(yīng)用程序可以掛載由Rook管理的塊設(shè)備和文件系統(tǒng),或者可以使用S3 / Swift API提供對(duì)象存儲(chǔ)。Rook oprerator自動(dòng)配置存儲(chǔ)組件并監(jiān)控群集,以確保存儲(chǔ)處于可用和健康狀態(tài)。
Rook oprerator是一個(gè)簡(jiǎn)單的容器,具有引導(dǎo)和監(jiān)視存儲(chǔ)集群所需的全部功能。oprerator將啟動(dòng)并監(jiān)控ceph monitor pods和OSDs的守護(hù)進(jìn)程,它提供基本的RADOS存儲(chǔ)。oprerator通過(guò)初始化運(yùn)行服務(wù)所需的pod和其他組件來(lái)管理池,對(duì)象存儲(chǔ)(S3 / Swift)和文件系統(tǒng)的CRD。
oprerator將監(jiān)視存儲(chǔ)后臺(tái)駐留程序以確保群集正常運(yùn)行。Ceph mons將在必要時(shí)啟動(dòng)或故障轉(zhuǎn)移,并在群集增長(zhǎng)或縮小時(shí)進(jìn)行其他調(diào)整。oprerator還將監(jiān)視api服務(wù)請(qǐng)求的所需狀態(tài)更改并應(yīng)用更改。
Rook oprerator還創(chuàng)建了Rook agent。這些agent是在每個(gè)Kubernetes節(jié)點(diǎn)上部署的pod。每個(gè)agent都配置一個(gè)Flexvolume插件,該插件與Kubernetes的volume controller集成在一起。處理節(jié)點(diǎn)上所需的所有存儲(chǔ)操作,例如附加網(wǎng)絡(luò)存儲(chǔ)設(shè)備,安裝卷和格式化文件系統(tǒng)。

該rook容器包括所有必需的Ceph守護(hù)進(jìn)程和工具來(lái)管理和存儲(chǔ)所有數(shù)據(jù) - 數(shù)據(jù)路徑?jīng)]有變化。 rook并沒(méi)有試圖與Ceph保持完全的忠誠(chéng)度。 許多Ceph概念(如placement groups和crush maps)都是隱藏的,因此您無(wú)需擔(dān)心它們。 相反,Rook為管理員創(chuàng)建了一個(gè)簡(jiǎn)化的用戶體驗(yàn),包括物理資源,池,卷,文件系統(tǒng)和buckets。 同時(shí),可以在需要時(shí)使用Ceph工具應(yīng)用高級(jí)配置。
Rook在golang中實(shí)現(xiàn)。Ceph在C ++中實(shí)現(xiàn),其中數(shù)據(jù)路徑被高度優(yōu)化。我們相信這種組合可以提供兩全其美的效果。
2 Ceph 簡(jiǎn)介
Ceph是一種高度可擴(kuò)展的分布式存儲(chǔ)解決方案,提供對(duì)象、文件和塊存儲(chǔ)。在每個(gè)存儲(chǔ)節(jié)點(diǎn)上,您將找到Ceph存儲(chǔ)對(duì)象的文件系統(tǒng)和Ceph OSD(對(duì)象存儲(chǔ)守護(hù)程序)進(jìn)程。在Ceph集群上,您還可以找到Ceph MON(監(jiān)控)守護(hù)程序,它們確保Ceph集群保持高可用性。


部署及運(yùn)維
1 K8s/K3s 集群準(zhǔn)備
利用 K8s & K3s 快速的構(gòu)建節(jié)點(diǎn)的數(shù)量 >= 3 的測(cè)試集群
172.16.31.237 master
172.16.31.241 work01
172.16.31.238 work02
172.16.31.236 work03
172.16.31.235 work04
172.16.31.240 work05
說(shuō)明: 在集群中至少有三個(gè)節(jié)點(diǎn)可用,滿足ceph高可用要求,這里已配置master節(jié)點(diǎn)使其支持運(yùn)行pod。
2 Ceph 存儲(chǔ)方式

rook默認(rèn)使用所有節(jié)點(diǎn)的所有資源,rook operator自動(dòng)在所有節(jié)點(diǎn)上啟動(dòng)OSD設(shè)備,Rook會(huì)用如下標(biāo)準(zhǔn)監(jiān)控并發(fā)現(xiàn)可用設(shè)備:
- 設(shè)備沒(méi)有分區(qū)
- 設(shè)備沒(méi)有格式化的文件系統(tǒng)
添加新磁盤:
這里在所有節(jié)點(diǎn)添加1塊50GB的新磁盤:/dev/sdb,作為OSD盤,提供存儲(chǔ)空間,添加完成后掃描磁盤,確保主機(jī)能夠正常識(shí)別到:
#掃描 SCSI總線并添加 SCSI 設(shè)備
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done
#重新掃描 SCSI 總線
for scsi_device in $(ls /sys/class/scsi_device/); do echo 1 > /sys/class/scsi_device/$scsi_device/device/rescan; done
#查看已添加的磁盤,能夠看到sdb說(shuō)明添加成功
lsblk
說(shuō)明: Rook不會(huì)使用不滿足以上標(biāo)準(zhǔn)的設(shè)備。另外也可以通過(guò)修改配置文件,指定哪些節(jié)點(diǎn)或者設(shè)備會(huì)被使用。
3 Rook Operator 部署
最低版本
注: Rook支持Kubernetes v1.10或更高版本先決條件
如果您要dataDirHostPath在kubernetes主機(jī)上持久保留rook數(shù)據(jù),請(qǐng)確保您的主機(jī)在指定路徑上至少有5GB的可用空間。
可以參考以下文檔 及 kubectl 命令和示例yaml文件創(chuàng)建一個(gè)簡(jiǎn)單的Rook集群。版本分支
# 克隆rook github倉(cāng)庫(kù)到本地
git clone https://github.com/rook/rook.git
# 查看版本。然后切換分支。切換分支之后按照官方文檔的方式進(jìn)行部署
git checkout release-1.1
- 環(huán)境拉起
# 進(jìn)入 Rook 部署目錄
cd cluster/examples/kubernetes/ceph
kubectl create -f common.yaml
kubectl create -f operator.yaml
4 Rook Cluster 創(chuàng)建
# cluster測(cè)試就使用下面的yaml
kubectl create -f cluster-test.yaml
# 正式環(huán)境使用
kubectl create -f cluster.yaml
每個(gè)節(jié)點(diǎn)都加載一塊無(wú)格式化的硬盤,因?yàn)槭褂霉俜降牟渴鸱绞剑蛔约哼M(jìn)行修改cluster.yaml的參數(shù)的話,會(huì)自動(dòng)掃描磁盤。上生產(chǎn)環(huán)境的時(shí)候,需要自己指定磁盤類型
# 案例介紹
# 其中bluestore是直接使用裸磁盤的意思,會(huì)加打磁盤的效率
# filestore
nodes:
- name: "master001"
devices:
- name: "sdb"
- name: "sdc"
config:
storeType: bluestore
- name: "master002"
devices:
- name: "sdb"
- name: "sdc"
config:
storeType: bluestore
- name: "master003"
devices:
- name: "sdb"
- name: "sdc"
config:
storeType: bluestore
說(shuō)明: 集群運(yùn)行后,您可以創(chuàng)建塊,對(duì)象或文件存儲(chǔ),以供集群中的其他應(yīng)用程序使用。
5 rook-ceph-tools 檢查
Rook工具箱是一個(gè)容器,其中包含用于rook調(diào)試和測(cè)試的常用工具。該工具箱基于CentOS,因此可以使用輕松安裝更多選擇的工具yum。
在Kubernetes中運(yùn)行工具箱,Rook工具箱可以作為Kubernetes集群中的部署運(yùn)行。確保已部署rook的Kubernetes集群正在運(yùn)行時(shí)(請(qǐng)參閱Kubernetes說(shuō)明),啟動(dòng)rook-ceph-tools pod。
# 啟動(dòng)rook-ceph-tools pod
kubectl create -f toolbox.yaml
# 等待工具箱窗格下載其容器并進(jìn)入 running 狀態(tài)
kubectl -n rook-ceph get pod -l "app=rook-ceph-tools"
# rook-ceph-tools pod運(yùn)行后,您可以使用以下命令連接到它
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash
ceph 工具箱問(wèn)題排查:
# 查看 ceph 狀態(tài)
ceph status
# 查看 ceph osd 狀態(tài)
ceph osd status
# 查看 ceph 存儲(chǔ)
ceph df
# 查看 ceph osd 存儲(chǔ)
rados df
# 使用完工具箱后,可以刪除部署
kubectl -n rook-ceph delete deployment rook-ceph-tools
配置ceph dashboard
在cluster.yaml文件中默認(rèn)已經(jīng)啟用了ceph dashboard,查看dashboard的service:
# 查看 ceph 的 deployment
$kubectl -n rook-ceph get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
rook-ceph-operator 1/1 1 1 162m
csi-cephfsplugin-provisioner 2/2 2 2 157m
rook-ceph-mon-a 1/1 1 1 155m
rook-ceph-mgr-a 1/1 1 1 155m
rook-ceph-osd-0 1/1 1 1 155m
rook-ceph-osd-3 1/1 1 1 154m
rook-ceph-osd-1 1/1 1 1 155m
rook-ceph-osd-2 1/1 1 1 155m
rook-ceph-osd-4 1/1 1 1 149m
csi-rbdplugin-provisioner 2/2 2 2 157m
rook-ceph-osd-5 1/1 1 1 95m
# 查看 ceph 的 service
$kubectl get service -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
csi-rbdplugin-metrics ClusterIP 10.43.14.242 <none> 8080/TCP,8081/TCP 156m
csi-cephfsplugin-metrics ClusterIP 10.43.167.36 <none> 8080/TCP,8081/TCP 156m
rook-ceph-mon-a ClusterIP 10.43.229.177 <none> 6789/TCP,3300/TCP 155m
rook-ceph-mgr-dashboard ClusterIP 10.43.59.114 <none> 8443/TCP 154m
rook-ceph-mgr ClusterIP 10.43.185.3 <none> 9283/TCP 154m
rook-ceph-mgr-dashboard-external-https NodePort 10.43.60.127 <none> 8443:30782/TCP 60m
rook-ceph-mgr-dashboard監(jiān)聽的端口是8443,創(chuàng)建nodeport類型的service以便集群外部訪問(wèn)
# 創(chuàng)建對(duì)外的服務(wù)
cd cluster/examples/kubernetes/ceph
kubectl apply -f rook/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml
# 查看端口號(hào),也可以自定義好端口號(hào)
kubectl get svc -n rook-ceph | grep rook-ceph-mgr-dashboard-external-https
# 查看一下nodeport暴露的端口
$kubectl get service -n rook-ceph | grep dashboard
rook-ceph-mgr-dashboard ClusterIP 10.43.59.114 <none> 8443/TCP 158m
rook-ceph-mgr-dashboard-external-https NodePort 10.43.60.127 <none> 8443:30782/TCP 64m
# 獲取Dashboard的登陸賬號(hào)和密碼
[centos@k8s-master ~]$ MGR_POD=`kubectl get pod -n rook-ceph | grep mgr | awk '{print $1}'`
[centos@k8s-master ~]$ kubectl -n rook-ceph logs $MGR_POD | grep password
2019-01-03 05:44:00.585 7fced4782700 0 log_channel(audit) log [DBG] : from='client.4151 10.244.1.2:0/3446600469' entity='client.admin' cmd=[{"username": "admin", "prefix": "dashboard set-login-credentials", "password": "8v2AbqHDj6", "target": ["mgr", ""], "format": "json"}]: dispatch
[centos@k8s-master ~]$
# 方式二:查看賬號(hào)/密碼信息(默認(rèn) admin)
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o yaml | grep "password:" | awk '{print $2}' | awk 'NR==1' | base64 --decode
說(shuō)明: 找到username和password字段,我這里是admin,8v2AbqHDj6 ; 打開瀏覽器輸入任意一個(gè)Node的IP+nodeport端口,這里使用master節(jié)點(diǎn) ip訪問(wèn):

登錄后界面如下:



備注說(shuō)明:
可以看到 dataDirHostPath: /var/lib/rook 字段還有spec.storage.directories.path也需要修改成一樣的
可以根據(jù)自己的需求進(jìn)行修改默認(rèn)的存儲(chǔ)路徑
cat cluster.yaml

存儲(chǔ)清理
刪除已創(chuàng)建的Ceph集群,可執(zhí)行下面命令
kubectl delete -f cluster.yaml
刪除Ceph集群后,在之前部署Ceph組件節(jié)點(diǎn)的/var/lib/rook/目錄,會(huì)遺留下Ceph集群的配置信息。
若之后再部署新的Ceph集群,先把之前Ceph集群的這些信息刪除,不然啟動(dòng)monitor會(huì)失??;
# cat clean-rook-dir.sh
hosts=(
k8s-master
k8s-node1
k8s-node2
)
for host in ${hosts[@]} ; do
ssh $host "rm -rf /var/lib/rook/*"
done
拓展閱讀
Ceph 是圣克魯茲加利福尼亞大學(xué)的 Sage Weil 在 2003 年開發(fā)的,也是他博士學(xué)位項(xiàng)目中的一部分。Ceph LTS 成熟穩(wěn)定、高可用、生態(tài)強(qiáng)大,在云原生時(shí)代和 Kubernetes 緊密集成。
Ceph 基于 RADOS(Reliable Autonomic Distributed Object Store )的高可用存儲(chǔ),在云原生時(shí)代之前 2003 年發(fā)行起,已經(jīng)廣泛生產(chǎn)部署的高可用存儲(chǔ),支持最廣泛的塊存儲(chǔ) RBD、文件 POSIX Cephfs 以及對(duì)象存儲(chǔ)訪問(wèn)協(xié)議。
RedHat/SUSE 目前是 Ceph 最主要的商業(yè)化支持者,在多個(gè)容器平臺(tái)落地案例中,RBD、CephFS 都被采用作為容器平臺(tái)實(shí)施的主要存儲(chǔ),用來(lái)彌補(bǔ)基礎(chǔ)云存儲(chǔ)的缺失。
參考鏈接:
Rook官網(wǎng):https://rook.io
root項(xiàng)目地址:https://github.com/rook/rook
rook官方參考文檔:https://rook.github.io/docs/rook/v0.9/ceph-quickstart.html