Rook版本 | Ceph版本 | K8S版本 |
---|---|---|
Rook Ceph v1.8 | Ceph Pacific v16.2.7 stable | kubernetes v1.20.4 |
1 Rook介紹
Rook是一個自管理的分布式存儲編排系統,可以為Kubernetes提供便利的存儲解決方案,Rook本身並不提供存儲,而是在Kubernetes和存儲之間
提供適配層,簡化存儲系統的部署和維護工作。目前,主要支持存儲系統包括但不限於Ceph(主推)、Cassandra、NFS。
Rook復用了k8s集群節點用於自動化部署Ceph集群,優點是部署Ceph集群方便,缺點是如果Ceph集群出現故障,很難排查錯誤,我個人還是傾向於
使用獨立的Ceph集群為k8s提供存儲服務。
官網: https://rook.io
項目地址: https://github.com/rook
2 Rook架構圖
官方文檔: https://rook.io/docs/rook/v1.8/ceph-storage.html
3 Rook在Kubernetes中部署Ceph
官方文檔: https://rook.io/docs/rook/v1.8/quickstart.html
(1) 先決條件
1) K8s集群,1.16版本+
2) K8s至少3個工作節點
3) 每個工作節點有一塊未使用的硬盤
4) Rook僅支持部署Ceph Nautilus(14.2.22)以上版本
注:
我這里k8s集群有4個節點,分別是k8s-master1、k8s-master2、k8s-node1、k8s-node2,四個節點各掛載一塊20GB的未使用的
硬盤作為osd提供存儲服務。k8s-master2節點需要去污點,允許pod調度,命令如下。
# kubectl taint node k8s-master2 node-role.kubernetes.io/master-
(2) 部署Ceph集群
1) 下載包並解壓
[root@k8s-master1 ~]# wget https://github.com/rook/rook/archive/refs/tags/v1.8.0.zip
[root@k8s-master1 ~]# unzip v1.8.0.zip
[root@k8s-master1 ~]# cd rook-1.8.0/deploy/examples/
2) 部署所用到的鏡像如下
[root@k8s-master1 examples]# cat images.txt
k8s.gcr.io/sig-storage/csi-attacher:v3.3.0
k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0
k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0
k8s.gcr.io/sig-storage/csi-resizer:v1.3.0
k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0
quay.io/ceph/ceph:v16.2.7
quay.io/cephcsi/cephcsi:v3.4.0
quay.io/csiaddons/volumereplication-operator:v0.1.0
rook/ceph:v1.8.0
注:
由於以上鏡像的鏡像源在國外,國內無法下載,前五個鏡像源我修改為阿里官方同步國外的鏡像源
(registry.aliyuncs.com/google_containers/<image>:<tag>),后四個鏡像我FQ下
載后上傳到阿里個人賬號的鏡像倉庫下了(registry.cn-hangzhou.aliyuncs.com/rook_image/<image>:<tag>)。
# grep <鏡像名> crds.yaml common.yaml operator.yaml cluster.yaml toolbox.yaml dashboard-external-https.yaml
3) 應用yaml文件
[root@k8s-master1 examples]# kubectl create -f crds.yaml -f common.yaml -f operator.yaml
# 開始部署集群,有些鏡像比較大(大於1G),pod完全啟動大概1個小時左右
[root@k8s-master1 examples]# kubectl create -f cluster.yaml
(3) 部署Rook Ceph 工具
[root@k8s-master1 examples]# kubectl create -f toolbox.yaml
(4) 部署Ceph Dashboard
[root@k8s-master1 examples]# kubectl apply -f dashboard-external-https.yaml
# 獲取 dashboard admin密碼
[root@k8s-master1 examples]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o \
jsonpath="{['data']['password']}" | base64 -d
輸出 admin 用戶的密碼為: *Pfl:f_6FDSLZVO)*-,7
(5) 查看pod、svc
[root@k8s-master1 examples]# kubectl get pod -o wide -n rook-ceph
[root@k8s-master1 examples]# kubectl get svc -n rook-ceph
(6) 通過ceph-tool工具pod查看ceph集群狀態
[root@k8s-master1 examples]# kubectl exec -it pod/rook-ceph-tools-6979f5784f-84jpw -n rook-ceph -- bash
4 通過Ceph Dashboard查看Ceph集群狀態
從svc狀態中可以看到dashboard的svc類型為NodePort,對外暴露的端口為30493
https://<nodeip>:30493/
<nodeip>為172.16.1.81、82、83、84
5 測試
(1) RBD測試
[root@k8s-master1 examples]# kubectl apply -f csi/rbd/storageclass.yaml # 創建一個名為replicapool的rbd pool
[root@k8s-master1 examples]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 12m
[root@k8s-master1 examples]# kubectl apply -f mysql.yaml # 在default命名空間下
[root@k8s-master1 examples]# kubectl apply -f wordpress.yaml # 在default命名空間下
[root@k8s-master1 examples]# kubectl get pv,pvc -n default
[root@k8s-master1 examples]# kubectl get pod,svc -n default
(2) CephFS測試
[root@k8s-master1 examples]# kubectl apply -f filesystem.yaml
[root@k8s-master1 examples]# kubectl apply -f csi/cephfs/storageclass.yaml
6 總結
通過rook復用k8s節點部署的ceph集群雖然部署方便,但是由於rook部署ceph時全程自動化且服務全部為pod導致后期維護ceph集群比較困難,我個人
並不建議在生產環境中使用rook部署ceph集群,生產中應獨立部署ceph集群比較方便維護。還有一點是,當你重啟k8s節點后,該節點上osd對應的磁盤
ceph集群會識別不到,這可能是一個bug吧,社區應該后期還會再改進。