K8s & K3s 集群中構(gòu)建云原生存儲系統(tǒng)( rook + ceph )

前景提要

容器的持久化存儲是保存容器存儲狀態(tài)的重要手段逝段,存儲插件會在容器里掛載一個基于網(wǎng)絡(luò)或者其他機(jī)制的遠(yuǎn)程數(shù)據(jù)卷拨与,使得在容器里創(chuàng)建的文件忆蚀,實際上是保存在遠(yuǎn)程存儲服務(wù)器上根蟹,或者以分布式的方式保存在多個節(jié)點上,而與當(dāng)前宿主機(jī)沒有任何綁定關(guān)系拷肌。這樣到旦,無論你在其他哪個宿主機(jī)上啟動新的容器,都可以請求掛載指定的持久化存儲卷巨缘,從而訪問到數(shù)據(jù)卷里保存的內(nèi)容添忘。
由于 Kubernetes 本身的松耦合設(shè)計,絕大多數(shù)存儲項目若锁,比如 Ceph搁骑、GlusterFS、NFS 等又固,都可以為 Kubernetes 提供持久化存儲能力仲器。

1 Rook 簡介

Rook 是一個開源的cloud-native storage編排, 提供平臺和框架;為各種存儲解決方案提供平臺仰冠、框架和支持乏冀,以便與云原生環(huán)境本地集成。
Rook 將存儲軟件轉(zhuǎn)變?yōu)樽晕夜芾砘ν!⒆晕覕U(kuò)展和自我修復(fù)的存儲服務(wù)煤辨,它通過自動化部署、引導(dǎo)木张、配置、置備端三、擴(kuò)展舷礼、升級、遷移郊闯、災(zāi)難恢復(fù)妻献、監(jiān)控和資源管理來實現(xiàn)此目的。
Rook 使用底層云本機(jī)容器管理团赁、調(diào)度和編排平臺提供的工具來實現(xiàn)它自身的功能育拨。
Rook 目前支持Ceph、NFS欢摄、Minio Object Store和CockroachDB熬丧。

Rook使用Kubernetes原語使Ceph存儲系統(tǒng)能夠在Kubernetes上運(yùn)行。下圖說明了Ceph Rook如何與Kubernetes集成:


image

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


image

該rook容器包括所有必需的Ceph守護(hù)進(jìn)程和工具來管理和存儲所有數(shù)據(jù) - 數(shù)據(jù)路徑?jīng)]有變化庄新。 rook并沒有試圖與Ceph保持完全的忠誠度鞠眉。 許多Ceph概念(如placement groups和crush maps)都是隱藏的,因此您無需擔(dān)心它們择诈。 相反械蹋,Rook為管理員創(chuàng)建了一個簡化的用戶體驗,包括物理資源羞芍,池哗戈,卷,文件系統(tǒng)和buckets荷科。 同時唯咬,可以在需要時使用Ceph工具應(yīng)用高級配置。
Rook在golang中實現(xiàn)畏浆。Ceph在C ++中實現(xiàn)胆胰,其中數(shù)據(jù)路徑被高度優(yōu)化。我們相信這種組合可以提供兩全其美的效果刻获。

2 Ceph 簡介

Ceph是一種高度可擴(kuò)展的分布式存儲解決方案蜀涨,提供對象、文件和塊存儲。在每個存儲節(jié)點上勉盅,您將找到Ceph存儲對象的文件系統(tǒng)和Ceph OSD(對象存儲守護(hù)程序)進(jìn)程佑颇。在Ceph集群上,您還可以找到Ceph MON(監(jiān)控)守護(hù)程序草娜,它們確保Ceph集群保持高可用性挑胸。


image
image

部署及運(yùn)維

1 K8s/K3s 集群準(zhǔn)備

利用 K8s & K3s 快速的構(gòu)建節(jié)點的數(shù)量 >= 3 的測試集群

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

說明: 在集群中至少有三個節(jié)點可用,滿足ceph高可用要求宰闰,這里已配置master節(jié)點使其支持運(yùn)行pod茬贵。

2 Ceph 存儲方式

image

rook默認(rèn)使用所有節(jié)點的所有資源,rook operator自動在所有節(jié)點上啟動OSD設(shè)備移袍,Rook會用如下標(biāo)準(zhǔn)監(jiān)控并發(fā)現(xiàn)可用設(shè)備:

  • 設(shè)備沒有分區(qū)
  • 設(shè)備沒有格式化的文件系統(tǒng)

添加新磁盤:
這里在所有節(jié)點添加1塊50GB的新磁盤:/dev/sdb解藻,作為OSD盤,提供存儲空間葡盗,添加完成后掃描磁盤螟左,確保主機(jī)能夠正常識別到:

#掃描 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說明添加成功
lsblk

說明: Rook不會使用不滿足以上標(biāo)準(zhǔn)的設(shè)備觅够。另外也可以通過修改配置文件胶背,指定哪些節(jié)點或者設(shè)備會被使用。

3 Rook Operator 部署

  • 最低版本
    注: Rook支持Kubernetes v1.10或更高版本

  • 先決條件
    如果您要dataDirHostPath在kubernetes主機(jī)上持久保留rook數(shù)據(jù)喘先,請確保您的主機(jī)在指定路徑上至少有5GB的可用空間钳吟。
    可以參考以下文檔 及 kubectl 命令和示例yaml文件創(chuàng)建一個簡單的Rook集群。

  • 版本分支

# 克隆rook github倉庫到本地
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測試就使用下面的yaml
kubectl create -f cluster-test.yaml
# 正式環(huán)境使用
kubectl create -f cluster.yaml

每個節(jié)點都加載一塊無格式化的硬盤,因為使用官方的部署方式涤姊,不自己進(jìn)行修改cluster.yaml的參數(shù)的話暇番,會自動掃描磁盤。上生產(chǎn)環(huán)境的時候思喊,需要自己指定磁盤類型

# 案例介紹
# 其中bluestore是直接使用裸磁盤的意思奔誓,會加打磁盤的效率
# 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

說明: 集群運(yùn)行后,您可以創(chuàng)建塊搔涝,對象或文件存儲,以供集群中的其他應(yīng)用程序使用和措。

5 rook-ceph-tools 檢查

Rook工具箱是一個容器庄呈,其中包含用于rook調(diào)試和測試的常用工具。該工具箱基于CentOS派阱,因此可以使用輕松安裝更多選擇的工具yum诬留。
在Kubernetes中運(yùn)行工具箱,Rook工具箱可以作為Kubernetes集群中的部署運(yùn)行。確保已部署rook的Kubernetes集群正在運(yùn)行時(請參閱Kubernetes說明)文兑,啟動rook-ceph-tools pod盒刚。

# 啟動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 工具箱問題排查:

# 查看 ceph 狀態(tài)
ceph status
# 查看 ceph osd 狀態(tài)
ceph osd status
# 查看 ceph 存儲
ceph df
# 查看 ceph osd 存儲
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以便集群外部訪問

# 創(chuàng)建對外的服務(wù)
cd cluster/examples/kubernetes/ceph
kubectl apply -f rook/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml
# 查看端口號籍铁,也可以自定義好端口號
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的登陸賬號和密碼
[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 ~]$ 

# 方式二:查看賬號/密碼信息(默認(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

說明: 找到username和password字段涡上,我這里是admin,8v2AbqHDj6 ; 打開瀏覽器輸入任意一個Node的IP+nodeport端口拒名,這里使用master節(jié)點 ip訪問:

image

登錄后界面如下:


image

image

image

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

cat cluster.yaml
image

存儲清理

刪除已創(chuàng)建的Ceph集群吩愧,可執(zhí)行下面命令

kubectl delete -f cluster.yaml

刪除Ceph集群后,在之前部署Ceph組件節(jié)點的/var/lib/rook/目錄增显,會遺留下Ceph集群的配置信息雁佳。
若之后再部署新的Ceph集群,先把之前Ceph集群的這些信息刪除同云,不然啟動monitor會失斕侨ā;

# 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é)位項目中的一部分温兼。Ceph LTS 成熟穩(wěn)定、高可用武契、生態(tài)強(qiáng)大募判,在云原生時代和 Kubernetes 緊密集成。

Ceph 基于 RADOS(Reliable Autonomic Distributed Object Store )的高可用存儲咒唆,在云原生時代之前 2003 年發(fā)行起届垫,已經(jīng)廣泛生產(chǎn)部署的高可用存儲,支持最廣泛的塊存儲 RBD全释、文件 POSIX Cephfs 以及對象存儲訪問協(xié)議装处。

RedHat/SUSE 目前是 Ceph 最主要的商業(yè)化支持者,在多個容器平臺落地案例中浸船,RBD妄迁、CephFS 都被采用作為容器平臺實施的主要存儲,用來彌補(bǔ)基礎(chǔ)云存儲的缺失李命。

參考鏈接:
Rook官網(wǎng):https://rook.io
root項目地址:https://github.com/rook/rook
rook官方參考文檔:https://rook.github.io/docs/rook/v0.9/ceph-quickstart.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末登淘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子封字,更是在濱河造成了極大的恐慌黔州,老刑警劉巖耍鬓,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異流妻,居然都是意外死亡牲蜀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門绅这,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涣达,“玉大人,你說我怎么就攤上這事君躺∏团校” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵棕叫,是天一觀的道長林螃。 經(jīng)常有香客問我,道長俺泣,這世上最難降的妖魔是什么疗认? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮伏钠,結(jié)果婚禮上横漏,老公的妹妹穿的比我還像新娘。我一直安慰自己熟掂,他們只是感情好缎浇,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赴肚,像睡著了一般素跺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上誉券,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天指厌,我揣著相機(jī)與錄音,去河邊找鬼踊跟。 笑死踩验,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的商玫。 我是一名探鬼主播箕憾,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拳昌!你這毒婦竟也來了厕九?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤地回,失蹤者是張志新(化名)和其女友劉穎扁远,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刻像,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡畅买,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了细睡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷羞。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溜徙,靈堂內(nèi)的尸體忽然破棺而出湃缎,到底是詐尸還是另有隱情,我是刑警寧澤蠢壹,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布嗓违,位于F島的核電站,受9級特大地震影響图贸,放射性物質(zhì)發(fā)生泄漏蹂季。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一疏日、第九天 我趴在偏房一處隱蔽的房頂上張望偿洁。 院中可真熱鬧,春花似錦沟优、人聲如沸涕滋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宾肺。三九已至,卻和暖如春鹃唯,著一層夾襖步出監(jiān)牢的瞬間爱榕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工坡慌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留黔酥,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓洪橘,卻偏偏與公主長得像跪者,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熄求,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容