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