Rook 部署 Ceph 集群及 Kubernetes 存储对接实战
一、Rook 概述
Rook 是一款开源的云原生存储编排器,专为 Kubernetes 设计,旨在实现 Ceph 分布式存储系统的自动化部署与管理。它通过 Kubernetes Operator 框架,将 Ceph 的复杂存储管理任务简化为一系列自动化流程,使存储服务具备自我管理、自我扩展和自我修复的能力。
Rook 与 Ceph 的结合,为 Kubernetes 提供了文件、块和对象三种存储类型的支持,满足了不同应用场景下的存储需求。Rook 项目由云原生计算基金会(CNCF)托管,是毕业级项目,具有高度的稳定性和可靠性。
二、环境准备
硬件环境
本次实战基于以下硬件环境:
主机名 | IP 地址 | 主机配置 |
---|---|---|
master231 | 10.0.0.231/24 | 4Core8GB/100G+300G+500G |
master232 | 10.0.0.232/24 | 4Core8GB/100G+300G+500G |
master233 | 10.0.0.233/24 | 4Core8GB/100G+300G+500G |
软件环境
-
Kubernetes 版本:v1.23.17
-
Rook 版本:v1.13.10
检查磁盘
在各个节点上检查磁盘情况:
[root@master231 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
sdb 8:16 0 300G 0 disk
sdc 8:32 0 500G 0 disk
移除污点
为了使节点能够运行 Pod,移除 master 节点的污点:
[root@master231 ~]# kubectl taint node master231 node-role.kubernetes.io/master-
三、Rook 部署 Ceph 集群
下载并解压 Rook
[root@master231 ~]# wget https://github.com/rook/rook/archive/refs/tags/v1.13.10.tar.gz
[root@master231 ~]# tar xf rook-1.13.10.tar.gz
部署 Rook Operator
进入解压后的目录,部署 Rook Operator:
[root@master231 examples]# kubectl apply -f crds.yaml -f common.yaml -f operator.yaml
部署 Ceph 集群
部署 Ceph 集群:
[root@master231 examples]# kubectl apply -f cluster.yaml
部署 Rook Ceph 工具
部署 Rook Ceph 工具,用于后续的命令行操作:
[root@master231 examples]# kubectl apply -f toolbox.yaml
部署 Ceph Dashboard
部署 Ceph Dashboard,用于图形化管理 Ceph 集群:
[root@master231 examples]# kubectl apply -f dashboard-external-https.yaml
查看 Pod 列表
查看 Rook Ceph 相关的 Pod 状态,确认所有组件正常运行:
[root@master231 examples]# kubectl get pods,svc -n rook-ceph -o wide
获取 Ceph Dashboard 登录密码
获取 Dashboard 的登录密码:
[root@master231 /k8s/manifests/helm]# kubectl -n rook-ceph get secrets rook-ceph-dashboard-password -o jsonpath='{.data.password}' | base64 -d ;echo
-`-^>D'()^5f}/B!3`8{
[root@master231 examples]#
访问 Ceph Dashboard
通过以下命令获取 Dashboard 的访问地址:
[root@master231 examples]# kubectl get svc -n rook-ceph
访问 https://{任意节点IP}:32588
即可登录 Dashboard。
基于命令行访问 Ceph 集群
找到 Rook 提供的命令行工具 Pod:
[root@master231 examples]# kubectl get pods -n rook-ceph -l app=rook-ceph-tools
进入工具 Pod,执行 Ceph 命令查看集群状态:
[root@master231 examples]# kubectl -n rook-ceph exec -it rook-ceph-tools-5846d4dc6c-cxbxb -- sh
sh-4.4$ ceph -s
查看 Ceph 集群的 OSD 树结构:
sh-4.4$ ceph osd tree
四、Kubernetes 对接 Ceph 的 RBD 块存储基于 keyring 文件认证实战
创建存储池和块设备
在 Ceph 集群中创建存储池和块设备:
sh-4.4$ ceph osd pool create caofacan
sh-4.4$ ceph osd pool application enable caofacan rbd
sh-4.4$ rbd create -s 2048 linux96 -p caofacan
安装 Ceph 客户端模块
在所有 Kubernetes 节点上安装 Ceph 客户端模块:
[root@master231 ~]# apt -y install ceph-common
拷贝客户端证书文件
将 Ceph 客户端证书文件拷贝到所有节点:
[root@master231 volumes]# kubectl -n rook-ceph cp rook-ceph-tools-5846d4dc6c-lrgm8:/etc/ceph/keyring /etc/ceph/keyring
编写资源清单文件
编写 Kubernetes Deployment 资源清单文件,挂载 RBD 块设备:
[root@master231 volumes]# cat 01-deploy-volumes-rbd.yaml
部署并验证
部署资源清单文件,验证 Pod 是否正常运行:
[root@master231 volumes]# kubectl apply -f 01-deploy-volumes-rbd.yaml
[root@master231 volumes]# kubectl get po
通过 curl 命令验证服务是否正常:
[root@master231 volumes]# curl 10.100.0.74
五、Kubernetes 基于 Secret 存储 Ceph 的认证信息对接 RBD
移除认证信息
移除所有 worker 节点上的认证信息:
[root@master231 ~]# rm -f /etc/ceph/keyring
将认证信息基于 Secret 存储
在 Kubernetes 中创建 Secret,存储 Ceph 认证信息:
[root@master231 volumes]# kubectl -n rook-ceph exec rook-ceph-tools-5846d4dc6c-cxbxb -- ceph auth print-key client.admin;echo
编写资源清单文件,引用 Secret:
[root@master231 volumes]# cat 02-deploy-volumes-rbd-secretRef.yaml
部署并验证
部署资源清单文件,验证 Pod 是否正常运行:
[root@master231 volumes]# kubectl apply -f 02-deploy-volumes-rbd-secretRef.yaml
通过 curl 命令验证服务是否正常:
[root@master231 volumes]# curl 10.100.0.75
六、Kubernetes 对接 CephFS 文件系统
创建元数据存储池和数据存储池
在 Ceph 集群中创建元数据存储池和数据存储池:
sh-4.4$ ceph osd pool create caofacan-cephfs-metadata
sh-4.4$ ceph osd pool create caofacan-cephfs-data
查看 Ceph 集群现有的文件系统
查看当前 Ceph 集群中已有的文件系统:
sh-4.4$ ceph fs ls
创建 CephFS 实例
创建 CephFS 文件系统实例:
sh-4.4$ ceph fs new caofacan-linux96-cephfs caofacan-cephfs-metadata caofacan-cephfs-data
查看 CephFS 状态信息
再次查看 Ceph 集群中的文件系统:
sh-4.4$ ceph fs ls
创建文件系统
部署 CephFS 文件系统相关资源:
[root@master231 examples]# kubectl apply -f filesystem-ec.yaml
查看 CephFS 的 MDS Pod 状态:
[root@master231 examples]# kubectl get pods -o wide -n rook-ceph -l ceph_daemon_type=mds
测试验证
编写 Kubernetes Deployment 资源清单文件,挂载 CephFS 文件系统:
[root@master231 volumes]# cat 03-deploy-volumes-cephfs-secretRef.yaml
部署并验证
部署资源清单文件,验证 Pod 是否正常运行:
[root@master231 volumes]# kubectl apply -f 03-deploy-volumes-cephfs-secretRef.yaml
[root@master231 volumes]# kubectl get pods -o wide
进入 Pod 修改数据,验证数据一致性:
[root@master231 volumes]# kubectl exec -it xiuxian-volume-cephfs-secretref-b446f8745-7zbtq -- sh
/ # echo "https://www.caofacan.com" > /usr/share/nginx/html/index.html
通过 curl 命令验证数据是否一致:
[root@master231 volumes]# curl 10.100.203.184
七、Kubernetes 的 CSI 对接 Ceph 的 RBD 动态存储类
安装 RBD 的 StorageClass
进入 Rook 提供的 CSI 驱动目录,部署 RBD 的 StorageClass:
[root@master231 rbd]# kubectl apply -f storageclass.yaml
查看创建的 StorageClass:
[root@master231 rbd]# kubectl get sc rook-ceph-block
创建 PVC
创建 PersistentVolumeClaim (PVC),申请存储资源:
[root@master231 rbd]# cat pvc.yaml
部署 PVC:
[root@master231 rbd]# kubectl apply -f pvc.yaml
查看 PVC 状态:
[root@master231 rbd]# kubectl get pv,pvc,sc
验证后端存储块设备
查看后端 Ceph 集群中创建的存储块设备:
sh-4.4$ rbd ls replicapool -l
测试验证
编写 Kubernetes Deployment 资源清单文件,使用 PVC:
[root@master231 volumes]# cat 04-deploy-pvc.yaml
部署资源清单文件,验证 Pod 是否正常运行:
[root@master231 volumes]# kubectl apply -f 04-deploy-pvc.yaml
[root@master231 volumes]# kubectl get pods -o wide
八、Kubernetes 的 CSI 对接 Ceph 的 CephFS 动态存储类
创建 CephFS 的 StorageClass
进入 CephFS 的 CSI 驱动目录,部署 CephFS 的 StorageClass:
[root@master231 cephfs]# kubectl apply -f storageclass-ec.yaml
查看创建的 StorageClass:
[root@master231 cephfs]# kubectl get sc
创建 PVC
创建 PersistentVolumeClaim (PVC),申请存储资源:
[root@master231 cephfs]# cat 04-pvc-cephfs.yaml
部署 PVC:
[root@master231 cephfs]# kubectl apply -f 04-pvc-cephfs.yaml
查看 PVC 状态:
[root@master231 cephfs]# kubectl get pvc
使用 PVC
编写 Kubernetes Deployment 资源清单文件,使用 PVC:
[root@master231 cephfs]# cat 05-deploy-pvc-sc-cephfs.yaml
部署资源清单文件,验证 Pod 是否正常运行:
[root@master231 cephfs]# kubectl apply -f 05-deploy-pvc-sc-cephfs.yaml
[root@master231 cephfs]# kubectl get po
写入数据测试
进入 Pod 写入数据,验证数据持久化:
[root@master231 cephfs]# kubectl exec -it deploy-xiuxian-cephfs-sc-5f9775c869-dm5cr -- sh
/ # echo 11111111111111111111 >/usr/share/nginx/html/index.html
通过 curl 命令验证数据是否一致:
[root@master231 cephfs]# curl 10.100.140.83
删除 Pod 验证数据持久化
删除所有 Pod,验证数据是否持久化:
[root@master231 cephfs]# kubectl delete pod --all
查看新创建的 Pod,验证数据是否一致:
[root@master231 cephfs]# kubectl get po -o wide
[root@master231 cephfs]# curl 10.100.140.102
验证远端 Rook 部署的 Ceph 集群数据
查看 PVC 对应的后端存储 VolumeHandle:
[root@master231 cephfs]# kubectl get pvc
[root@master231 cephfs]# kubectl describe pv pvc-b990e20e-a140-45bd-bdd5-2944e5c23d4e | grep VolumeHandle
获取必要的信息,包括 Ceph 的 Monitor 地址和 admin 用户的密钥:
[root@master231 cephfs]# kubectl get svc -n rook-ceph
[root@master231 cephfs]# kubectl -n rook-ceph exec rook-ceph-tools-5846d4dc6c-cxbxb -- ceph auth print-key client.admin;echo
挂载 CephFS 文件系统,验证数据:
参考链接:
https://docs.ceph.com/en/latest/man/8/mount.ceph/#options
ceph类型存储使用mount挂载是可以-o指定文件系统的
这里就可以在其他节点使用mount -t ceph 挂载ceph存储-o指定文件系统,文件系统可以在dashboard查看。
[root@worker233 rook]# mount -t ceph 10.200.216.242:6789:/ /mnt -o name=admin,secret=AQBJTAdoeHg0ChAA1fqz6Vp46B2rx3AgwWOorw==,fs=myfs-ec
查看挂载数据:
[root@worker233 rook]# df -h | grep mnt
[root@worker233 rook]# ll /mnt/
[root@worker233 rook]# cat /mnt/volumes/csi/csi-vol-430c6743-2605-4c40-9b33-f89046b71875/c38d1b7a-8eb0-4cf0-b642-72259a31231a/index.html
九、注意事项和常见报错
注意事项
-
版本兼容性:在部署之前,务必确保 Kubernetes 和 Rook 的版本兼容。例如,Kubernetes v1.23.17 最高支持 Rook v1.13。
-
硬件要求:每个节点至少需要一个未分区且未格式化的磁盘用于存储 Ceph 数据。
-
网络配置:确保所有节点之间的网络通信正常,尤其是 Ceph 集群内部通信所需的端口。
-
存储配置:在配置存储池时,根据实际需求选择合适的副本数量或纠删码策略。
-
安全性:在生产环境中,建议使用安全的方式管理密钥和证书,避免直接暴露在配置文件中。
常见报错及解决方法
-
Pod 状态异常:如果 Pod 处于
CrashLoopBackOff
或Pending
状态,可能是由于资源不足、镜像拉取失败或配置错误。可以通过kubectl describe pod <pod-name> -n rook-ceph
查看详细日志信息。 -
存储池创建失败:如果在创建存储池时遇到问题,可能是由于磁盘空间不足或权限问题。检查磁盘使用情况和目录权限。
-
Dashboard 无法访问:可能是由于服务未正确暴露或密钥错误。检查 Dashboard 的服务配置和密钥设置。
-
存储卷挂载失败:在挂载存储卷时遇到问题,可能是由于卷格式不匹配或权限不足。确保卷格式正确,并检查挂载目录的权限。
-
CSI 驱动问题:在使用 CSI 驱动时,如果遇到存储卷动态 Provision 失败,可能是由于 StorageClass 配置错误或 CSI 插件版本不兼容。检查 StorageClass 配置和 CSI 插件日志。
十、结语
通过本文的详细步骤,我们成功部署了 Rook 并创建了 Ceph 集群,同时实现了 Kubernetes 与 Ceph 的多种存储对接方式。Rook 的强大之处在于它能够将复杂的 Ceph 存储系统简化为 Kubernetes 原生的资源管理,使得存储的部署和管理变得更加高效和便捷。
在实际应用中,我们可以根据业务需求灵活选择不同的存储类型和配置策略,无论是高性能的块存储、共享的文件系统还是可扩展的对象存储,Rook 都能提供可靠的解决方案。希望本文能够帮助大家更好地理解和掌握 Rook 在 Kubernetes 中的应用,为构建高效、稳定的云原生存储架构奠定基础。