先决条件
为确保您有一个准备就绪的 Kubernetes 集群Rook,您可以按照这些说明进行操作。
为了配置 Ceph 存储集群,至少需要以下本地存储选项之一:
- 原始设备(无分区或格式化文件系统)
- 这需要lvm2在主机上安装。为了避免这种依赖性,您可以在磁盘上创建一个完整的磁盘分区(见下文)
- 原始分区(无格式化的文件系统)
- block模式下存储类可用的持久卷
部署 Rook Operator
$ git clone --single-branch --branch release-1.7 https://gitee.com/Aaron-23/rook.git
cd rook/cluster/examples/kubernetes/ceph
第一步是部署 Rook 算子。检查您是否正在使用与您的 Rook 版本相对应的示例 yaml 文件。有关更多选项,请参阅示例文档。
cd cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
# verify the rook-ceph-operator is in the `Running` state before proceeding
kubectl -n rook-ceph get pod
修改cluster.yaml文件中storage.node的相关信息,至少需要三个节点
kubectl create -f cluster.yaml
使用kubectl到列表荚的rook-ceph命名空间。一旦它们全部运行,您应该能够看到以下 pod。osd pod 的数量取决于集群中的节点数量和配置的设备数量。如果cluster.yaml上面没有修改,预计每个节点会创建一个OSD。
如果rook-ceph-mon,rook-ceph-mgr或rook-ceph-osd不创建豆荚,请参阅 Ceph的常见问题的详细信息和可能的解决方案。
$ kubectl -n rook-ceph get pod
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-provisioner-d77bb49c6-n5tgs 5/5 Running 0 140s
csi-cephfsplugin-provisioner-d77bb49c6-v9rvn 5/5 Running 0 140s
csi-cephfsplugin-rthrp 3/3 Running 0 140s
csi-rbdplugin-hbsm7 3/3 Running 0 140s
csi-rbdplugin-provisioner-5b5cd64fd-nvk6c 6/6 Running 0 140s
csi-rbdplugin-provisioner-5b5cd64fd-q7bxl 6/6 Running 0 140s
rook-ceph-crashcollector-minikube-5b57b7c5d4-hfldl 1/1 Running 0 105s
rook-ceph-mgr-a-64cd7cdf54-j8b5p 1/1 Running 0 77s
rook-ceph-mon-a-694bb7987d-fp9w7 1/1 Running 0 105s
rook-ceph-mon-b-856fdd5cb9-5h2qk 1/1 Running 0 94s
rook-ceph-mon-c-57545897fc-j576h 1/1 Running 0 85s
rook-ceph-operator-85f5b946bd-s8grz 1/1 Running 0 92m
rook-ceph-osd-0-6bb747b6c5-lnvb6 1/1 Running 0 23s
rook-ceph-osd-1-7f67f9646d-44p7v 1/1 Running 0 24s
rook-ceph-osd-2-6cd4b776ff-v4d68 1/1 Running 0 25s
rook-ceph-osd-prepare-node1-vx2rz 0/2 Completed 0 60s
rook-ceph-osd-prepare-node2-ab3fd 0/2 Completed 0 60s
rook-ceph-osd-prepare-node3-w4xyz 0/2 Completed 0 60s
验证集群是否处于健康状态
使用Rook tools并运行该 ceph status命令。
kubectl create -f toolbox.yaml
kubectl -n rook-ceph rollout status deploy/rook-ceph-tools
$ kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
$ ceph status
[root@rook-ceph-tools-7869bc54f6-67rvk /]# ceph status
cluster:
id: 1f70694e-df88-4a1f-b77e-d2dd0ded9977
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 23h)
mgr: a(active, since 20h), standbys: b
mds: 1/1 daemons up, 1 hot standby
osd: 3 osds: 3 up (since 20h), 3 in (since 20h)
data:
volumes: 1/1 healthy
pools: 3 pools, 192 pgs
objects: 25 objects, 50 KiB
usage: 107 MiB used, 300 GiB / 300 GiB avail
pgs: 192 active+clean
io:
client: 1.2 KiB/s rd, 2 op/s rd, 0 op/s wr
存储
有关 Rook 公开的三种存储类型的演练,请参阅以下指南:
Block:创建由 Pod (RWO) 使用的块存储
共享文件系统:创建一个跨多个 Pod 共享的文件系统 (RWX)
Object:创建一个可以在 Kubernetes 集群内部或外部访问的对象存储
创建共享文件系统
kubectl create -f filesystem.yaml
Rook operator将创建启动服务所需的所有池和其他资源。这可能需要一分钟才能完成。
# To confirm the filesystem is configured, wait for the mds pods to start
kubectl -n rook-ceph get pod -l app=rook-ceph-mds
NAME READY STATUS RESTARTS AGE
rook-ceph-mds-myfs-7d59fdfcf4-h8kw9 1/1 Running 0 12s
rook-ceph-mds-myfs-7d59fdfcf4-kgkjp 1/1 Running 0 12s
要查看文件系统的详细状态,请启动并连接到Rook tools。将ceph status为该mds服务显示一个新行。在此示例中,有一个 MDS 的活动实例已启动,其中一个 MDS 实例处于standby-replay模式以备故障转移。
$ ceph status
...
services:
mds: myfs-1/1/1 up {[myfs:0]=mzw58b=up:active}, 1 up:standby-replay
供应存储
在 Rook 开始供应存储之前,需要根据文件系统创建一个 StorageClass。这是 Kubernetes 与 CSI 驱动程序互操作以创建持久卷所必需的。
注意:此示例使用 CSI 驱动程序,它是 K8s 1.13 和更新版本的首选驱动程序。示例可以在CSI CephFS目录中找到。有关使用 flex 驱动程序(K8s 1.12 及更早版本需要)的卷的示例,请参阅下面的Flex 驱动程序部分。
kubectl create -f storageclass.yaml
存储配额
重要提示:CephFS CSI 驱动程序使用配额来强制执行请求的 PVC 大小。只有较新的内核支持 CephFS 配额(内核版本至少为 4.17)。如果您需要强制执行配额并且内核驱动程序不支持它,您可以禁用内核驱动程序并使用 FUSE 客户端。这可以通过CSI_FORCE_CEPHFS_KERNEL_CLIENT: false 在操作员部署 ( operator.yaml) 中设置来完成。但是,重要的是要知道,当 FUSE 客户端启用时,存在一个问题,即在升级过程中应用程序 pod 将与挂载断开连接,需要重新启动。有关 更多详细信息,请参阅升级指南。
dashboard
获取svc,在平台上代理
kubectl -n rook-ceph get service rook-ceph-mgr-dashboard
连接到仪表板后,您需要登录以进行安全访问。Rook 创建一个默认用户, admin并rook-ceph-dashboard-password在 Rook Ceph 集群运行的命名空间中生成一个名为的秘密。要检索生成的密码,您可以运行以下命令:
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo