前言:

之前自己用rook部署过几次ceph集群,每次部署或多或少都会遇到一些问题。有些网上还能找到解决方法,有的只能靠自己去解决,毕竟每个人部署遇到的问题不一定都相同。因为每次部署完自己也没做记录,导致每次部署都浪费了一些时间。因此这次部署的时候决定将遇到的问题记录一下,方便自己之后再次部署找到解决方法。


rook介绍:

rook是一个自我管理的分布式存储编排系统,它本身并不是存储系统,在存储和k8s之间搭建了一个桥梁,使存储系统的搭建或者维护变得特别简单,Rook将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它让一些存储的操作,比如部署、配置、扩容、升级、迁移、灾难恢复、监视和资源管理变得自动化,无需人工处理。并且Rook支持cSsl,可以利用CSI做一些Pvc的快照、扩容等操作。

架构:

k8s搭建postgresql k8s部署ceph_ubuntu


 

 

  • 各组件说明
  • 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集群状况如下:

k8s搭建postgresql k8s部署ceph_ubuntu_02

红框中的状态代表此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搭建postgresql k8s部署ceph_分布式存储_03

 此时在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即可看到磁盘为裸盘