部署说明
官网:https://rook.io/
- K8S版本1.27.2
- rook 版本1.11.9
安装前准备
- 原始设备(无分区或格式化文件系统)
- 原始分区(无格式化文件系统)
- LVM 逻辑卷(无格式化文件系统)
- block模式下存储类可用的持久卷
使用以下命令确认分区或设备是否使用文件系统进行格式化
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
vdb
sr0
sda
├─sda2 LVM2_member 3QT28B-YeEw-xCUK-0eT2-uBkn-pPcb-2OhWba
│ ├─rootvg-lv_swap swap c16f275f-59a8-4093-89ba-3a79bbf0bb59
│ └─rootvg-lv_root xfs 67894aea-4d9f-4c9d-96cf-348db01eb647 /
└─sda1 xfs 68873398-4b99-4079-b0cb-65d6b9b3b896 /boot
vda
如果该FSTYPE字段不为空,则表示相应设备上有一个文件系统
准入控制器
建议启用 Rook 准入控制器,以提供额外级别的验证,确保 Rook 已使用自定义资源 (CR) 设置正确配置。准入控制器会在对象持久化之前、请求经过身份验证和授权之后拦截对 Kubernetes API 服务器的请求。
要部署 Rook 准入控制器,请在安装 Rook 之前安装证书管理器
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.11.1/cert-manager.yaml
安装LVM包
yum install -y lvm2
开始安装
kubectl使用以下命令和示例清单为 Kubernetes 创建一个简单的 Rook 集群
$ git clone --single-branch --branch v1.11.9 https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
修改cluster.yaml配置
cd rook/deploy/examples
vim cluster.yaml
# resources 生产环境尽量配置大一点,测试环境不用动。
# useAllNodes: false 是否用所有节点 默认用所有
# useAllDevices: false 是否用所有设备 默认用所有
# nodes: # 配置使用哪些硬盘做OSD
# - name: "master01"
# devices:
# - name: "vda"
# - name: "vdb"
修改完以后开始部署
kubectl create -f cluster.yaml
查看安装日志
## 你的pod名字和我的不一样
kubectl logs -n rook-ceph rook-ceph-operator-89d55f6b-k26xb -f
部署成功以后显示如下
[root@master01 examples]# kubectl get po -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-2qct5 2/2 Running 0 18m
csi-cephfsplugin-9xrfm 2/2 Running 0 18m
csi-cephfsplugin-provisioner-7f7874c95d-5t6rq 5/5 Running 0 18m
csi-cephfsplugin-provisioner-7f7874c95d-8pwj2 5/5 Running 0 18m
csi-cephfsplugin-ztng5 2/2 Running 0 18m
csi-rbdplugin-flmcp 2/2 Running 0 18m
csi-rbdplugin-mp986 2/2 Running 0 18m
csi-rbdplugin-provisioner-5fdf9c49b6-td2hj 5/5 Running 0 18m
csi-rbdplugin-provisioner-5fdf9c49b6-wvk8m 5/5 Running 0 18m
csi-rbdplugin-wvf6v 2/2 Running 0 18m
rook-ceph-crashcollector-master01-74469b9c96-7l62m 1/1 Running 0 15m
rook-ceph-crashcollector-master02-7bc857bd7c-d5wqb 1/1 Running 0 15m
rook-ceph-crashcollector-master03-7ff94fd7f8-vnkr5 1/1 Running 0 15m
rook-ceph-mgr-a-7c7664444c-chn79 3/3 Running 0 17m
rook-ceph-mgr-b-86d4f654fb-nzxr4 3/3 Running 0 17m
rook-ceph-mon-a-f5d45c975-6rqc6 2/2 Running 0 18m
rook-ceph-operator-cb6cb456c-qt55t 1/1 Running 0 20m
rook-ceph-osd-0-64d78fffbf-phbjk 2/2 Running 0 15m
rook-ceph-osd-1-87b66886f-pbnb7 2/2 Running 0 15m
rook-ceph-osd-2-7546c786f5-6p8pz 2/2 Running 0 15m
rook-ceph-osd-3-57bfff6657-frgx6 2/2 Running 0 15m
rook-ceph-osd-4-69864d744d-zjqgq 2/2 Running 0 15m
rook-ceph-osd-5-74f46b6cd7-zwfgv 2/2 Running 0 15m
rook-ceph-osd-prepare-master01-rrg5z 0/1 Completed 0 8m48s
rook-ceph-osd-prepare-master02-jmzjc 0/1 Completed 0 8m44s
rook-ceph-osd-prepare-master03-26d6m 0/1 Completed 0 8m39s
验证集群是否可用
# 部署工具箱
kubectl create -f deploy/examples/toolbox.yaml
# 等待工具箱 Pod 下载其容器并进入以下running状态
kubectl -n rook-ceph rollout status deploy/rook-ceph-tools
# rook-ceph-tools pod 运行后,您可以使用以下命令连接到它
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
工具箱中的所有可用工具均已准备好满足您的故障排除需求。
示例:
ceph status
ceph osd status
ceph df
rados df
使用完工具箱后,您可以删除部署
kubectl -n rook-ceph delete deploy/rook-ceph-tools
或者直接敲命令也可以验证ceph集群是否可用
[root@master01 ~]# kubectl get CephCluster -n rook-ceph
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH EXTERNAL FSID
rook-ceph /data/rook 3 200d Ready Cluster created successfully HEALTH_OK ac9b64f0-c26c-424e-8efe-fd561fbe0379
部署 Ceph 仪表板
下面几种方式任选一种
kubectl create -f deploy/examples/dashboard-ingress-https.yaml
kubectl create -f deploy/examples/dashboard-loadbalancer.yaml
kubectl create -f deploy/examples/dashboard-external-http.yaml
账号密码
# 默认账号:admin
# 密码通过下面的命令获取
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
部署块存储(RBD)
注意修改pvc回收方式
kubectl create -f rook/deploy/examples/csi/rbd/storageclass.yaml
部署共享文件系统(CephFS)
kubectl create -f rook/deploy/examples/filesystem.yaml
kubectl create -f rook/deploy/examples/csi/cephfs/storageclass.yaml
在K8S集群查看sc动态存储
[root@master01 examples]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-rbd rook-ceph.rbd.csi.ceph.com Retain Immediate true 150m
rook-cephfs rook-ceph.cephfs.csi.ceph.com Retain Immediate true 7m39s
[root@master01 examples]#
清理CEPH环境
删除块和文件工件
cd rook/deploy/examples
kubectl delete -f ../wordpress.yaml
kubectl delete -f ../mysql.yaml
kubectl delete -n rook-ceph cephblockpool replicapool
kubectl delete storageclass rook-ceph-block
kubectl delete -f csi/cephfs/kube-registry.yaml
kubectl delete storageclass csi-cephfs
删除存储环境
kubectl delete -f cluster.yaml
kubectl delete -f crds.yaml -f common.yaml -f operator.yaml
删除K8S资源的时候如果卡到Termination这个状态
kubectl -n rook-ceph patch configmap rook-ceph-mon-endpoints --type merge -p '{"metadata":{"finalizers": []}}'
kubectl -n rook-ceph patch secrets rook-ceph-mon --type merge -p '{"metadata":{"finalizers": []}}'
删除所有节点配置文件
rm -rf /var/lib/rook/rook-ceph
重置所有存储节点的磁盘
DISK="/dev/sdX"
# Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean)
sgdisk --zap-all $DISK
# Wipe a large portion of the beginning of the disk to remove more LVM metadata that may be present
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync
# SSDs may be better cleaned with blkdiscard instead of dd
blkdiscard $DISK
# Inform the OS of partition table changes
partprobe $DISK
Ceph 可以留下可以锁定磁盘的 LVM 和设备映射器数据,从而防止磁盘再次被使用。这些步骤有助于释放旧的 Ceph 磁盘以供重复使用。请注意,这只需要在每个节点上运行一次。如果您只有一个Rook 集群并且所有Ceph 磁盘都将被擦除,请运行以下命令。
# This command hangs on some systems: with caution, 'dmsetup remove_all --force' can be used
ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %
# ceph-volume setup can leave ceph-<UUID> directories in /dev and /dev/mapper (unnecessary clutter)
rm -rf /dev/ceph-*
rm -rf /dev/mapper/ceph--*