前言:
之前自己用rook部署过几次ceph集群,每次部署或多或少都会遇到一些问题。有些网上还能找到解决方法,有的只能靠自己去解决,毕竟每个人部署遇到的问题不一定都相同。因为每次部署完自己也没做记录,导致每次部署都浪费了一些时间。因此这次部署的时候决定将遇到的问题记录一下,方便自己之后再次部署找到解决方法。
rook介绍:
rook是一个自我管理的分布式存储编排系统,它本身并不是存储系统,在存储和k8s之间搭建了一个桥梁,使存储系统的搭建或者维护变得特别简单,Rook将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它让一些存储的操作,比如部署、配置、扩容、升级、迁移、灾难恢复、监视和资源管理变得自动化,无需人工处理。并且Rook支持cSsl,可以利用CSI做一些Pvc的快照、扩容等操作。
架构:
- 各组件说明
- Operator:Rook控制端,监控存储守护进程,确保存储集群的健康
- Agent:在每个存储节点创建,配置了FlexVolume插件和Kubernetes 的存储卷控制框架(CSI)进行集成
- OSD:提供存储,每块硬盘可以看做一个osd
- Mon:监控ceph集群的存储情况,记录集群的拓扑,数据存储的位置信息
- MDS:负责跟踪文件存储的层次结构
- RGW:Rest API结构,提供对象存储接口
- MGR:为外界提供统一入
准备事项:
ip | 系统 | 角色 | k8s版本 | rook版本 | 磁盘 |
10.12.0.1 | ubuntu:18.04 | k8s-master | 1.19.11 | 1.6.11或者1.5.4 | 无 |
10.12.0.2 | ubuntu:18.04 | k8s-node1 | 1.19.11 | 1.6.11或者1.5.4 | 1*1T |
10.12.0.3 | ubuntu:18.04 | k8s-node2 | 1.19.11 | 1.6.11或者1.5.4 | 无 |
注意事项:
1.本次部署仅有三个节点,需要配置master节点可运行pod(去除master节点污点)
2.三台机器时间同步
3.关闭防火墙
4.挂载磁盘必须为裸盘,lsblk -f 可查看
rook部署:
拉取rook
git clone --single-branch --branch v1.6.11 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml #创建RBAC相关secrets权限 、rook的crd组件,主要用于管理控制Ceph集群
修改operator.yaml文件
#修改Rook CSI 镜像地址,默认地址可能是gcr国外镜像,在国内无法正常访问,因此需要同步gcr镜像到阿里云镜像仓库或者其他本地仓库
vim rook/cluster/examples/kubernetes/ceph/operator.yaml
ROOK_CSI_ALLOW_UNSUPPORTED_VERSION: "false"
# The default version of CSI supported by Rook will be started. To change the version
# of the CSI driver to something other than what is officially supported, change
# these images to the desired release of the CSI driver.
# ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.3.1"
# ROOK_CSI_REGISTRAR_IMAGE: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.2.0"
# ROOK_CSI_RESIZER_IMAGE: "k8s.gcr.io/sig-storage/csi-resizer:v1.2.0"
# ROOK_CSI_PROVISIONER_IMAGE: "k8s.gcr.io/sig-storage/csi-provisioner:v2.2.2"
# ROOK_CSI_SNAPSHOTTER_IMAGE: "k8s.gcr.io/sig-storage/csi-snapshotter:v4.1.1"
# ROOK_CSI_ATTACHER_IMAGE: "k8s.gcr.io/sig-storage/csi-attacher:v3.2.1"
ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-node-driver-registrar:v2.0.1"
ROOK_CSI_RESIZER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-resizer:v1.0.1"
ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-provisioner:v2.0.4"
ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-snapshotter:v4.0.0"
ROOK_CSI_ATTACHER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-attacher:v3.0.2"
# (Optional) set user created priorityclassName for csi plugin pods.
# CSI_PLUGIN_PRIORITY_CLASSNAME: "system-node-critical"
部署ceph集群
kubectl create -f rook/cluster/examples/kubernetes/ceph/operator.yaml
kubectl create -f rook/cluster/examples/kubernetes/ceph/cluster.yaml
watch kubectl get pods -n rook-ceph #等待所有pod启动
#ceph集群维护pod,进入终端可执行命令(ceph相关命令)
kubectl create -f rook/cluster/examples/kubernetes/ceph/toolbox.yaml -n rook-ceph
#创建文件存储服务
kubectl create -f myfs.yaml
#cat myfs.yaml
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
name: myfs
namespace: rook-ceph
spec:
metadataPool:
replicated:
size: 3 #仅一个osd需将pool副本数改为1
dataPools:
- replicated:
size: 3 #仅一个osd需将pool副本数改为1
preservePoolsOnDelete: true
metadataServer:
activeCount: 1
activeStandby: true
问题1:部署完成后创建pvc时一直处于pending状态,百度了好久也没解决我的问题,后来从ceph集群的状况入手,理解了ceph中pg的各个状态,解决了此问题。
ceph集群pg各个状态可参考:分布式存储Ceph之PG状态详解_老BUG蹦迪的博客_pg状态详解 pvc一直处于pending状态时ceph集群状况如下:
红框中的状态代表此ceph集群并不能进行IO操作,因此我创建PVC的时候一直处于pending状态,undersized和peered状态都是由于PG当前ActingSet规模小于存储池规定的最小副本数(min_size)
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool ls
device_health_metrics
myfs-metadata
myfs-data0
fys-metadata
fys-data0
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool get device_health_metrics min_size
min_size: 2
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool get myfs-data0 min_size
min_size: 2
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool get fys-metadata min_size
min_size: 2
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool get fys-data0 min_size
min_size: 2
经查看ceph集群内存储池min_size都为2,而我部署的ceph集群只有node1节点有磁盘,因此只有一个osd节点正常工作,因此我的存储池副本数只能设置为1。
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool set myfs-metadata min_size 1
set pool 2 min_size to 1
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool set myfs-data0 min_size 1
set pool 3 min_size to 1
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool set fys-metadata min_size 1
set pool 4 min_size to 1
[root@rook-ceph-tools-65c94d77bb-jcxkj /]# ceph osd pool set fys-data0 min_size 1
set pool 5 min_size to 1
通过上面命令将min_size设置为1后,查看ceph集群pg状态已经改变,客户端也已经有了读写速度
此时在k8s集群中再次创建pvc,已经正常
root@master:~# kubectl get pvc --all-namespaces #状态为Bound正常
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
default test Bound pvc-a8763f20-a5e5-4a63-ba9b-d117958cacb9 5Mi RWX qqq 3h
rook-ceph ceph1 Bound pvc-04ac6a68-5130-4b3b-8aba-d2253d6b6ab8 10Mi RWX qqq 146m
重新部署ceph集群
1.ceph集群内创建的资源全部删除,例如:storageclass,pvc(与pvc相关联的pod也需要删掉),文件系统等
2.删除ceph集群pod(kubectl方式)
3.各个k8s集群节点清空部署ceph集群时生成的rook目录(rm -rf /var/lib/rook/*)
4.部署ceph集群需要用到的磁盘需重置为裸盘
- 查询:dmsetup ls
- 删除:dmsetup remove ceph--0ee2439c--0a53--47d2--9fe9--3cdfbaef2d91-osd--block--de26b725--fe06--43a6--b64e--dee3215e6391
- 创建分区:fdisk /dev/sdb
- 删除刚刚创建分区
此刻lsblk -f即可看到磁盘为裸盘