kubernetes 之持久化存储ceph(1)

最近在学习 kubernetes 过程中,想实现 pod 数据的持久化。在调研的过程中,发现 ceph 在最近几年发展火热,也有很多案例落地企业。在选型方面,个人更加倾向于社区火热的项目,GlusterFS、Ceph 都在考虑的范围之内,但是由GlusterFS 只提供对象存储和文件系统存储,而 Ceph 则提供对象存储、块存储以及文件系统存储。怀着对新事物的向往,果断选择 Ceph 来实现 Ceph 块存储对接kubernetes 来实现 pod 的数据持久化。

一、初识 Ceph

1.1 了解什么是块存储/对象存储/文件系统存储?直接进入主题,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 组件介绍

Monitor, 负责监视整个集群的运行状况,信息由维护集群成员的守护程序来提供,各节点之间的状态、集群配置信息。
Ceph monitor map主要包括OSD map、PG map、MDS map 和 CRUSH 等,这些 map 被统称为集群 Map。ceph monitor 不存储任何数据。

下面分别开始介绍这些map的功能 :

  • Monitor map:包括有关monitor 节点端到端的信息,其中包括 Ceph 集群ID,监控主机名和IP以及端口。并且存储当前版本信息以及最新更改信息,通过 “ceph mon dump” 查看 monitor map。
  • OSD map:包括一些常用的信息,如集群ID、创建OSD map的 版本信息和最后修改信息,以及pool相关信息,主要包括pool 名字、pool的ID、类型,副本数目以及PGP等,还包括数量、状态、权重、最新的清洁间隔和OSD主机信息。通过命令 “ceph osd dump” 查看。
  • PG map:包括当前PG版本、时间戳、最新的OSD Map的版本信息、空间使用比例,以及接近占满比例信息,同事,也包括每个PG ID、对象数目、状态、OSD 的状态以及深度清理的详细信息。通过命令 “ceph pg dump” 可以查看相关状态。
  • CRUSH map: CRUSH map 包括集群存储设备信息,故障域层次结构和存储数据时定义失败域规则信息。通过 命令 “ceph osd crush map” 查看。
  • MDS map:MDS Map 包括存储当前 MDS map 的版本信息、创建当前的Map的信息、修改时间、数据和元数据POOL ID、集群MDS数目和MDS状态,可通过”ceph mds dump”查看。

主要的主件:

  • 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,最大程度地实现可扩展。

二、安装ceph


## 安装部署工具(在 192.168.58.128 执行如下操作)
yum makecache
yum -y install ceph-deploy --nogpg
 
# ceph-deploy --version
2.0.1

# rpm -qa | grep ceph
python-cephfs-12.2.11-0.el7.x86_64
ceph-base-12.2.11-0.el7.x86_64
ceph-osd-12.2.11-0.el7.x86_64
ceph-deploy-2.0.1-0.noarch
libcephfs2-12.2.11-0.el7.x86_64
ceph-common-12.2.11-0.el7.x86_64
ceph-selinux-12.2.11-0.el7.x86_64
ceph-mgr-12.2.11-0.el7.x86_64
ceph-mon-12.2.11-0.el7.x86_64
ceph-radosgw-12.2.11-0.el7.x86_64
ceph-mds-12.2.11-0.el7.x86_64
ceph-12.2.11-0.el7.x86_64

## 初始化monitor  
mkdir -p ceph-cluster && cd ceph-cluster
ceph-deploy new k8s-master1 k8s-master2 k8s-master3

yum update ceph-deploy -y --nogpg


# ll
total 16
-rw-r--r-- 1 root root  364 Aug  3 16:41 ceph.conf
-rw-r--r-- 1 root root 5937 Aug  3 16:39 ceph-deploy-ceph.log
-rw------- 1 root root   73 Aug  3 16:39 ceph.mon.keyring
# vim ceph.conf 
[global]
fsid = f64f488a-e27d-4cbf-9a37-5d245e2fcfe6
mon_initial_members = k8s-master1, k8s-master2, k8s-master3
mon_host = 10.0.244.21,10.0.244.22,10.0.244.23
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public_network = 10.0.244.0/24
cluster network = 10.0.244.0/24
osd_journal_size = 512
osd_pool_default_size = 2
osd_pool_default_min_size = 1

根据自己的IP配置向ceph.conf中添加public_network,并稍微增大mon之间时差允许范围(默认为0.05s,现改为2s):
# change default replica 3 to 2
osd pool default size = 2

public_network = 10.0.244.0/24
cluster network = 10.0.244.0/24
osd_journal_size = 512
osd_pool_default_min_size = 1

## 安装 ceph
ceph-deploy install k8s-master1 k8s-master2 k8s-master3 node1 node2 --no-adjust-repos

## 开始部署monitor
# ceph-deploy  --overwrite-conf mon create-initial
 
# ll
total 84
-rw------- 1 root root    71 Aug  3 16:49 ceph.bootstrap-mds.keyring
-rw------- 1 root root    71 Aug  3 16:49 ceph.bootstrap-mgr.keyring
-rw------- 1 root root    71 Aug  3 16:49 ceph.bootstrap-osd.keyring
-rw------- 1 root root    71 Aug  3 16:49 ceph.bootstrap-rgw.keyring
-rw------- 1 root root    63 Aug  3 16:49 ceph.client.admin.keyring
-rw-r--r-- 1 root root   364 Aug  3 16:41 ceph.conf
-rw-r--r-- 1 root root 52627 Aug  3 16:49 ceph-deploy-ceph.log
-rw------- 1 root root    77 Aug  3 16:49 ceph.mon.keyring
-rw------- 1 root root    73 Aug  3 16:49 ceph.mon.keyring-20190803164903

查看集群状态
# ceph -s
  cluster:
    id:     f82d7868-5359-4bad-8679-3c0c4b369a7d
    health: HEALTH_WARN
            mon k8s-master3 is low on available space
 
  services:
    mon: 3 daemons, quorum k8s-master1,k8s-master2,k8s-master3
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0B
    usage:   0B used, 0B / 0B avail
    pgs:     

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/* 

# mkdir test-ceph-deploy
# cd test-ceph-deploy/

若部署出现错误,需要重头开始:

ceph-deploy purge server0 server1 server2 server3
ceph-deploy purgedata server0 server1 server2 server3
ceph-deploy forgetkeys
rm ceph.*



## 开始部署OSD  
### 列出节点所有磁盘信息
# ceph-deploy disk list k8s-master1 k8s-master2 k8s-master3 node1 node

 
### 清除磁盘分区和内容
ceph-deploy disk zap k8s-master1 /dev/sdb /dev/sdc
ceph-deploy disk zap k8s-master2 /dev/sdb /dev/sdc
ceph-deploy disk zap k8s-master3 /dev/sdb /dev/sdc
ceph-deploy disk zap node1 /dev/sdb /dev/sdc
ceph-deploy disk zap node2 /dev/sdb /dev/sdc  


### 分区格式化并激活
ceph-deploy osd create k8s-master1 --data /dev/sdb
ceph-deploy osd create k8s-master1 --data /dev/sdc

ceph-deploy osd create k8s-master2 --data /dev/sdb
ceph-deploy osd create k8s-master2 --data /dev/sdc

ceph-deploy osd create k8s-master3 --data /dev/sdb
ceph-deploy osd create k8s-master3 --data /dev/sdc

ceph-deploy osd create node1 --data /dev/sdb
ceph-deploy osd create node1 --data /dev/sdc

ceph-deploy osd create node2 --data /dev/sdb
ceph-deploy osd create node2 --data /dev/sdc

ceph-deploy osd create k8s-master1 --data /dev/sdb
ceph-deploy osd create k8s-master1 --data /dev/sdc

# ceph -s
  cluster:
    id:     b46f7c89-c004-486c-b29f-14c00654cd27
    health: HEALTH_WARN
            no active mgr
            mon k8s-master3 is low on available space
 
  services:
    mon: 5 daemons, quorum k8s-master1,k8s-master2,k8s-master3,node1,node2
    mgr: no daemons active
    osd: 10 osds: 10 up, 10 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0B
    usage:   0B used, 0B / 0B avail
    pgs:     

三、配置客户端

3.1 安装客户端
ssh-copy-id k8s-master1
ceph-deploy install k8s-master1 

将Ceph 配置文件复制到 k8s-master1
ceph-deploy config push k8s-master1

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'


为 k8s-master1 上的 client.rbd 用户添加秘钥  
ceph auth get-or-create client.rbd | ssh k8s-master1 tee /etc/ceph/ceph.client.rbd.keyring
ceph auth get-or-create client.rbd | ssh k8s-master2 tee /etc/ceph/ceph.client.rbd.keyring
ceph auth get-or-create client.rbd | ssh k8s-master3 tee /etc/ceph/ceph.client.rbd.keyring
ceph auth get-or-create client.rbd | ssh node1 tee /etc/ceph/ceph.client.rbd.keyring
ceph auth get-or-create client.rbd | ssh node2 tee /etc/ceph/ceph.client.rbd.keyring

到客户端(192.168.58.131)检查集群健康状态
# ceph -s --name client.rbd
  cluster:
    id:     b46f7c89-c004-486c-b29f-14c00654cd27
    health: HEALTH_WARN
            no active mgr
            mon k8s-master3 is low on available space
 
  services:
    mon: 3 daemons, quorum k8s-master1,k8s-master2,k8s-master3
    mgr: no daemons active
    osd: 10 osds: 10 up, 10 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0B
    usage:   0B used, 0B / 0B avail
    pgs:     
	
3.3 添加 2 mon + 2 mgr

# ceph-deploy mon add k8s-master1
# ceph-deploy mgr create k8s-master1
# ceph-deploy mon add k8s-master2
# ceph-deploy mgr create k8s-master2
# ceph-deploy mon add k8s-master3
# ceph-deploy mgr create k8s-master3
# ceph-deploy mon destroy node1
# ceph-deploy mon destroy node2

注意:貌似新版的ceph-deploy一次只能增加一个mon.

现在集群就有3个mon和3个mgr了:
# ceph -s
  cluster:
    id:     b46f7c89-c004-486c-b29f-14c00654cd27
    health: HEALTH_WARN
            mon k8s-master3 is low on available space
 
  services:
    mon: 3 daemons, quorum k8s-master1,k8s-master2,k8s-master3
    mgr: k8s-master1(active), standbys: k8s-master3, k8s-master2
    osd: 10 osds: 10 up, 10 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0B
    usage:   10.1GiB used, 150GiB / 160GiB avail
    pgs:     


3.4 创建一个mds
为了支持cephfs,我们在server2上创建一个mds:

# ceph-deploy mds create k8s-master1 k8s-master2 k8s-master3

成功之后,到server2上可以看见mds进程:
# ps -ef | grep ceph-mds
ceph      331988       1  0 19:41 ?        00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id k8s-master1 --setuser ceph --setgroup ceph

但这个时候,mds并没有active,如下,我们通过ceph -s看不到mds服务。直到创建ceph filesystem的时候,mds才进入active状态(见6.1节)。

# ceph -s
  cluster:
    id:     b46f7c89-c004-486c-b29f-14c00654cd27
    health: HEALTH_WARN
            mon k8s-master3 is low on available space
 
  services:
    mon: 3 daemons, quorum k8s-master1,k8s-master2,k8s-master3
    mgr: k8s-master1(active), standbys: k8s-master3, k8s-master2
    osd: 10 osds: 10 up, 10 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0B
    usage:   10.1GiB used, 150GiB / 160GiB avail
    pgs:    
	
至此,ceph集群就完全部署起来了。下面,我们为ceph集群增加一些client。

四、 增加rgw (在admin server上操作)

我们可以使用ceph集群之外的server来部署rgw。部署之前,需要保证默认端口(7480)没有被防火墙禁止。并且需要安装ceph-radosgw包机器依赖:

ceph-deploy install --rgw <client-node> [<client-node> ...]

为了方便起见,我们复用集群内的node1和node2来部署rgw。由于ceph-radosgw已经安装(见3.4节),并且防火墙已经被停掉(见2.5节),所以,直接部署即可:

# ceph-deploy rgw create node1 node2

成功之后,在server1和server3上rgw进程就运行起来了:

# ps -ef | grep ceph
.......
ceph      230919       1  0 19:46 ?        00:00:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.node1 --setuser ceph --setgroup ceph


# ps -ef | grep ceph
......
ceph       14107       1  2 16:23 ?        00:00:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.node2 --setuser ceph --setgroup ceph

并且我们可以通过http来访问:

# curl node1:7480
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
	<Owner>
		<ID>anonymous</ID>
		<DisplayName></DisplayName>
	</Owner>
	<Buckets></Buckets>
</ListAllMyBucketsResult>

五、 增加cephfs

ceph filesystem需要mds(我们在4.4节已经部署)。并且,有两种方式来挂载:ceph fuse和ceph kernel driver。在这一节,我们:

创建一个ceph filesystem
通过ceph fuse挂载
通过ceph kernel driver挂载

5.1 创建ceph filesystem(在集群内任意server上)

A. 创建所需的pool
创建pool
通常在创建pool之前,需要覆盖默认的pg_num,官方推荐:

若少于5个OSD, 设置pg_num为128。
5~10个OSD,设置pg_num为512。
10~50个OSD,设置pg_num为4096。
超过50个OSD,可以参考pgcalc计算。

本文的测试环境只有5个OSD,因此设置pg_num为512。

osd pool default pg num = 128
osd pool default pgp num = 128

创建pool语法:

ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \
     [crush-ruleset-name] [expected-num-objects]
ceph osd pool create {pool-name} {pg-num}  {pgp-num}   erasure \
     [erasure-code-profile] [crush-ruleset-name] [expected_num_objects]
创建一个test-pool,pg_num为128:



# ceph osd pool create cephfs_data 512
pool 'cephfs_data' created
# ceph osd pool create cephfs_metadata 256
pool 'cephfs_metadata' created

B. 创建filesystem

# ceph fs new mycephfs cephfs_metadata cephfs_data
new fs with metadata pool 6 and data pool 5

在没有创建filesystem之前,mds没有active。现在mds就进入active状态了:

# ceph -s
  cluster:
    id:     b46f7c89-c004-486c-b29f-14c00654cd27
    health: HEALTH_WARN
            mon k8s-master3 is low on available space
 
  services:
    mon: 3 daemons, quorum k8s-master1,k8s-master2,k8s-master3
    mgr: k8s-master1(active), standbys: k8s-master3, k8s-master2
    mds: mycephfs-1/1/1 up  {0=k8s-master2=up:active}, 2 up:standby
    osd: 10 osds: 10 up, 10 in
    rgw: 2 daemons active
 
  data:
    pools:   6 pools, 800 pgs
    objects: 210 objects, 4.28KiB
    usage:   10.1GiB used, 150GiB / 160GiB avail
    pgs:     800 active+clean
 
  io:
    client:   760B/s wr, 0op/s rd, 4op/s wr

5.2通过ceph fuse挂载(在node2上)
和rgw一样,原则上我们在ceph集群之外的某台server上挂载ceph filesystem。但为了方便起见,我们还是在k8s-master1上挂载。

首先,要在node2上安装ceph-fuse(若使用ceph集群外的server,也只需这一个包):

# yum install -y ceph-fuse.x86_64  

然后,创建一个挂载点,就可以挂载了。注意,ceph-fuse挂载使用的是admin的权限,所以,通过-k选项传入admin的key。

# mkdir /mnt/cephfs

#  ceph-fuse -k /etc/ceph/ceph.client.admin.keyring -m k8s-master1:6789 /mnt/cephfs
2019-08-03 20:13:17.331197 7f6bf23f50c0 -1 init, newargv = 0x55ebd24143c0 newargc=9ceph-fuse[338103]: starting ceph client
ceph-fuse[338103]: starting fuse

这时候,一个全新的ceph filesystem就可以使用了。注意:这时cephfs_data是空的,但cephfs_metadata不空:

# df -h
Filesystem               Size  Used Avail Use% Mounted on
......
ceph-fuse                 71G     0   71G   0% /mnt/cephfs

# ceph df 
GLOBAL:
    SIZE       AVAIL      RAW USED     %RAW USED 
    160GiB     150GiB      10.1GiB          6.30 
POOLS:
    NAME                    ID     USED        %USED     MAX AVAIL     OBJECTS 
    .rgw.root               1      2.08KiB         0       70.9GiB           6 
    default.rgw.control     2           0B         0       70.9GiB           8 
    default.rgw.meta        3           0B         0       70.9GiB           0 
    default.rgw.log         4           0B         0       70.9GiB         175 
    cephfs_data             5           0B         0       70.9GiB           0 
    cephfs_metadata         6      2.58KiB         0       70.9GiB          21 

往里拷贝一些东西,就会发现cephfs_data也不空了:

# cp /root/csr-crb.yaml /mnt/cephfs/ -av
‘/root/csr-crb.yaml’ -> ‘/mnt/cephfs/csr-crb.yaml’


# ls /mnt/cephfs/
csr-crb.yaml

# ceph df
GLOBAL:
    SIZE       AVAIL      RAW USED     %RAW USED 
    160GiB     150GiB      10.1GiB          6.30 
POOLS:
    NAME                    ID     USED        %USED     MAX AVAIL     OBJECTS 
    .rgw.root               1      2.08KiB         0       70.9GiB           6 
    default.rgw.control     2           0B         0       70.9GiB           8 
    default.rgw.meta        3           0B         0       70.9GiB           0 
    default.rgw.log         4           0B         0       70.9GiB         175 
    cephfs_data             5      1.55KiB         0       70.9GiB           1 
    cephfs_metadata         6      8.90KiB         0       70.9GiB          21 

5.3 通过ceph kernel driver挂载
首先,我们尝试在server3上测试ceph kernel driver挂载。

和ceph-fuse一样,通过ceph kernel driver挂载也需要admin的权限。不同的是,不需要admin的keyring文件,而是直接需要admin的key:

# mkdir /mnt/kcephfs
# mount -t ceph k8s-master2:6789:/ /mnt/kcephfs/  -o name=admin,secret=AQDaTkVdWImJFBAA4v2JaqI1TUqDxCCUtIXFKg==

挂载成功:
# df -h
ceph-fuse                 71G     0   71G   0% /mnt/cephfs
10.0.244.22:6789:/       71G     0   71G   0% /mnt/kcephfs

六. 增加rbd

6.1 准备rbd pool
在集群内的任意server上创建一个pool,并init:

# ceph osd pool create rbd_pool 100 100
pool 'rbd_pool' created

# rbd pool init rbd_pool

7.2 创建块设备
首先我们尝试在集群内的一个server(node2)上创建块设备。

# rbd create foo --size 4096 --image-feature layering -m k8s-master1  -k ceph.client.admin.keyring -p rbd_pool
# rbd map foo --name client.admin -m k8s-master1 -k ceph.client.admin.keyring -p rbd_pool


# ll /dev/rbd0
brw-rw---- 1 root disk 252, 0 Aug  3 20:32 /dev/rbd0

# ls /dev/rbd/
rbd_pool

# ls /dev/rbd/rbd_pool
foo

这时候,我们可以使用/dev/rbd0了:

# mkfs.ext4  /dev/rbd0 
# mkdir /mnt/rbd
# mount  /dev/rbd0 /mnt/rbd/
# ll /mnt/rbd/
total 16
drwx------ 2 root root 16384 Aug  3 20:33 lost+found

小结
本文实践了使用ceph-deploy安装部署ceph集群的过程,给集群添加了三种类型的客户端,并且解决了一些部署中常见的问题。

附:磁盘初始化初始方式,本人未验证

A. 添加osd.0(磁盘作block,无block.db,无block.wal)

# ceph-deploy osd create server0 --data /dev/vdb

# ceph -s
  cluster:
    id:     744f59b7-c403-48e6-a1c6-2c74901a4d0b
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum server2
    mgr: server2(active)
    osd: 1 osds: 1 up, 1 in

# mount | grep ceph
tmpfs on /var/lib/ceph/osd/ceph-0 type tmpfs (rw,relatime,seclabel)

# ll /var/lib/ceph/osd/ceph-0  
total 48
-rw-r--r--. 1 ceph ceph 189 May  7 15:19 activate.monmap
lrwxrwxrwx. 1 ceph ceph  93 May  7 15:19 block -> /dev/ceph-012c2043-33ef-4219-af69-34c7ed389d41/osd-block-5beb22d5-891c-4d6e-affe-87eb4bc083b2
-rw-r--r--. 1 ceph ceph   2 May  7 15:19 bluefs
-rw-r--r--. 1 ceph ceph  37 May  7 15:19 ceph_fsid
-rw-r--r--. 1 ceph ceph  37 May  7 15:19 fsid
-rw-------. 1 ceph ceph  55 May  7 15:19 keyring
-rw-r--r--. 1 ceph ceph   8 May  7 15:19 kv_backend
-rw-r--r--. 1 ceph ceph  21 May  7 15:19 magic
-rw-r--r--. 1 ceph ceph   4 May  7 15:19 mkfs_done
-rw-r--r--. 1 ceph ceph  41 May  7 15:19 osd_key
-rw-r--r--. 1 ceph ceph   6 May  7 15:19 ready
-rw-r--r--. 1 ceph ceph  10 May  7 15:19 type
-rw-r--r--. 1 ceph ceph   2 May  7 15:19 whoami
可见: 
1. 使用磁盘vdb创建lv供block使用; 
2. osd是mount到tmpfs的(bluefs, ceph_fsid, fsid, keyring等等都存于集群中);

B. 添加osd.1(分区作block,分区作block.db,无block.wal)

把server0的vdc分成两个分区(分区过程省略,注意,要是有gpt分区格式):vdc1作block.db,vdc2作block。

# ceph-deploy osd create server0 --data /dev/vdc2 --block-db /dev/vdc1

# ll  /var/lib/ceph/osd/ceph-1 
total 52
-rw-r--r--. 1 ceph ceph 189 May  7 15:25 activate.monmap
lrwxrwxrwx. 1 ceph ceph  93 May  7 15:25 block -> /dev/ceph-ae408599-db16-4028-914d-4006594c5cd8/osd-block-1edeced4-e5e9-45ac-a5d3-ddd238d720d4
lrwxrwxrwx. 1 root root   9 May  7 15:25 block.db -> /dev/vdc1
-rw-r--r--. 1 ceph ceph   2 May  7 15:25 bluefs
-rw-r--r--. 1 ceph ceph  37 May  7 15:25 ceph_fsid
-rw-r--r--. 1 ceph ceph  37 May  7 15:25 fsid
-rw-------. 1 ceph ceph  55 May  7 15:25 keyring
-rw-r--r--. 1 ceph ceph   8 May  7 15:25 kv_backend
-rw-r--r--. 1 ceph ceph  21 May  7 15:25 magic
-rw-r--r--. 1 ceph ceph   4 May  7 15:25 mkfs_done
-rw-r--r--. 1 ceph ceph  41 May  7 15:25 osd_key
-rw-r--r--. 1 ceph ceph  10 May  7 15:25 path_block.db
-rw-r--r--. 1 ceph ceph   6 May  7 15:25 ready
-rw-r--r--. 1 ceph ceph  10 May  7 15:25 type
-rw-r--r--. 1 ceph ceph   2 May  7 15:25 whoami
可见,使用分区vdc2创建lv供block使用; block.db直接使用vdc1;

C. 添加osd.2(分区作block,分区作block.db,分区作block.wal)

把serve1的vdb分成3个分区:vdb3作block,vdb2作block.db,vdb1作block-wal:

# ceph-deploy osd create server1 --data /dev/vdb3 --block-db /dev/vdb2 --block-wal /dev/vdb1
1
到server1上:

# ll /var/lib/ceph/osd/ceph-2 
total 56
-rw-r--r--. 1 ceph ceph 189 May  7 15:34 activate.monmap
lrwxrwxrwx. 1 ceph ceph  93 May  7 15:34 block -> /dev/ceph-c2f66dc2-076b-46cd-a1cd-e3ef9511a38a/osd-block-7bf0f953-2feb-4064-8d19-873495cae7f5
lrwxrwxrwx. 1 root root   9 May  7 15:34 block.db -> /dev/vdb2
lrwxrwxrwx. 1 root root   9 May  7 15:34 block.wal -> /dev/vdb1
-rw-r--r--. 1 ceph ceph   2 May  7 15:34 bluefs
-rw-r--r--. 1 ceph ceph  37 May  7 15:34 ceph_fsid
-rw-r--r--. 1 ceph ceph  37 May  7 15:34 fsid
-rw-------. 1 ceph ceph  55 May  7 15:34 keyring
-rw-r--r--. 1 ceph ceph   8 May  7 15:34 kv_backend
-rw-r--r--. 1 ceph ceph  21 May  7 15:34 magic
-rw-r--r--. 1 ceph ceph   4 May  7 15:34 mkfs_done
-rw-r--r--. 1 ceph ceph  41 May  7 15:34 osd_key
-rw-r--r--. 1 ceph ceph  10 May  7 15:34 path_block.db
-rw-r--r--. 1 ceph ceph  10 May  7 15:34 path_block.wal
-rw-r--r--. 1 ceph ceph   6 May  7 15:34 ready
-rw-r--r--. 1 ceph ceph  10 May  7 15:34 type
-rw-r--r--. 1 ceph ceph   2 May  7 15:34 whoami
D. 添加osd.3(lv作block,lv作block.db,lv作block.wal)

首先,在server1上,使用vdc创建出3个lv

# pvcreate /dev/vdc
  Physical volume "/dev/vdc" successfully created

# vgcreate myvg /dev/vdc   
  Volume group "myvg" successfully created

# lvcreate -n block-lv -L 30G myvg  
  Logical volume "block-lv" created.

# lvcreate -n db-lv -L 10G myvg
  Logical volume "db-lv" created.

# lvcreate -n wal-lv -L 10G myvg
  Logical volume "wal-lv" created.


# ls /dev/myvg/
block-lv  db-lv  wal-lv
然后,在admin server上创建osd.3:

# ceph-deploy osd create server1 --data myvg/block-lv --block-db myvg/db-lv  --block-wal myvg/wal-lv
到server1上:

# ll /var/lib/ceph/osd/ceph-3  
total 56
-rw-r--r--. 1 ceph ceph 189 May  7 15:47 activate.monmap
lrwxrwxrwx. 1 ceph ceph  18 May  7 15:47 block -> /dev/myvg/block-lv
lrwxrwxrwx. 1 root root  15 May  7 15:47 block.db -> /dev/myvg/db-lv
lrwxrwxrwx. 1 root root  16 May  7 15:47 block.wal -> /dev/myvg/wal-lv
-rw-r--r--. 1 ceph ceph   2 May  7 15:47 bluefs
-rw-r--r--. 1 ceph ceph  37 May  7 15:47 ceph_fsid
-rw-r--r--. 1 ceph ceph  37 May  7 15:47 fsid
-rw-------. 1 ceph ceph  55 May  7 15:47 keyring
-rw-r--r--. 1 ceph ceph   8 May  7 15:47 kv_backend
-rw-r--r--. 1 ceph ceph  21 May  7 15:47 magic
-rw-r--r--. 1 ceph ceph   4 May  7 15:47 mkfs_done
-rw-r--r--. 1 ceph ceph  41 May  7 15:47 osd_key
-rw-r--r--. 1 ceph ceph  16 May  7 15:47 path_block.db
-rw-r--r--. 1 ceph ceph  17 May  7 15:47 path_block.wal
-rw-r--r--. 1 ceph ceph   6 May  7 15:47 ready
-rw-r--r--. 1 ceph ceph  10 May  7 15:47 type
-rw-r--r--. 1 ceph ceph   2 May  7 15:47 whoami
注意: lv应写作 myvg/xx-lv,而不是/dev/myvg/xx-lv。否则会报错。

E. 添加其他osd

为了方便,block, block.db和block.wal都使用分区。

# ceph-deploy osd create server3 --data /dev/vdb3  --block-db /dev/vdb2  --block-wal /dev/vdb1
# ceph-deploy osd create server3 --data /dev/vdc3  --block-db /dev/vdc2  --block-wal /dev/vdc1
# ceph-deploy osd create server2 --data /dev/vdb3  --block-db /dev/vdb2  --block-wal /dev/vdb1
# ceph-deploy osd create server2 --data /dev/vdc3  --block-db /dev/vdc2  --block-wal /dev/vdc1



# ceph -s
  cluster:
    id:     744f59b7-c403-48e6-a1c6-2c74901a4d0b
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum server2
    mgr: server2(active)
    osd: 8 osds: 8 up, 8 in    <-------- 8 个 osd

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 bytes
    usage:   8226 MB used, 339 GB / 347 GB avail
    pgs:     

发表评论

电子邮件地址不会被公开。 必填项已用*标注