一 Rook概述 1.1 Ceph簡介 Ceph是一種高度可擴展的分散式存儲解決方案,提供對象、文件和塊存儲。在每個存儲節點上,將找到Ceph存儲對象的文件系統和Ceph OSD(對象存儲守護程式)進程。在Ceph集群上,還存在Ceph MON(監控)守護程式,它們確保Ceph集群保持高可用性。 更 ...
一 Rook概述
1.1 Ceph簡介
Ceph是一種高度可擴展的分散式存儲解決方案,提供對象、文件和塊存儲。在每個存儲節點上,將找到Ceph存儲對象的文件系統和Ceph OSD(對象存儲守護程式)進程。在Ceph集群上,還存在Ceph MON(監控)守護程式,它們確保Ceph集群保持高可用性。 更多Ceph介紹參考:https://www.cnblogs.com/itzgr/category/1382602.html1.2 Rook簡介
Rook 是一個開源的cloud-native storage編排, 提供平臺和框架;為各種存儲解決方案提供平臺、框架和支持,以便與雲原生環境本地集成。目前主要專用於Cloud-Native環境的文件、塊、對象存儲服務。它實現了一個自我管理的、自我擴容的、自我修複的分散式存儲服務。 Rook支持自動部署、啟動、配置、分配(provisioning)、擴容/縮容、升級、遷移、災難恢復、監控,以及資源管理。為了實現所有這些功能,Rook依賴底層的容器編排平臺,例如 kubernetes、CoreOS 等。。 Rook 目前支持Ceph、NFS、Minio Object Store、Edegefs、Cassandra、CockroachDB 存儲的搭建。 Rook機制:- Rook 提供了捲插件,來擴展了 K8S 的存儲系統,使用 Kubelet 代理程式 Pod 可以掛載 Rook 管理的塊設備和文件系統。
- Rook Operator 負責啟動並監控整個底層存儲系統,例如 Ceph Pod、Ceph OSD 等,同時它還管理 CRD、對象存儲、文件系統。
- Rook Agent 代理部署在 K8S 每個節點上以 Pod 容器運行,每個代理 Pod 都配置一個 Flexvolume 驅動,該驅動主要用來跟 K8S 的捲控制框架集成起來,每個節點上的相關的操作,例如添加存儲設備、掛載、格式化、刪除存儲等操作,都有該代理來完成。
1.3 Rook架構
Rook架構如下:

二 Rook部署
2.1 前期規劃
提示:本實驗不涉及Kubernetes部署,Kubernetes部署參考《附012.Kubeadm部署高可用Kubernetes》。2.2 獲取YAML
[root@k8smaster01 ~]# git clone https://github.com/rook/rook.git2.3 部署Rook Operator
本實驗使用k8snode01——k8snode03三個節點,因此需要如下修改: [root@k8smaster01 ceph]# kubectl taint node k8smaster01 node-role.kubernetes.io/master="":NoSchedule [root@k8smaster01 ceph]# kubectl taint node k8smaster02 node-role.kubernetes.io/master="":NoSchedule [root@k8smaster01 ceph]# kubectl taint node k8smaster03 node-role.kubernetes.io/master="":NoSchedule [root@k8smaster01 ceph]# kubectl label nodes {k8snode01,k8snode02,k8snode03} ceph-osd=enabled [root@k8smaster01 ceph]# kubectl label nodes {k8snode01,k8snode02,k8snode03} ceph-mon=enabled [root@k8smaster01 ceph]# kubectl label nodes k8snode01 ceph-mgr=enabled 提示:當前版本rook中mgr只能支持一個節點運行。[root@k8smaster01 ~]# cd /root/rook/cluster/examples/kubernetes/ceph/ [root@k8smaster01 ceph]# kubectl create -f common.yaml [root@k8smaster01 ceph]# kubectl create -f operator.yaml 解讀:如上創建了相應的基礎服務(如serviceaccounts),同時rook-ceph-operator會在每個節點創建 rook-ceph-agent 和 rook-discover。
2.4 配置cluster
[root@k8smaster01 ceph]# vi cluster.yaml1 apiVersion: ceph.rook.io/v1 2 kind: CephCluster 3 metadata: 4 name: rook-ceph 5 namespace: rook-ceph 6 spec: 7 cephVersion: 8 image: ceph/ceph:v14.2.4-20190917 9 allowUnsupported: false 10 dataDirHostPath: /var/lib/rook 11 skipUpgradeChecks: false 12 mon: 13 count: 3 14 allowMultiplePerNode: false 15 dashboard: 16 enabled: true 17 ssl: true 18 monitoring: 19 enabled: false 20 rulesNamespace: rook-ceph 21 network: 22 hostNetwork: false 23 rbdMirroring: 24 workers: 0 25 placement: #配置特定節點親和力保證Node作為存儲節點 26 # all: 27 # nodeAffinity: 28 # requiredDuringSchedulingIgnoredDuringExecution: 29 # nodeSelectorTerms: 30 # - matchExpressions: 31 # - key: role 32 # operator: In 33 # values: 34 # - storage-node 35 # tolerations: 36 # - key: storage-node 37 # operator: Exists 38 mon: 39 nodeAffinity: 40 requiredDuringSchedulingIgnoredDuringExecution: 41 nodeSelectorTerms: 42 - matchExpressions: 43 - key: ceph-mon 44 operator: In 45 values: 46 - enabled 47 tolerations: 48 - key: ceph-mon 49 operator: Exists 50 ods: 51 nodeAffinity: 52 requiredDuringSchedulingIgnoredDuringExecution: 53 nodeSelectorTerms: 54 - matchExpressions: 55 - key: ceph-osd 56 operator: In 57 values: 58 - enabled 59 tolerations: 60 - key: ceph-osd 61 operator: Exists 62 mgr: 63 nodeAffinity: 64 requiredDuringSchedulingIgnoredDuringExecution: 65 nodeSelectorTerms: 66 - matchExpressions: 67 - key: ceph-mgr 68 operator: In 69 values: 70 - enabled 71 tolerations: 72 - key: ceph-mgr 73 operator: Exists 74 annotations: 75 resources: 76 removeOSDsIfOutAndSafeToRemove: false 77 storage: 78 useAllNodes: false #關閉使用所有Node 79 useAllDevices: false #關閉使用所有設備 80 deviceFilter: sdb 81 config: 82 metadataDevice: 83 databaseSizeMB: "1024" 84 journalSizeMB: "1024" 85 nodes: 86 - name: "k8snode01" #指定存儲節點主機 87 config: 88 storeType: bluestore #指定類型為裸磁碟 89 devices: 90 - name: "sdb" #指定磁碟為sdb 91 - name: "k8snode02" 92 config: 93 storeType: bluestore 94 devices: 95 - name: "sdb" 96 - name: "k8snode03" 97 config: 98 storeType: bluestore 99 devices: 100 - name: "sdb" 101 disruptionManagement: 102 managePodBudgets: false 103 osdMaintenanceTimeout: 30 104 manageMachineDisruptionBudgets: false 105 machineDisruptionBudgetNamespace: openshift-machine-api提示:更多cluster的CRD配置參考:https://github.com/rook/rook/blob/master/Documentation/ceph-cluster-crd.md。 https://blog.gmem.cc/rook-based-k8s-storage-solution
2.5 獲取鏡像
可能由於國內環境無法Pull鏡像,建議提前pull如下鏡像: docker pull rook/ceph:master docker pull quay.azk8s.cn/cephcsi/cephcsi:v1.2.2 docker pull quay.azk8s.cn/k8scsi/csi-node-driver-registrar:v1.1.0 docker pull quay.azk8s.cn/k8scsi/csi-provisioner:v1.4.0 docker pull quay.azk8s.cn/k8scsi/csi-attacher:v1.2.0 docker pull quay.azk8s.cn/k8scsi/csi-snapshotter:v1.2.2docker tag quay.azk8s.cn/cephcsi/cephcsi:v1.2.2 quay.io/cephcsi/cephcsi:v1.2.2 docker tag quay.azk8s.cn/k8scsi/csi-node-driver-registrar:v1.1.0 quay.io/k8scsi/csi-node-driver-registrar:v1.1.0 docker tag quay.azk8s.cn/k8scsi/csi-provisioner:v1.4.0 quay.io/k8scsi/csi-provisioner:v1.4.0 docker tag quay.azk8s.cn/k8scsi/csi-attacher:v1.2.0 quay.io/k8scsi/csi-attacher:v1.2.0 docker tag quay.azk8s.cn/k8scsi/csi-snapshotter:v1.2.2 quay.io/k8scsi/csi-snapshotter:v1.2.2
docker rmi quay.azk8s.cn/cephcsi/cephcsi:v1.2.2 docker rmi quay.azk8s.cn/k8scsi/csi-node-driver-registrar:v1.1.0 docker rmi quay.azk8s.cn/k8scsi/csi-provisioner:v1.4.0 docker rmi quay.azk8s.cn/k8scsi/csi-attacher:v1.2.0 docker rmi quay.azk8s.cn/k8scsi/csi-snapshotter:v1.2.2
2.6 部署cluster
[root@k8smaster01 ceph]# kubectl create -f cluster.yaml [root@k8smaster01 ceph]# kubectl logs -f -n rook-ceph rook-ceph-operator-cb47c46bc-pszfh #可查看部署log [root@k8smaster01 ceph]# kubectl get pods -n rook-ceph -o wide #需要等待一定時間,部分中間態容器可能會波動
2.7 部署Toolbox
toolbox是一個rook的工具集容器,該容器中的命令可以用來調試、測試Rook,對Ceph臨時測試的操作一般在這個容器內執行。 [root@k8smaster01 ceph]# kubectl create -f toolbox.yaml [root@k8smaster01 ceph]# kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" NAME READY STATUS RESTARTS AGE rook-ceph-tools-59b8cccb95-9rl5l 1/1 Running 0 15s2.8 測試Rook
[root@k8smaster01 ceph]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash [root@rook-ceph-tools-59b8cccb95-9rl5l /]# ceph status #查看Ceph狀態



2.10 複製key和config
為方便管理,可將Ceph的keyring和config在master節點也創建一份,從而實現在Kubernetes外部宿主機對rook Ceph集群的簡單查看。 [root@k8smaster01 ~]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') cat /etc/ceph/ceph.conf > /etc/ceph/ceph.conf [root@k8smaster01 ~]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') cat /etc/ceph/keyring > /etc/ceph/keyring[root@k8smaster01 ceph]# tee /etc/yum.repos.d/ceph.repo <<-'EOF' [Ceph] name=Ceph packages for $basearch baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/$basearch enabled=1 gpgcheck=0 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc priority=1
[Ceph-noarch] name=Ceph noarch packages baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch enabled=1 gpgcheck=0 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc priority=1
[ceph-source] name=Ceph source packages baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS enabled=1 gpgcheck=0 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc priority=1 EOF [root@k8smaster01 ceph]# yum -y install ceph-common ceph-fuse #安裝客戶端 [root@k8smaster01 ~]# ceph status