当前位置: 首页 > news >正文

Rook 部署 Ceph 集群及 Kubernetes 存储对接实战

一、Rook 概述

Rook 是一款开源的云原生存储编排器,专为 Kubernetes 设计,旨在实现 Ceph 分布式存储系统的自动化部署与管理。它通过 Kubernetes Operator 框架,将 Ceph 的复杂存储管理任务简化为一系列自动化流程,使存储服务具备自我管理、自我扩展和自我修复的能力。

Rook 与 Ceph 的结合,为 Kubernetes 提供了文件、块和对象三种存储类型的支持,满足了不同应用场景下的存储需求。Rook 项目由云原生计算基金会(CNCF)托管,是毕业级项目,具有高度的稳定性和可靠性。

二、环境准备

硬件环境

本次实战基于以下硬件环境:

主机名IP 地址主机配置
master23110.0.0.231/244Core8GB/100G+300G+500G
master23210.0.0.232/244Core8GB/100G+300G+500G
master23310.0.0.233/244Core8GB/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

九、注意事项和常见报错

注意事项

  1. 版本兼容性:在部署之前,务必确保 Kubernetes 和 Rook 的版本兼容。例如,Kubernetes v1.23.17 最高支持 Rook v1.13。

  2. 硬件要求:每个节点至少需要一个未分区且未格式化的磁盘用于存储 Ceph 数据。

  3. 网络配置:确保所有节点之间的网络通信正常,尤其是 Ceph 集群内部通信所需的端口。

  4. 存储配置:在配置存储池时,根据实际需求选择合适的副本数量或纠删码策略。

  5. 安全性:在生产环境中,建议使用安全的方式管理密钥和证书,避免直接暴露在配置文件中。

常见报错及解决方法

  1. Pod 状态异常:如果 Pod 处于 CrashLoopBackOffPending 状态,可能是由于资源不足、镜像拉取失败或配置错误。可以通过 kubectl describe pod <pod-name> -n rook-ceph 查看详细日志信息。

  2. 存储池创建失败:如果在创建存储池时遇到问题,可能是由于磁盘空间不足或权限问题。检查磁盘使用情况和目录权限。

  3. Dashboard 无法访问:可能是由于服务未正确暴露或密钥错误。检查 Dashboard 的服务配置和密钥设置。

  4. 存储卷挂载失败:在挂载存储卷时遇到问题,可能是由于卷格式不匹配或权限不足。确保卷格式正确,并检查挂载目录的权限。

  5. CSI 驱动问题:在使用 CSI 驱动时,如果遇到存储卷动态 Provision 失败,可能是由于 StorageClass 配置错误或 CSI 插件版本不兼容。检查 StorageClass 配置和 CSI 插件日志。

十、结语

通过本文的详细步骤,我们成功部署了 Rook 并创建了 Ceph 集群,同时实现了 Kubernetes 与 Ceph 的多种存储对接方式。Rook 的强大之处在于它能够将复杂的 Ceph 存储系统简化为 Kubernetes 原生的资源管理,使得存储的部署和管理变得更加高效和便捷。

在实际应用中,我们可以根据业务需求灵活选择不同的存储类型和配置策略,无论是高性能的块存储、共享的文件系统还是可扩展的对象存储,Rook 都能提供可靠的解决方案。希望本文能够帮助大家更好地理解和掌握 Rook 在 Kubernetes 中的应用,为构建高效、稳定的云原生存储架构奠定基础。

相关文章:

  • 【微服务】SpringBoot制作Docker镜像接入SkyWalking详解
  • Anaconda 与 Miniconda 的差异详解
  • [论文阅读]ConfusedPilot: Confused Deputy Risks in RAG-based LLMs
  • 树莓派学习专题<8>:使用V4L2驱动获取摄像头数据--获取摄像头支持的分辨率
  • 进行性核上性麻痹饮食指南:科学膳食提升生活质量
  • SQL中函数
  • C# 跨进程 临界区 互斥 进程锁
  • 轻量级景好鼠标录制器
  • 基于javaweb的SSM+Maven小区失物招领系统设计与实现(源码+文档+部署讲解)
  • 从代码学习深度学习 - 编译器和解释器 PyTorch 版
  • 一个C#扩展库,让Dapper的CRUD操作更简单
  • unity脚本-FBX自动化模型面数校验
  • c语言数据结构------------归并排序(终)
  • Jenkins的地位和作用
  • 《AI大模型应知应会100篇》第32篇:大模型与医疗健康:辅助诊断的可能性与风险
  • 【人脸识别】百度人脸识别H5方案对接
  • Spring AOP + Logback + MDC全链路日志追踪
  • Cesium学习笔记——坐标系统及坐标转换
  • 实用生活c语言脚本
  • Android如何通过aspectj打造一个无侵入式动态权限申请框架
  • 牛市早报|外汇局:4月以来外汇市场交易保持平稳,跨境资金延续净流入
  • 受贿超8.22亿,新疆维吾尔自治区党委原副书记李鹏新一审被判死缓
  • 旁白丨无罪后领到国家补偿,一位退休教师卸下了“包袱”
  • 图忆|温州旅沪先贤的家国情怀
  • 助力中国足球未来,香港赛马会鼎力支持U15国少选拔队赴英训练
  • 古文启蒙佳作!锺叔河《念楼学短合集》出修订版