Rook部署Ceph​​#​


Rook版本

Ceph版本

K8S版本

Rook Ceph v1.8

Ceph Pacific v16.2.7 stable

kubernetes v1.20.4


1 Rook介绍​#

<span style="color:#596172"><span style="background-color:#f8f8f8">Rook是一个自管理的分布式存储编排系统,可以为Kubernetes提供便利的存储解决方案,Rook本身并不提供存储,而是在Kubernetes和存储之间
提供适配层,简化存储系统的部署和维护工作。目前,主要支持存储系统包括但不限于Ceph(主推)、Cassandra、NFS。
Rook复用了k8s集群节点用于自动化部署Ceph集群,优点是部署Ceph集群方便,缺点是如果Ceph集群出现故障,很难排查错误,我个人还是倾向于
使用独立的Ceph集群为k8s提供存储服务。

官网: https://rook.io
项目地址: https://github.com/rook</span></span>

2 Rook架构图​#


k8s部署rook ceph_镜像源

3 Rook在Kubernetes中部署Ceph​#

官方文档: ​​Ceph Docs​

(1) 先决条件

<span style="color:#596172"><span style="background-color:#f8f8f8">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-</span></span>

(2) 部署Ceph集群

<span style="color:#596172"><span style="background-color:#f8f8f8">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</span></span>

k8s部署rook ceph_镜像源_02

<span style="color:#596172"><span style="background-color:#f8f8f8">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</span></span>

(3) 部署Rook Ceph 工具

<span style="color:#596172"><span style="background-color:#f8f8f8">[root@k8s-master1 examples]# kubectl create -f toolbox.yaml</span></span>

(4) 部署Ceph Dashboard

<span style="color:#596172"><span style="background-color:#f8f8f8">[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</span></span>

(5) 查看pod、svc

<span style="color:#596172"><span style="background-color:#f8f8f8">[root@k8s-master1 examples]# kubectl get pod -o wide -n rook-ceph
[root@k8s-master1 examples]# kubectl get svc -n rook-ceph</span></span>

k8s部署rook ceph_html_03

(6) 通过ceph-tool工具pod查看ceph集群状态

<span style="color:#596172"><span style="background-color:#f8f8f8">[root@k8s-master1 examples]# kubectl exec -it pod/rook-ceph-tools-6979f5784f-84jpw -n rook-ceph -- bash</span></span>

k8s部署rook ceph_云原生_04

4 通过Ceph Dashboard查看Ceph集群状态​#

<span style="color:#596172"><span style="background-color:#f8f8f8">从svc状态中可以看到dashboard的svc类型为NodePort,对外暴露的端口为30493
https://<nodeip>:30493/
<nodeip>为172.16.1.81、82、83、84</span></span>

(1) 登录界面

k8s部署rook ceph_镜像源_05

(2) 集群状态UI

k8s部署rook ceph_html_06

(3) 主机UI

k8s部署rook ceph_镜像源_07

(4) pool UI

k8s部署rook ceph_html_08

5 测试​#

(1) RBD测试

<span style="color:#596172"><span style="background-color:#f8f8f8">[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</span></span>

(2) CephFS测试

<span style="color:#596172"><span style="background-color:#f8f8f8">[root@k8s-master1 examples]# kubectl apply -f filesystem.yaml
[root@k8s-master1 examples]# kubectl apply -f csi/cephfs/storageclass.yaml</span></span>

6 总结​#

<span style="color:#596172"><span style="background-color:#f8f8f8">通过rook复用k8s节点部署的ceph集群虽然部署方便,但是由于rook部署ceph时全程自动化且服务全部为pod导致后期维护ceph集群比较困难,我个人
并不建议在生产环境中使用rook部署ceph集群,生产中应独立部署ceph集群比较方便维护。还有一点是,当你重启k8s节点后,该节点上osd对应的磁盘
ceph集群会识别不到,这可能是一个bug吧,社区应该后期还会再改进。</span></span>