前言node
最近在学习 kubernetes 过程当中,想实现 pod 数据的持久化。在调研的过程当中,发现 ceph 在最近几年发展火热,也有不少案例落地企业。在选型方面,我的更加倾向于社区火热的项目,GlusterFS、Ceph 都在考虑的范围以内,可是因为 GlusterFS 只提供对象存储和文件系统存储,而 Ceph 则提供对象存储、块存储以及文件系统存储。怀着对新事物的向往,果断选择 Ceph 来实现 Ceph 块存储对接 kubernetes 来实现 pod 的数据持久化。算法
1、初始 Cephbootstrap
1.1 了解什么是块存储/对象存储/文件系统存储?bash
直接进入主题,ceph 目前提供对象存储(RADOSGW)、块存储RDB以及 CephFS 文件系统这 3 种功能。对于这3种功能介绍,分别以下:
1.对象存储,也就是一般意义的键值存储,其接口就是简单的GET、PUT、DEL 和其余扩展,表明主要有 Swift 、S3 以及 Gluster 等;
2.块存储,这种接口一般以 QEMU Driver 或者 Kernel Module 的方式存在,这种接口须要实现 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青云的云硬盘和阿里云的盘古系统,还有 Ceph 的 RBD(RBD是Ceph面向块存储的接口)。在常见的存储中 DAS、SAN 提供的也是块存储;
3.文件存储,一般意义是支持 POSIX 接口,它跟传统的文件系统如 Ext4 是一个类型的,但区别在于分布式存储提供了并行化的能力,如 Ceph 的 CephFS (CephFS是Ceph面向文件存储的接口),可是有时候又会把 GlusterFS ,HDFS 这种非POSIX接口的类文件存储接口纳入此类。固然 NFS、NAS也是属于文件系统存储;架构
1.2 Ceph 组件介绍app
从下面这张图来简单学习下,Ceph 的架构组件。(提示:本人在学习过程当中所绘,若是发现问题欢迎留言,不要喷我哟)ssh
Monitor, 负责监视整个集群的运行情况,信息由维护集群成员的守护程序来提供,各节点之间的状态、集群配置信息。Ceph monitor map主要包括OSD map、PG map、MDS map 和 CRUSH 等,这些 map 被统称为集群 Map。ceph monitor 不存储任何数据。下面分别开始介绍这些map的功能:分布式
OSD,Ceph OSD 是由物理磁盘驱动器、在其之上的 Linux 文件系统以及 Ceph OSD 服务组成。Ceph OSD 将数据以对象的形式存储到集群中的每一个节点的物理磁盘上,完成存储数据的工做绝大多数是由 OSD daemon 进程实现。在构建 Ceph OSD的时候,建议采用SSD 磁盘以及xfs文件系统来格式化分区。BTRFS 虽然有较好的性能,可是目前不建议使用到生产中,目前建议仍是处于围观状态。工具
Ceph 元数据,MDS。ceph 块设备和RDB并不须要MDS,MDS只为 CephFS服务。性能
RADOS,Reliable Autonomic Distributed Object Store。RADOS是ceph存储集群的基础。在ceph中,全部数据都以对象的形式存储,而且不管什么数据类型,RADOS对象存储都将负责保存这些对象。RADOS层能够确保数据始终保持一致。
librados,librados库,为应用程度提供访问接口。同时也为块存储、对象存储、文件系统提供原生的接口。
ADOS块设备,它可以自动精简配置并可调整大小,并且将数据分散存储在多个OSD上。
RADOSGW,网关接口,提供对象存储服务。它使用librgw和librados来实现容许应用程序与Ceph对象存储创建链接。而且提供S3 和 Swift 兼容的RESTful API接口。
CephFS,Ceph文件系统,与POSIX兼容的文件系统,基于librados封装原生接口。
简单说下CRUSH,Controlled Replication Under Scalable Hashing,它表示数据存储的分布式选择算法, ceph 的高性能/高可用就是采用这种算法实现。CRUSH 算法取代了在元数据表中为每一个客户端请求进行查找,它经过计算系统中数据应该被写入或读出的位置。CRUSH可以感知基础架构,可以理解基础设施各个部件之间的关系。而且CRUSH保存数据的多个副本,这样即便一个故障域的几个组件都出现故障,数据依然可用。CRUSH 算是使得 ceph 实现了自我管理和自我修复。
RADOS 分布式存储相较于传统分布式存储的优点在于:
1. 将文件映射到object后,利用Cluster Map 经过CRUSH 计算而不是查找表方式定位文件数据存储到存储设备的具体位置。优化了传统文件到块的映射和Block MAp的管理。
2. RADOS充分利用OSD的智能特色,将部分任务受权给OSD,最大程度地实现可扩展。
2、安装 Ceph
2.1 环境准备
## 环境说明
主机 IP 功能
ceph-node01 192.168.58.128 deploy、mon*一、osd*3
ceph-node02 192.168.58.129 mon*一、 osd*3
ceph-node03 192.168.58.130 mon*1 、osd*3
## 准备 yum 源
cd /etc/yum.repos.d/ && sudo mkdir bak sudo mv *.repo bak/ sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo sudo sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo sudo sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo sudo sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
## 添加 Ceph 源
sudo cat <<EOF > /etc/yum.repos.d/ceph.repo [Ceph] name=Ceph packages for x86_64 baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc [Ceph-noarch] name=Ceph noarch packages baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/ enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc [ceph-source] name=Ceph source packages baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/ enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc EOF
## 配置免密钥(略)
提示:若是使用普通用户进行安装,请授予用户相关权限,以下:
a. 将 yangsheng 用户加入到sudo权限(yangsheng ALL=(ALL) NOPASSWD: ALL)
b. 将 /etc/sudoers 中的 “Defaults requiretty” 注释
2.2 开始安装
## 安装部署工具(在 192.168.58.128 执行以下操做)
yum makecache yum -y install ceph-deploy ceph-deploy --version 1.5.39
## 初始化monitor
mkdir ceph-cluster && cd ceph-cluster ceph-deploy new ceph-node01 ceph-node02 ceph-node03
根据本身的IP配置向ceph.conf中添加public_network,并稍微增大mon之间时差容许范围(默认为0.05s,现改成2s):
# change default replica 3 to 2 osd pool default size = 2 public network = 192.168.58.0/24 cluster network = 192.168.58.0/24
## 安装 ceph
ceph-deploy install ceph-node01 ceph-node02 ceph-node03
## 开始部署monitor
ceph-deploy mon create-initial [root@ceph-node01 ceph]# ls ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring ceph-deploy-ceph.log rbdmap ceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.conf ceph.mon.keyring
查看集群状态
[root@ceph-node01 ceph]# ceph -s
cluster b5108a6c-7e3d-4295-88fa-88dc825be3ba
health HEALTH_ERR
no osds
monmap e1: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}
election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
osdmap e1: 0 osds: 0 up, 0 in
flags sortbitwise,require_jewel_osds
pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail
64 creating
提示:Monitor建立成功后,检查集群的状态,此时集群状态并不处于健康状态。
## 开始部署OSD
### 列出节点全部磁盘信息 ceph-deploy disk list ceph-node01 ceph-node02 ceph-node03 ### 清除磁盘分区和内容 ceph-deploy disk zap ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb ### 分区格式化并激活 ceph-deploy osd create ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb ceph-deploy osd activate ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb
此时,再次查看集群状态
[root@ceph-node01 ceph-cluster]# ceph -s
cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29
health HEALTH_OK
monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}
election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
osdmap e15: 3 osds: 3 up, 3 in
flags sortbitwise,require_jewel_osds
pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects
100 MB used, 45946 MB / 46046 MB avail
64 active+clean
2.3 清理环境
若是以前部署失败了,没必要删除ceph客户端,或者从新搭建虚拟机,只须要在每一个节点上执行以下指令便可将环境清理至刚安装完ceph客户端时的状态!强烈建议在旧集群上搭建以前清理干净环境,不然会发生各类异常状况。
sudo ps aux|grep ceph | grep -v "grep"| awk '{print $2}'|xargs kill -9 sudo ps -ef|grep ceph sudo umount /var/lib/ceph/osd/* sudo rm -rf /var/lib/ceph/osd/* sudo rm -rf /var/lib/ceph/mon/* sudo rm -rf /var/lib/ceph/mds/* sudo rm -rf /var/lib/ceph/bootstrap-mds/* sudo rm -rf /var/lib/ceph/bootstrap-osd/* sudo rm -rf /var/lib/ceph/bootstrap-rgw/* sudo rm -rf /var/lib/ceph/tmp/* sudo rm -rf /etc/ceph/* sudo rm -rf /var/run/ceph/*
3、配置客户端
3.1 安装客户端
ssh-copy-id 192.168.58.131 ceph-deploy install 192.168.58.131
将Ceph 配置文件复制到 192.168.58.131。
ceph-deploy config push 192.168.58.131
3.2 新建用户密钥
客户机须要 ceph 秘钥去访问 ceph 集群。ceph建立了一个默认的用户client.admin,它有足够的权限去访问ceph集群。可是不建议把 client.admin 共享到全部其余的客户端节点。这里我用分开的秘钥新建一个用户 (client.rdb) 去访问特定的存储池。
ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd'
为 192.168.58.131 上的 client.rbd 用户添加秘钥
ceph auth get-or-create client.rbd | ssh 192.168.58.131 tee /etc/ceph/ceph.client.rbd.keyring
到客户端(192.168.58.131)检查集群健康状态
[root@localhost ~]# cat /etc/ceph/ceph.client.rbd.keyring >> /etc/ceph/keyring [root@localhost ~]# ceph -s --name client.rbd cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29 health HEALTH_OK monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0} election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03 osdmap e15: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects 100 MB used, 45946 MB / 46046 MB avail 64 active+clean
3.3 建立块设备
rbd create foo --size 4096 --name client.rbd # 建立一个 4096MB 大小的RADOS块设备 rbd create rbd01 --size 10240 --name client.rbd # 建立一个 10240MB 大小的RADOS块设备
映射块设备
[root@localhost ceph]# rbd create rbd02 --size 10240 --image-feature layering --name client.rbd [root@localhost ceph]# rbd map --image rbd02 --name client.rbd /dev/rdb02 /dev/rbd0
提示:在 映射块设备的时候,发生了以下错误。
[root@localhost ceph]# rbd map --image rbd01 --name client.rbd /dev/rdb01 rbd: sysfs write failed RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable". In some cases useful info is found in syslog - try "dmesg | tail" or so. rbd: map failed: (6) No such device or address
解决该办法有多种方式,分别以下所示:
1. 在建立的过程当中加入以下参数 "--image-feature layering" 也解决该问题。
2. 手动disable 掉相关参数,以下所示:
rbd feature disable foo exclusive-lock, object-map, fast-diff, deep-flatten
3. 在每一个 ceph 节点的配置文件中,加入该配置项 "rbd_default_features = 1"。
3.4 检查被映射的块设备
[root@localhost ceph]# rbd showmapped --name client.rbd id pool image snap device 0 rbd rbd02 - /dev/rbd0
建立并挂载该设备
fdisk -l /dev/rbd0 mkfs.xfs /dev/rbd0 mkdir /mnt/ceph-disk1 mount /dev/rbd1 /mnt/ceph-disk1
验证
[root@localhost ceph]# df -h /mnt/ceph-disk1/ 文件系统 容量 已用 可用 已用% 挂载点 /dev/rbd0 10G 33M 10G 1% /mnt/ceph-disk1
一个 ceph 块设备就建立完成。