Cephx认证及rbd的使用

CephX 认证机制:

Ceph 使用 cephx 协议对客户端进行身份认证 cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授 权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx 认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。

5.1:授权流程:

每个 mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 mon 节点就不存在单点 故障和认证性能瓶颈 mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key, session key 通 过 客 户 端 秘 钥 进 行 加 密 , 秘 钥 是 在 客 户 端 提 前 配 置 好 的 , /etc/ceph/ceph.client.admin.keyring 客户端使用 session key 向 mon 请求所需要的服务,mon 向客户端提供一个 tiket,用于向 实际处理数据的 OSD 等服务验证客户端身份,MON 和 OSD 共享同一个 secret,因此 OSD 会信任所有 MON 发放的 tiket tiket 存在有效期。

注意: CephX 身份验证功能仅限制在 Ceph 的各组件之间,不能扩展到其他非 ceph 组件 Ceph 只负责认证授权,不能解决数据传输的加密问题。

5.2:ceph 用户:

用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。
通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池 及存储池中的数据。
ceph 支持多种类型的用户,但可管理的用户都属于 client 类型 区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用 cephx 协议,但是它们为非客户端。 通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如client.admin。

[root@ceph-node2 ~]# cat /etc/ceph/ceph.client.admin.keyring 
[client.admin] 
		key = AQAGDKJfQk/dAxAA3Y+9xoE/p8in6QjoHeXmeg== 
		caps mds = "allow *" 
		caps mgr = "allow *" 
		caps mon = "allow *" 
		caps osd = "allow *"
列出指定用户信息:
[root@ceph-01 ~]# ceph auth get osd.10
[osd.10]
	key = AQCTtpZf6R/kFhAAz9nBeQ+0KU7t1hKlaZboCg==
	caps mgr = "allow profile osd"
	caps mon = "allow profile osd"
	caps osd = "allow *"
exported keyring for osd.10
[root@ceph-01 ~]# ceph auth get client.admin
[client.admin]
	key = AQBXkmlfcQsnLhAARpCVF4cgDMi92+cAH2wz3A==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
exported keyring for client.admin
5.3:ceph 授权和使能:

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授 权范围或级别。
通用的语法格式:daemon-type ‘allow caps’ […]
能力一览表:

  • r:向用户授予读取权限。访问监视器(mon)以检索 CRUSH 运行图时需具有此能力。
  • w:向用户授予针对对象的写入权限。
  • x:授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能 力。
  • *:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力 。
  • class-read:授予用户调用类读取方法的能力,属于是 x 能力的子集。
  • class-write:授予用户调用类写入方法的能力,属于是 x 能力的子集。
  • profile osd:授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限。授予 OSD 权限, 使 OSD 能够处理复制检测信号流量和状态报告(获取 OSD 的状态信息)。
  • profile mds:授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限。
  • profile bootstrap-osd:授予用户引导 OSD 的权限(初始化 OSD 并将 OSD 加入 ceph 集群),授 权给部署工具,使其在引导 OSD 时有权添加密钥。
  • profile bootstrap-mds:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导 元数据服务器时有权添加密钥。
列出用户
[root@ceph-01 ~]# ceph auth list
mds.ceph-01
	key: AQAVomlfjA25OBAAVIR0ukw//Y5oDl2hF1udqg==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
mds.ceph-02
	key: AQAXomlfzwqjDBAAcuPbTNOGV3Tg9TFMw4oQjg==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
mds.ceph-03
	key: AQAYomlfNz4THBAA3PihKm4mT2DcrKNQH1+qWA==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
osd.0
	key: AQB+l2lfAjnPDBAAL7k9+aZSucTwquzIISvESw==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *

添加用户
[root@ceph-01 ~]# ceph auth add client.zhangsan mon 'allow r' osd 'allow rwx pool=kube'
added key for client.zhangsan
# 验证key
[root@ceph-01 ~]# ceph auth get client.zhangsan
[client.zhangsan]
	key = AQCeTShhFeVDChAA4LUTYm4oPRbdHtgb71982g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=kube"
exported keyring for client.zhangsan

ceph auth get-or-create:
ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方 括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥, 还可以使用 -o 指定文件名选项将输出保存到某个文件。

[root@ceph-01 ~]# ceph auth get-or-create client.lisi mon 'allow r' osd 'allow rwx pool=kube'
[client.lisi]
	key = AQBzTihhdITOLBAAjH8qwJ07mvZmCaNqI/LkrA==
# 验证用户
[root@ceph-01 ~]# ceph auth get client.lisi
[client.lisi]
	key = AQBzTihhdITOLBAAjH8qwJ07mvZmCaNqI/LkrA==
	caps mon = "allow r"
	caps osd = "allow rwx pool=kube"
exported keyring for client.lisi
# 再次创建lisi用户
[root@ceph-01 ~]# ceph auth get-or-create client.lisi mon 'allow r' osd 'allow rwx pool=kube'
[client.lisi]
	key = AQBzTihhdITOLBAAjH8qwJ07mvZmCaNqI/LkrA==
# 可以看到返回得key和之前一样

删除用户
[ceph@ceph-deploy ceph-cluster]$ ceph auth del client.tom 
updated
5.4:秘钥环管理:

ceph 的秘钥环是一个保存了 secrets、keys、certificates 并且能够让客户端通认证访问 ceph 的 keyring file(集合文件),一个 keyring file 可以保存一个或者多个认证信息,每一个 key 都 有一个实体名称加权限,类型为:

 {client、mon、mds、osd}.name
导出用户认证信息至 keyring 文件

将用户信息导出至 keyring 文件,对用户信息进行备份。

#创建用户: 
[ceph@ceph-deploy ceph-cluster]$ ceph auth get-or-create client.user1 mon 'allow r' osd 'allow * pool=mypool' 
[client.user1] 
		key = AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ== 
#验证用户 
[ceph@ceph-deploy ceph-cluster]$ ceph auth get client.user1 
exported keyring for client.user1 
[client.user1] 
		key = AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ== 
		caps mon = "allow r" 
		caps osd = "allow * pool=mypool" 
#创建 keyring 文件: 
[ceph@ceph-deploy ceph-cluster]$ ceph-authtool --create-keyring ceph.client.user1.keyring #验证 keyring 文件: 
[ceph@ceph-deploy ceph-cluster]$ cat ceph.client.user1.keyring #是个空文件 
[ceph@ceph-deploy ceph-cluster]$ file ceph.client.user1.keyring
ceph.client.user1.keyring: empty 
#导出 keyring 至指定文件 
[ceph@ceph-deploy ceph-cluster]$ ceph auth get client.user1 -o ceph.client.user1.keyring exported keyring for client.user1 
#验证指定用户的 keyring 文件: 
[ceph@ceph-deploy ceph-cluster]$ cat ceph.client.user1.keyring 
		[client.user1] key = AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ== 
		caps mon = "allow r" 
		caps osd = "allow * pool=mypool"

在创建包含单个用户的密钥环时,通常建议使用 ceph 集群名称、用户类型和用户名及 keyring 来 命 名 , 并 将 其 保 存 在 /etc/ceph 目 录 中 。 例 如 为 client.user1 用 户 创 建 ceph.client.user1.keyring。

Ceph rbd的使用

Ceph支持一个非常好的特性,以COW(写时复制)的方式从RBD快照创建克隆,在Ceph中被称为快照分层。分层特性允许用户创建多个CEPH RBD克隆实例。这些特性应用于OpenStack等云平台中,使用快照形式保护ceph RBD 镜像,快照是只读的,但COW克隆是完全可以写 ,可以多次来孵化实例,对云平台来说是非常有用的。
Ceph RBD镜像有format-1 和 format-2两种类型,RBD支持这两种类型,但是分层特性COW克隆特性只支持format-2镜像,默认RBD创建的镜像是format-1。(这个在克隆的时候特别重要)

先看看自己的Linux内核支不支持rbd块设备

modprobe rbd

如果有错误信息说明内核不支持,那你就先去升级一下内核吧~
没有则继续!
在一个ceph集群中,我们可以创建rbd块设备来进行使用。先看一下我的pool
在这里插入图片描述

我们这里新建了一个oss的pool,以下的块设备都是建立在oss这个pool中。

1. 首先先创建一个块设备

在这里插入图片描述

通过rbd create (pool_name)/(rbd_name) --size xxxxxMB就可以创建一个块设备了,这里有两个知识点。
一个是斜杠 / 前面的是这个块设备建立在的pool的名字,后面是这个块设备的名字(自己定义的),我们在test这个pool上建立了一个叫myrbd1的块设备,如果没有斜杠 / 则默认建立在rbd这个pool上(重要!!!!)
还有一个是这个size的大小,这个大小可以超过你实际pool的大小,这个叫做瘦分配,也叫超卖和按需分配。创建块之后可以通过指令rbd resize test/myrbd1 --size 51200 --allow-shrink来动态的更改。如下
在这里插入图片描述

2. 映射改块设备到你的机器

rbd map oss/myrbd1
在这里插入图片描述
得到块设备的映射/dev/rbd0
这个时候你就可以像操作机器上的 块设备一样操作该设备了。

3. 挂载并且使用
[root@ceph-04 ~]# mkfs.xfs -f /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=16, agsize=819200 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@ceph-04 ~]# mount /dev/rbd0 /mnt/

如上,写入文件系统以后就可以挂载到目录上去啦!
然后我们 写点东西进去试试

[root@ceph-04 ~]# mount /dev/rbd0 /mnt/
[root@ceph-04 ~]# dd if=/dev/zero of=/mnt/file bs=100M count=5 oflag=direct
5+0 records in
5+0 records out
524288000 bytes (524 MB) copied, 6.25902 s, 83.8 MB/s
[root@ceph-04 ~]# rados df
POOL_NAME                    USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED   RD_OPS      RD   WR_OPS      WR USED COMPR UNDER COMPR 
.rgw.root                 768 KiB       4      0     12                  0       0        0      154 154 KiB        4   4 KiB        0 B         0 B 
cephfs_data               4.5 GiB   12109      0  36327                  0       0        0    28634 1.1 GiB 31918026 248 GiB        0 B         0 B 
cephfs_metadata           2.1 GiB    1146      0   3438                  0       0        0  2447920 2.4 GiB 19105085  74 GiB        0 B         0 B 
default.rgw.buckets.data   33 MiB       3      0      9                  0       0        0        0     0 B       13  11 MiB        0 B         0 B 
default.rgw.buckets.index   253 B       1      0      3                  0       0        0       10  10 KiB        4   2 KiB        0 B         0 B 
default.rgw.control           0 B       8      0     24                  0       0        0        0     0 B        0     0 B        0 B         0 B 
default.rgw.log               0 B     207      0    621                  0       0        0 57607891  55 GiB 38383594     0 B        0 B         0 B 
default.rgw.meta          1.9 MiB      11      0     33                  0       0        0      398 375 KiB       27  14 KiB        0 B         0 B 
kube                       48 GiB    4242      0  12726                  0       0        0  1131983  41 GiB  8717671 535 GiB        0 B         0 B 
oss                       1.5 GiB     155      0    465                  0       0        0      431 1.7 MiB      384 528 MiB        0 B         0 B 
tgtpool                    52 MiB      12      0     36                  0       0        0      496 460 KiB        0     0 B        0 B         0 B 

total_objects    17898
total_used       68 GiB
total_avail      472 GiB
total_space      540 GiB

4. 创建快照
[root@ceph-04 ~]# rbd snap create --snap mysnap oss/myrbd1
[root@ceph-04 ~]# rbd snap ls oss/myrbd1
SNAPID NAME   SIZE   PROTECTED TIMESTAMP                
     4 mysnap 50 GiB           Fri Aug 27 11:28:08 2021

如上创建了一个myrbd1的 快照,快照的名字叫做mysnap,接下来我们试试快照的回滚功能。

5. 回滚

上一步我们创建了一个500M的空文件

[root@ceph-04 ~]# ll -h /mnt/
total 500M
-rw-r--r-- 1 root root 500M Aug 27 11:25 file

我们先删除该文件然后卸载块, 然后进行回滚。

[root@ceph-04 ~]# rm -rf /mnt/file 
[root@ceph-04 ~]# ls /mnt/
[root@ceph-04 ~]# umount /dev/rbd0
[root@ceph-04 ~]# rbd unmap oss/myrbd1

[root@ceph-01 ~]# rbd snap rollback oss/myrbd1@mysnap
Rolling back to snapshot: 100% complete...done.
[root@ceph-01 ~]# rbd map oss/myrbd1
/dev/rbd0
[root@ceph-01 ~]# mount /dev/rbd0 /mnt/
[root@ceph-01 ~]# ls -l /mnt/
total 512000
-rw-r--r-- 1 root root 524288000 Aug 27 11:25 file

重新挂载/dev/rbd0然后发现!!file这个文件又出来啦~~

6. 模板与克隆

先看看该块设备支不支持创建快照模板
image-format 必须为2

[root@ceph-01 ~]# ls -l /mnt/
total 512000
-rw-r--r-- 1 root root 524288000 Aug 27 11:25 file
[root@ceph-01 ~]# rbd info oss/myrbd1
rbd image 'myrbd1':
	size 50 GiB in 12800 objects
	order 22 (4 MiB objects)
	snapshot_count: 1
	id: 15ab2f2d8e796
	block_name_prefix: rbd_data.15ab2f2d8e796
	format: 2
	features: layering, exclusive-lock
	op_features: 
	flags: 
	create_timestamp: Fri Aug 27 11:16:13 2021
	access_timestamp: Fri Aug 27 11:16:13 2021
	modify_timestamp: Fri Aug 27 11:16:13 2021

创建改块设备也可以这样设置

rbd create oss/myrbd3 --size 102400 --image-format 2

把该块做成模板,首先要把做成模板的快照做成protect(重要!!!)

rbd snap protect oss/myrbd1@mysnap

(通过rbd snap unprotect test/myrbd1@mysnap可以去掉这个保护,但是这样的话就 不能克隆了)
然后可以利用这个快照来当模板来克隆了,我们克隆一个叫myrbd2的块 出来试试
先umount myrbd1这个块。

umount /dev/rbd0

然后克隆一个在oss的pool的myrbd2的块。

rbd clone oss/myrbd1@mysnap test/myrbd2
[root@ceph-01 ~]# rbd -p oss ls
myrbd1
myrbd2

如上看到test这个池上有两个块设备了,一个是原来的myrbd1,一个是通过myrbd的镜像模板克隆出来的myrbd2。
接下来我们看看这个myrbd2看看和myrbd1有什么不一样。
先映射myrbd2

rbd map test/myrbd2 

因为 是克隆myrbd1的,myrbd1上本来就有文件系统,所以myrbd2上也有文件系统,直接挂载就好了

[root@ceph-01 ~]# mount /dev/rbd0 /mnt/
[root@ceph-01 ~]# ls -l /mnt/
total 512000
-rw-r--r-- 1 root root 524288000 Aug 27 11:25 file

看到了吗!!!!myrbd2的内容上也是和myrbd1是相同的!!!(因为是克隆来的嘛)
看一下myrbd2信息

[root@ceph-01 ~]# rbd info oss/myrbd2
rbd image 'myrbd2':
	size 50 GiB in 12800 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 15b0cca9d4976
	block_name_prefix: rbd_data.15b0cca9d4976
	format: 2
	features: layering, exclusive-lock
	op_features: 
	flags: 
	create_timestamp: Fri Aug 27 14:37:14 2021
	access_timestamp: Fri Aug 27 14:37:14 2021
	modify_timestamp: Fri Aug 27 14:37:14 2021
	parent: oss/myrbd1@mysnap
	overlap: 50 GiB

这个时候的myrbd2还是依赖myrbd1的镜像mysnap的,如果myrbd1的mysnap被删除或者怎么样,myrbd2也不能够使用了,要想独立出去,就必须将父镜像的信息合并flattern到子镜像中,

[root@ceph-01 ~]# rbd flatten oss/myrbd2
Image flatten: 100% complete...done.
[root@ceph-01 ~]# rbd info oss/myrbd2
rbd image 'myrbd2':
	size 50 GiB in 12800 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 15b0cca9d4976
	block_name_prefix: rbd_data.15b0cca9d4976
	format: 2
	features: layering, exclusive-lock
	op_features: 
	flags: 
	create_timestamp: Fri Aug 27 14:37:14 2021
	access_timestamp: Fri Aug 27 14:37:14 2021
	modify_timestamp: Fri Aug 27 14:37:14 2021

这样myrbd2就独立于myrbd1了
可以通过如下方法删除镜像模板了

[root@ceph-01 ~]# rbd snap unprotect oss/myrbd1@mysnap
[root@ceph-01 ~]# rbd snap rm oss/myrbd1@mysnap
Removing snap: 100% complete...done.
[root@ceph-01 ~]# rbd snap ls oss/myrbd1

这个时候就已经删除镜像模板了。

查看rbd得一些命令:

1、查看指定pool下得rbd:
[root@ceph-node01 ~]# rbd -p kube ls
kubernetes-dynamic-pvc-72de50ef-dc4c-11ea-a0f0-d2a608bc0edb
2、查看rbd镜像得详细信息
[root@ceph-node01 ~]# rbd -p kube info kubernetes-dynamic-pvc-72de50ef-dc4c-11ea-a0f0-d2a608bc0edb
rbd image 'kubernetes-dynamic-pvc-72de50ef-dc4c-11ea-a0f0-d2a608bc0edb':
	size 5 GiB in 1280 objects
	order 22 (4 MiB objects)
	id: 20db66b8b4567
	block_name_prefix: rbd_data.20db66b8b4567
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Wed Aug 12 11:30:19 2020
3、查看rbd得块信息,每个块默认4M。
rados -p pri-c-4aed5defe55044d8a7cf246a06e00004 ls |grep rbd_data.1b1d06b8b4567
4、查看每个块得信息:
rados -p pri-c-4aed5defe55044d8a7cf246a06e00004 stat rbd_data.3fa0f06b8b4567.000000000000016a
5、查看每个blok得map信息:
ceph osd map pri-c-4aed5defe55044d8a7cf246a06e00004 rbd_data.3fa0f06b8b4567.000000000000016a
6、过滤指定pool rbd blok开头信息,并查看每个blok得map信息:
for i in `rados -p  pri-c-4aed5defe55044d8a7cf246a06e00004 ls | grep rbd_data.1b1d06b8b4567`;do ceph osd map pri-c-4aed5defe55044d8a7cf246a06e00004 ${i}; done
7、查看指定pool下的每个块设备使用情况
rbd du --pool kube	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值