Kubernetes存储——rook-ceph
一、搭建 rook-ceph(集群)版本:v6
1.1 服务规划(4c3g)
k8s-master(k8s集群) | k8s-node01(k8s集群) | k8s-node02(k8s集群) |
---|---|---|
192.168.99.1 | 192.168.99.2 | 192.168.99.3 |
1.2 扫描新磁盘
所有 k8s 节点另外准备一块磁盘(裸盘)(/dev/sdb)
在所有节点添加1块100GB的新磁盘:/dev/sdb,作为OSD盘,提供存储空间,添加完成后扫描磁盘,确保主机能够正常识别到:
$ for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done # 扫描 SCSI 总线并添加 SCSI 设备 $ for scsi_device in $(ls /sys/class/scsi_device/); do echo 1 > /sys/class/scsi_device/$scsi_device/device/rescan; done # 重新扫描 SCSI 总线 $ lsblk # 查看已添加的磁盘,能够看到sdb说明添加成功
1.3 部署rook-ceph集群
因为这里k8s集群只有三台,所以必须配置k8s的master运行pod
[root@k8s-master ~]# kubectl describe node k8s-master |grep Taints Taints: node-role.kubernetes.io/k8s-master:NoSchedule # 查看master表示不运行pod [root@k8s-master ~]# kubectl describe node k8s-master |grep Taints Taints: <none> # 查看master表示运行pod [root@k8s-master ~]# kubectl taint nodes k8s-master node-role.kubernetes.io/k8s-master- # 让master节点参与pod负载 [root@k8s-master ~]# kubectl taint nodes k8s-master node-role.kubernetes.io/k8s-master=:NoSchedule # 让master节点恢复不参与pod负载
rook-ceph镜像下载链接:https://pan.baidu.com/s/1SPK7K3NAWKhGTV_-A2tSOQ
提取码:cjmx
$ https://github.com/rook/rook.git (https://gitee.com) $ git clone https://gitee.com/huanhui/rook.git $ git clone --single-branch --branch v1.6.7 https://github.com/rook/rook.git # 根据自身网络情况,任选其中一种即可 $ cd rook/cluster/examples/kubernetes/ceph # 进入对应的目录 $ grep image operator.yaml # 查看所需镜像 $ grep image cluster.yaml $ mkdir rook-ceph-images && cd rook-ceph-images $ unzip '*.zip' $ ls *tar |xargs -i docker load -i {} && docker images $ rm -rf rook-ceph-images # 离线导入镜像 $ kubectl create -f crds.yaml -f common.yaml -f operator.yaml $ kubectl create -f cluster.yaml # 修改cluster.yaml文件
$ kubectl get pod -n rook-ceph -o wide $ kubectl get deployment -n rook-ceph $ kubectl get svc -n rook-ceph
1.4 配置ceph dashboard
在cluster.yaml文件中默认已经启用了ceph dashboard!
rook-ceph-mgr-dashboard监听的端口是8443,创建nodeport类型的service以便集群外部访问!
$ cd ~/rook/cluster/examples/kubernetes/ceph $ kubectl apply -f dashboard-external-https.yaml
$ kubectl get svc -n rook-ceph rook-ceph-mgr-dashboard-external-https NodePort 10.105.9.199 <none> 8443:30077/TCP 13s
1.5 获取dashboard登陆账号、密码
默认用户名为:admin
$ kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo # 获取密码
1.6 部署 ceph toolbox
$ cd ~/rook/cluster/examples/kubernetes/ceph $ kubectl apply -f toolbox.yaml
进入该pod,查看ceph集群状态
[root@k8s-master ~]# kubectl exec -it rook-ceph-tools-78cdfd976c-z4ps4 -n rook-ceph /bin/bash [root@rook-ceph-tools-78cdfd976c-z4ps4 /]# ceph -s
二、k8s使用 rook-ceph 的块存储
2.1 rook提供RBD服务
rook可以提供以下3类型的存储:
- Block:Create block storage to be consumed by a pod
- Object:Create an object store that is accessible inside or outside the Kubernetes cluster
- Shared File System:Create a file system to be shared across multiple pods
2.2 使用rook-ceph的块存储
1、基于 CSI 驱动程序创建卷
2、基于 flex 驱动程序创建卷
1、此示例使用 CSI 驱动程序,它是 K8s 1.13 和更新版本的首选驱动程序。
2、flex 驱动程序(K8s 1.12 或更早版本需要)的存储类
要基于 flex 驱动程序创建卷,确保通过 Ceph CSI 启用了 flex 驱动程序。为此,您需要在您的操作员部署文件
operator.yaml
中设置ROOK_ENABLE_FLEX_DRIVER
为true
,与 CSI 驱动程序相同。
注意:CSI 驱动程序,此示例要求每个节点至少有 1 个 OSD,每个 OSD 位于3 个不同的节点上。因为
failureDomain
设置为host
并且replicated.size
设置为3
。
在kubernetes集群里,要提供rbd块设备服务,需要有如下步骤:
1、创建 rbd-provisione
2、创建 pool
3、创建对应的 storageclass
4、使用rbd对应的storageclass创建pvc,然后动态申请pv
5、创建pod使用pv( 使用存储 )
通过rook创建Ceph Cluster集群之后,rook自身提供了rbd-provisioner服务,所以不需要再部署其provisioner(供应商,就是提供存储的)。
2.2.1 使用CSI驱动程序
# 1、CSI 驱动程序 (2、3步骤可以直接使用下面命令执行) $ kubectl create -f ~/rook/cluster/examples/kubernetes/ceph/csi/rbd/storageclass.yaml # 2、flex 驱动程序 $ kubectl create -f cluster/examples/kubernetes/ceph/flex/storageclass.yaml
2.2.2 创建pool
# 创建一个自己的工作目录 $ cd /root/rook/cluster/examples/kubernetes/ceph $ mkdir my_yaml $ cat > pool.yaml << EOF apiVersion: ceph.rook.io/v1 kind: CephBlockPool metadata: name: replicapool # operator会监听并创建一个pool namespace: rook-ceph spec: failureDomain: host replicated: size: 3 requireSafeReplicaSize: true EOF $ kubectl apply -f pool.yaml # 创建了一个名为 replicapool 的存储池
apply执行完后,登录 ceph dashboard 界面上能看到对应的pool!
2.2.3 创建对应的storageclass
$ cat > storageclass.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rook-ceph-block # 这里创建一个storage class, 在pvc中指定这个storage class即可实现动态创建PV provisioner: rook-ceph.rbd.csi.ceph.com parameters: clusterID: rook-ceph Pool: replicapool imageFormat: "2" imageFeatures: layering csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # 必须与rook-ceph集群ns相同 csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph csi.storage.k8s.io/fstype: ext4 # 指定卷的文件系统类型。如果没有指定,它将使用ext4 allowVolumeExpansion: true reclaimPolicy: Delete # 不写默认值为Delete,其他选项包括“保留(Retain)”、“回收(Recycle)” EOF
如果您在“rook-ceph”以外的命名空间中部署了 Rook operator ,请更改配置器中的前缀以匹配您使用的命名空间。例如,如果 Rook operator 在名称空间“my-namespace”中运行,则供应商值应为“my-namespace.rbd.csi.ceph.com”。
$ kubectl apply -f storageclass.yaml $ kubectl get storageclass # 创建了一个名为 rook-ceph-block 的storageClass
2.2.4 创建pvc测试
$ cat > test-pvc.yaml << EOF --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wp-pv-claim labels: app: wordpress spec: storageClassName: rook-ceph-block # 指定storage class accessModes: - ReadWriteOnce resources: requests: storage: 20Gi # 需要一个20G的盘 EOF $ kubectl apply -f test-pvc.yaml # 创建一个名为wp-pv-claim的pvc $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wp-pv-claim Bound pvc-8ca4b37a-bfdf-49eb-ad46-c39309115664 20Gi RWO rook-ceph-block 16s $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-8ca4b37a-bfdf-49eb-ad46-c39309115664 20Gi RWO Delete Bound default/wp-pv-claim rook-ceph-block 17s
kubectl exec -it rook-ceph-tools-656b876c47-2mffd -n rook-ceph /bin/bash #进入容器查看相关信息 [root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd showmapped [root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd list replicapool [root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd info -p replicapool xxxxxxx
2.2.5 清理块创建的所有工件
$ kubectl delete -f test-pvc.yaml $ kubectl delete -n rook-ceph cephblockpools.ceph.rook.io replicapool $ kubectl delete storageclass rook-ceph-block
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律