您好,登錄后才能下訂單哦!
基本概念解析:云原生存儲(chǔ)編排管理器。
基本概念詳解:rook通過一個(gè)操作器(operator)完成后續(xù)操作,只需要定義需要狀態(tài)就行了。Rook通過監(jiān)視器監(jiān)控狀態(tài)變化,并將配置文件分配到集群上生效。傳統(tǒng)意義上的集群管理員必須掌握和監(jiān)控系統(tǒng),而Rook存儲(chǔ)運(yùn)行則完全自動(dòng)化。rook存儲(chǔ)是通過第三方資源以kubernetes擴(kuò)展形式運(yùn)行。
rook operator: 是一個(gè)簡(jiǎn)單的容器,具有引導(dǎo)和監(jiān)視存儲(chǔ)集群的功能,供提供最基本的RADOS存儲(chǔ)。管理CRD,對(duì)象存儲(chǔ),文件系統(tǒng)。
Rook agent: 這些代理是在每個(gè)Kubernetes節(jié)點(diǎn)上部署的pod。每個(gè)代理都配置一個(gè)Flexvolume插件,該插件與Kubernetes的卷控制器框架集成在一起。處理節(jié)點(diǎn)上所需的所有存儲(chǔ)操作,例如附加網(wǎng)絡(luò)存儲(chǔ)設(shè)備,安裝卷和格式化文件系統(tǒng)。
Discover: 定期節(jié)點(diǎn)發(fā)現(xiàn)新設(shè)備
1.rook operator運(yùn)行,并在每臺(tái)機(jī)器上運(yùn)行一個(gè)rook agent的pod
2.創(chuàng)建一個(gè)pvc,并指定storageclass使用rook.io/block provisionor
3.operator provisionr 的provision()函數(shù)被調(diào)用,用以在集群中創(chuàng)建block image。此時(shí),Provision階段已完成,pvc/pv被考慮綁定到一起;
4.當(dāng)使用pvc的pod被創(chuàng)建時(shí),kubelete將調(diào)用 rook Felexxvolume的mount函數(shù),用于使用預(yù)定存儲(chǔ);
5. 隨后,agent將會(huì)按照CRD的描述創(chuàng)建一個(gè)volume并attach到該物理機(jī)上;
6.agent將volume map到本地機(jī)器上,并更新CRD的狀態(tài)以及設(shè)備的路徑值(例如/dev/rbd0)
7.控制權(quán)接著轉(zhuǎn)交給driver,如果mapping能夠成功執(zhí)行,則driver將把指定的設(shè)備mount到指定的路徑上。若在配置文件中還指明了文件系統(tǒng)的類型,則driver還會(huì)對(duì)該卷進(jìn)行文件系統(tǒng)格式化操作。
8.driver將反饋kubelet Mount()操作已成功
# 說在前面的重點(diǎn),刪除重建operator,cluster時(shí),要?jiǎng)h除/var/lib/rook.
cd cluster/examples/kubernetes/ceph
kubectl create -f operator.yaml
#主要是一些自定義資源對(duì)象的定義CRD有:Cluster、Filesystem、ObjectStore、Pool、Volume;還創(chuàng)建了rook的三種組件Operator、Agent、Discover。
kubectl create -f cluster.yaml
#cluster.yaml中主要?jiǎng)?chuàng)建了一個(gè)Cluster(ceph集群)自定義資源對(duì)象(CR)
#如果出現(xiàn)如下報(bào)錯(cuò),請(qǐng)參考如下
解決方案參考1:
配置operator.yaml,需要和kubelet的--volume-plugin-dir參數(shù)中的保持一致
vim operator.yaml
- name: FLEXVOLUME_DIR_PATH
value: "/usr/libexec/kubernetes/kubelet-plugins/volume/exec"
解決方案參考2
exit status 2. rbd: error opening pool 'replicapool': (2) No such file or directory -- 這個(gè)報(bào)錯(cuò),我有遇到類似的問題,解決方法:在 rook-operator.yml 里添加
env:
- name: FLEXVOLUME_DIR_PATH
value: "/var/lib/kubelet/volumeplugins"
確保與kubelet 的--volume-plugin-dir一樣。重新apply.重啟kubelet.把rook-agent 和 rook-operator的pod刪除,自動(dòng)重建后等10分鐘我的報(bào)錯(cuò)就消失了。
--volume-plugin-dir=/var/lib/kubelet/volumeplugins
- 清理命名空間rook-system,其中包含rook Operator和rook agent
- 清理名稱空間rook,其中包含rook存儲(chǔ)集群(集群CRD)
- 各節(jié)點(diǎn)的/var/lib/rook目錄,ceph mons和osds的配置都緩存于此
kubectl delete -n rook pool replicapool
kubectl delete storageclass rook-block
kubectl delete -n kube-system secret rook-admin
kubectl delete -f kube-registry.yaml
# 刪除Cluster CRD
kubectl delete -n rook cluster rook
# 當(dāng)Cluster CRD被刪除后,刪除Rook Operator和Agent
kubectl delete thirdpartyresources cluster.rook.io pool.rook.io objectstore.rook.io filesystem.rook.io volumeattachment.rook.io # ignore errors if on K8s 1.7+
kubectl delete crd clusters.rook.io pools.rook.io objectstores.rook.io filesystems.rook.io volumeattachments.rook.io # ignore errors if on K8s 1.5 and 1.6
kubectl delete -n rook-system daemonset rook-agent
kubectl delete -f rook-operator.yaml
kubectl delete clusterroles rook-agent
kubectl delete clusterrolebindings rook-agent
# 刪除名字空間
kubectl delete namespace rook
cluster.yaml
apiVersion: rook.io/v1alpha1
kind: Cluster
metadata:
name: rook
namespace: rook
spec:
# 存儲(chǔ)后端,支持Ceph,NFS等等
backend: ceph
# 配置文件在宿主機(jī)的存放目錄
dataDirHostPath: /var/lib/rook
# 如果設(shè)置為true則使用宿主機(jī)的網(wǎng)絡(luò),而非容器的SDN(軟件定義網(wǎng)絡(luò))
hostNetwork: false
# 啟動(dòng)mon的數(shù)量,必須奇數(shù),1-9之間
monCount: 3
# 控制Rook的各種服務(wù)如何被K8S調(diào)度
placement:
# 總體規(guī)則,具體服務(wù)(api, mgr, mon, osd)的規(guī)則覆蓋總體規(guī)則
all:
# Rook的Pod能夠被調(diào)用到什么節(jié)點(diǎn)上(根據(jù)pod標(biāo)簽來說)
nodeAffinity:
# 硬限制 配置變更后已經(jīng)運(yùn)行的Pod不被影響
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
# 節(jié)點(diǎn)必須具有role=storage-node
- matchExpressions:
- key: role
operator: In
values:
- storage-node
# Rook能夠調(diào)用到運(yùn)行了怎樣的其它Pod的拓?fù)溆蛏希ǜ鶕?jù)node容忍度來說)
podAffinity:
podAntiAffinity:
# 可以容忍具有哪些taint的節(jié)點(diǎn)
tolerations:
- key: storage-node
operator: Exists
api:
nodeAffinity:
podAffinity:
podAntiAffinity:
tolerations:
mgr:
nodeAffinity:
podAffinity:
podAntiAffinity:
tolerations:
mon:
nodeAffinity:
tolerations:
osd:
nodeAffinity:
podAffinity:
podAntiAffinity:
tolerations:
# 配置各種服務(wù)的資源需求
resources:
api:
limits:
cpu: "500m"
memory: "1024Mi"
requests:
cpu: "500m"
memory: "1024Mi"
mgr:
mon:
osd:
# 集群級(jí)別的存儲(chǔ)配置,每個(gè)節(jié)點(diǎn)都可以覆蓋
storage:
# 是否所有節(jié)點(diǎn)都用于存儲(chǔ)。如果指定nodes配置,則必須設(shè)置為false
useAllNodes: true
# 是否在節(jié)點(diǎn)上發(fā)現(xiàn)的所有設(shè)備,都自動(dòng)的被OSD消費(fèi)
useAllDevices: false
# 正則式,指定哪些設(shè)備可以被OSD消費(fèi),示例:
# sdb 僅僅使用設(shè)備/dev/sdb
# ^sd. 使用所有/dev/sd*設(shè)備
# ^sd[a-d] 使用sda sdb sdc sdd
# 可以指定裸設(shè)備,Rook會(huì)自動(dòng)分區(qū)但不掛載
deviceFilter: ^vd[b-c]
# 每個(gè)節(jié)點(diǎn)上用于存儲(chǔ)OSD元數(shù)據(jù)的設(shè)備。使用低讀取延遲的設(shè)備,例如SSD/NVMe存儲(chǔ)元數(shù)據(jù)可以提升性能
metadataDevice:
# 集群的位置信息,例如Region或數(shù)據(jù)中心,被直接傳遞給Ceph CRUSH map
location:
# OSD的存儲(chǔ)格式的配置信息
storeConfig:
# 可選filestore或bluestore,默認(rèn)后者,它是Ceph的一個(gè)新的存儲(chǔ)引擎
# bluestore直接管理裸設(shè)備,拋棄了ext4/xfs等本地文件系統(tǒng)。在用戶態(tài)下使用Linux AIO直接對(duì)裸設(shè)備IO
storeType: bluestore
# bluestore數(shù)據(jù)庫(kù)容量 正常尺寸的磁盤可以去掉此參數(shù),例如100GB+
databaseSizeMB: 1024
# filestore日志容量 正常尺寸的磁盤可以去掉此參數(shù),例如20GB+
journalSizeMB: 1024
# 用于存儲(chǔ)的節(jié)點(diǎn)目錄。在一個(gè)物理設(shè)備上使用兩個(gè)目錄,會(huì)對(duì)性能有負(fù)面影響
directories:
- path: /rook/storage-dir
# 可以針對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行配置
nodes:
# 節(jié)點(diǎn)A的配置
- name: "172.17.4.101"
directories:
- path: "/rook/storage-dir"
resources:
limits:
cpu: "500m"
memory: "1024Mi"
requests:
cpu: "500m"
memory: "1024Mi"
# 節(jié)點(diǎn)B的配置
- name: "172.17.4.201"
- name: "sdb"
- name: "sdc"
storeConfig:
storeType: bluestore
- name: "172.17.4.301"
deviceFilter: "^sd."
pool.yaml
apiVersion: rook.io/v1alpha1
kind: Pool
metadata:
name: ecpool
namespace: rook
spec:
# 存儲(chǔ)池中的每份數(shù)據(jù)是否是復(fù)制的
replicated:
# 副本的份數(shù)
size: 3
# Ceph的Erasure-coded存儲(chǔ)池消耗更少的存儲(chǔ)空間,必須禁用replicated
erasureCoded:
# 每個(gè)對(duì)象的數(shù)據(jù)塊數(shù)量
dataChunks: 2
# 每個(gè)對(duì)象的代碼塊數(shù)量
codingChunks: 1
crushRoot: default
?
objectStore
apiVersion: rook.io/v1alpha1
kind: ObjectStore
metadata:
name: my-store
namespace: rook
spec:
# 元數(shù)據(jù)池,僅支持replication
metadataPool:
replicated:
size: 3
# 數(shù)據(jù)池,支持replication或erasure codin
dataPool:
erasureCoded:
dataChunks: 2
codingChunks: 1
# RGW守護(hù)程序設(shè)置
gateway:
# 支持S3
type: s3
# 指向K8S的secret,包含數(shù)字證書信息
sslCertificateRef:
# RGW Pod和服務(wù)監(jiān)聽的端口
port: 80
securePort:
# 為此對(duì)象存儲(chǔ)提供負(fù)載均衡的RGW Pod數(shù)量
instances: 1
# 是否在所有節(jié)點(diǎn)上啟動(dòng)RGW。如果為false則必須設(shè)置instances
allNodes: false
placement:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: role
operator: In
values:
- rgw-node
tolerations:
- key: rgw-node
operator: Exists
podAffinity:
podAntiAffinity:
resources:
limits:
cpu: "500m"
memory: "1024Mi"
requests:
cpu: "500m"
memory: "1024Mi"
filesystem
apiVersion: rook.io/v1alpha1
kind: Filesystem
metadata:
name: myfs
namespace: rook
spec:
# 元數(shù)據(jù)池
metadataPool:
replicated:
size: 3
# 數(shù)據(jù)池
dataPools:
- erasureCoded:
dataChunks: 2
codingChunks: 1
# MDS守護(hù)程序的設(shè)置
metadataServer:
# MDS活動(dòng)實(shí)例數(shù)量
activeCount: 1
# 如果設(shè)置為true,則額外的MDS實(shí)例處于主動(dòng)Standby狀態(tài),維持文件系統(tǒng)元數(shù)據(jù)的熱緩存
# 如果設(shè)置為false,則額外MDS實(shí)例處于被動(dòng)Standby狀態(tài)
activeStandby: true
placement:
resources:
PV訪問方式:
ReadWriteOnce – 被單個(gè)節(jié)點(diǎn)mount為讀寫rw模式 RWO
ReadOnlyMany – 被多個(gè)節(jié)點(diǎn)mount為只讀ro模式 ROX
ReadWriteMany – 被多個(gè)節(jié)點(diǎn)mount為讀寫rw模式 RWX
pv回收機(jī)制:
Retain – 手動(dòng)重新使用
Recycle – 基本的刪除操作 (“rm -rf /thevolume/*”)
Delete – 關(guān)聯(lián)的后端存儲(chǔ)卷一起刪除,后端存儲(chǔ)例如AWS EBS, GCE PD或OpenStack Cinder
volume的狀態(tài):
Available –閑置狀態(tài),沒有被綁定到PVC
Bound – 綁定到PVC
Released – PVC被刪掉,資源沒有被在利用
Failed – 自動(dòng)回收失敗
CLI會(huì)顯示綁定到PV的PVC名。
rook啟動(dòng)后各pod作用
mon:監(jiān)控組件,負(fù)責(zé)監(jiān)控ceph集群的狀況。
mgr:manager組件,主要監(jiān)控一些非paxos相關(guān)組件(比如pg相關(guān)統(tǒng)計(jì)信息),無狀態(tài)組件。
收集可供prometheus指標(biāo)
啟動(dòng)ceph dashboard
osd:osd組件,集群核心組件
mds: 元數(shù)據(jù)服務(wù)器。一或多個(gè)mds 協(xié)作管理文件系統(tǒng)的命名空間、協(xié)調(diào)到共享osd集群的訪問。當(dāng)在集群中聲明要一個(gè)共享文件系統(tǒng)時(shí),rook會(huì):為cephfs創(chuàng)建matadata和數(shù)據(jù)池;創(chuàng)建文件系統(tǒng);指定數(shù)量active-standby的mds實(shí)例。創(chuàng)建的文件系統(tǒng)會(huì)被集群中pod使用
rgw:為應(yīng)用提供RESTful類型對(duì)象存儲(chǔ)接口
1.為對(duì)象創(chuàng)建metada和數(shù)據(jù)池
2.啟動(dòng)rgw daemon
3.創(chuàng)建service為rgw damon提供一個(gè)負(fù)載均衡地址。
通過圖形界面管理,部署dashboard
cd /rook/cluster/examples/kubernetes/ceph
kubectl apply -f dashboard-external-http.yaml
kubectl get svc -n rook-ceph
#查看端口號(hào)
#通過瀏覽器訪問
創(chuàng)建塊存儲(chǔ)storageclass
1.查看ceph數(shù)據(jù)盤文件類型
df -Th
2.根據(jù)ceph數(shù)據(jù)盤的文件系統(tǒng)類型修改fstype參數(shù)
vims torageclass.yaml
fstype: xfs
3.創(chuàng)建storageclass
kubectl create -f storageclass.yaml
創(chuàng)建塊使用實(shí)例
cd /rook/cluster/examples/kubernetes
kubectl apply -f mysql.yaml
kubectl apply -f wordpress.yaml
創(chuàng)建共享文件系統(tǒng)
cd /rook/cluster/examples/kubernetes/ceph
kubectl create -f filesystem.yaml
kubectl get Filesystem -n rook-ceph
共同探討,一起思考。希望可以輔助大家理解!
參考資源:
基于rook的kubernetes方案
rook控制流
rook詳解
rook-github
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。