Ceph配置与认证授权
Ceph的配置了解即可,因为Ceph目前的配置很多都能自动的去调整,而且优化的不错,正常情况下我们不去需要去修改,但是我们得知道怎么去改。
目前我们使用的版本的配置文件里面内容是非常少的
[root@ceph01 ceph]# cat /etc/ceph/ceph.conf
# minimal ceph.conf for dc6d1544-17ef-11ef-9393-000c297dea16
[global]
fsid = dc6d1544-17ef-11ef-9393-000c297dea16
mon_host = [v2:192.168.101.10:3300/0,v1:192.168.101.10:6789/0] [v2:192.168.101.20:3300/0,v1:192.168.101.20:6789/0] [v2:192.168.101.30:3300/0,v1:192.168.101.30:6789/0]
在以前的版本里面是非常多的
Ceph集群配置的来源
- 编译时设置的值
- mon集群的集中配置数据库
- 保存在本地的配置文件
- 环境变量
- 命令行输入
- 管理员配置的临时生效的配置
1. 为什么现在不采用修改配置文件的方式了呢?
因为如果你要修改osd的配置项的话,你改完配置文件之后需要把配置文件分发到所有的osd节点,并且重启osd进程这个配置才会生效,很麻烦。但是现在采用命令行的方式去修改的话是立即生效并且不用每个节点都执行的。这种方式取代了修改配置文件。
2. Ceph元变量
- $cluster:集群名称,多用于相同硬件上运行多个集群的场景
- $type:服务或进程的类型,如mds,osd,mon等
- $id:服务或客户端ID,如osd.0 ,osd为$type的值, 0为$id的值
- $host:服务所在主机的名称
- $name:$type+$id
- $pid:服务的进程ID
可以使用**ceph orch ps **来查看
[root@ceph01 ceph]# ceph orch ps
NAME HOST PORTS STATUS REFRESHED AGE MEM USE MEM LIM VERSION IMAGE ID CONTAINER ID
alertmanager.ceph01 ceph01 *:9093,9094 running (2d) 7m ago 3d 50.0M - 0.23.0 ba2b418f427c f549d23bce6e
crash.ceph01 ceph01 running (2d) 7m ago 3d 17.1M - 16.2.13 e08a45948779 0785e13fe4ee
crash.ceph02 ceph02 running (2d) 2s ago 3d 20.1M - 16.2.13 e08a45948779 11dc05748956
crash.ceph03 ceph03 running (2d) 8m ago 3d 29.1M - 16.2.13 e08a45948779 8a19421c0fe1
grafana.ceph01 ceph01 *:3000 running (2d) 7m ago 3d 149M - 8.3.5 dad864ee21e9 6c72c1cfe9e2
mgr.ceph01.luyssm ceph01 *:9283 running (2d) 7m ago 3d 527M - 16.2.13 e08a45948779 bb97a49842cd
3. 使用命令行修改配置
3.1 全部修改(使用服务名)
当我们指定的是某个服务的时候,他会修改这个服务的所有进程配置
[root@ceph01 ceph]# ceph config set osd debug_osd 20
[root@ceph01 ceph]# ceph config show osd.0 debug_osd
20/20
[root@ceph01 ceph]# ceph config show osd.1 debug_osd
20/20
[root@ceph01 ceph]# ceph config show osd.2 debug_osd
20/20
我们可以看到,不管是osd几,都被修改成了20,那我们只想修改一个呢?
3.2 部分修改(修改进程)
修改osd.1 为10,其他的还是20
[root@ceph01 ceph]# ceph config show osd.1 debug_osd
10/10
[root@ceph01 ceph]# ceph config show osd.2 debug_osd
20/20
这样就修改了osd.1这个进程的配置为10,其他的一样还是20
3.3 临时生效
使用命令行去修改大部分配置都是立即生效并且是永久生效的,但还有一些配置是他要求你必须重启进程才会生效的,这种配置我们就可以使用临时生效来代替,临时生效会立即生效。所以我们可以先设置永久生效,然后再设置一个临时生效,那么就可以避免立即重启进程。
[root@ceph01 ceph]# ceph tell osd.3 config set debug_osd 5
{
"success": ""
}
[root@ceph01 ceph]# ceph config show osd.3 debug_osd
5/5
3.4 配置项
Ceph的配置项非常的多,我们可以去过滤
[root@ceph01 ceph]# ceph config ls |wc -l
2068
总共是有2068个配置项
[root@ceph01 ceph]# ceph config ls |grep mon_allow
mon_allow_pool_delete
mon_allow_pool_size_one
[root@ceph01 ~]# ceph config show osd.1 |grep debug_osd
debug_osd 10/10 mon
我们可以通过grep来过滤出我们想要的配置
3.5 老版本提供的配置文件
老版本提供的配置文件也是存在的,现在被放到了/usr/share/doc/ceph/sample.ceph.conf,想看可以打开看看
3. Ceph网络
客户端来连接ceph的时候,无论是读还写写数据,走的都是一张网卡,这样会导致带宽过大,并且一个pg写入数据之后其他pg也需要同步。所以Ceph推荐每个主机有2张网卡,一张是 public network 用来接受用户的读写请求,另一张网卡为cluster network 用来集群内部同步备份数据,当然,ceph并没有对网卡做强制要求,只有一张网卡的话也是没有问题的。
3.1 对现有集群加入cluster network
[root@ceph01 ~]# ceph config set mon public_network 10.104.0.0/16
[root@ceph01 ~]# ceph config set mon cluster_network 192.168.101.0/24
[root@ceph01 ~]# ceph config get mon public_network
10.104.0.0/16
[root@ceph01 ~]# ceph config get mon cluster_network
192.168.101.0/24
4. Cephx(认证授权)
我们之前使用rados命令手动上传文件到存储池内,但是这只是做个测试用的,ceph的功能肯定是对外提供服务,既然是对外提供服务那么就不可能是每个人来了我都给他分配存储,所以这时候就需要用到认证,授权,ceph采用的这种认证方式就是cephx
4.1 认证流程
- 客户端携带用户名,cephx密钥向mon发起连接,mon收到这个请求之后验证用户的身份,身份认证通过之后返回一个session key(令牌)给客户端,同时mon将这个session key(令牌)通告给其他的服务
- 客户端收到session key之后进行解密,并向mon申请一个ticket(票据),mon产生ticket返回给客户端
- 客户端之后的每次请求就都是使用ticket进行(ticket在有效期内),因为客户端,mon,osd,mds都拥有由mon产生的令牌,所以他们都可以认证这个ticket是否合法
4.2 Cephx中的用户
Cephx协议对用户的格式有严格的要求,必须使用$type.$id的格式
Cephx协议将用户分为两类
- 客户端:用户客户端访问,$type永久设置为client,如client.admin、client.cinder
- 服务进程:不止用户需要找mon认证,服务也是需要的,服务的$type为对应的组件名称,如 osd.0 、mgr.ceph01.xxxx
4.2.1 查看用户列表
[root@ceph01 ~]# ceph auth ls
osd.0
key: AQASi01msk5MJRAAJNFrw1pvhHP3cxhb8eRIWg==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQAri01m0J6QNxAAWIW7gAX8mZ39vh4g6w+e5Q==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.2
key: AQCKi01m7V6TOxAA/dEuaEUIi8TfgHm2nmg2TA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.3
key: AQBmjE1mRcgVGhAAjeehuD7EUEE9bSacnfQ+kw==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
……………………
- key:这里的面显示key就是他的密钥
- caps:这个就是他的授权信息,授权部分会说
4.3 用户创建
创建用户有3种方式
ceph auth add
如果用户不存在,则创建用户并添加对应权限
如果用户存在,且指定的权限与当前权限一致,则不进行任何修改且没有输出
如果用户存在,且指定的权限与当前权限不一致,则提示
ceph auth get-or-create
- 当用户不存在,则创建用户、添加权限并返回用户和keyring
- 当用户存在,且指定的权限和当前权限一致,则不做任何修改,并返回用户和key
- 如果用户存在,且指定的权限和当前的权限不一致,则保持权限不变,并返回报错信息
ceph auth get-or-create-key
- 当用户不存在,则创建用户、添加并返回用户和keyring
- 当用户存在,且指定的权限和当前的权限一致,则不做修改,并返回key
- 如果用户存在,且指定的权限和当前的权限不一致,则保持权限不变,并返回报错信息
4.3.1 创建用户
[root@ceph01 ~]# ceph auth get-or-create client.test
[client.test]
key = AQAbw1FmmuEAHhAAI6YeGmQV0RUTsCXme/O3+Q==
[root@ceph01 ~]# ceph auth ls|grep test -A1
installed auth entries:
client.test
key: AQAbw1FmmuEAHhAAI6YeGmQV0RUTsCXme/O3+Q==
这里显示的跟其他用户不一样,因为我们只创建了用户,并没有给他任何权限,所以这里只显示他的密钥
如果要将文件保存到本地的话,文件名需要注意一下命名规范:$cluster.client.$id.keyring
如果test用户的文件名就应该是 ceph.client.test.keyring
4.3.2 删除用户
[root@ceph01 ~]# ceph auth rm client.test
updated
[root@ceph01 ~]# ceph auth ls|grep test -A1
installed auth entries:
现在用户已经被删掉了
5. 用户授权
刚刚用户的创建和删除已经可以了,但是现在创建出来的用户是没有任何权限的,所以我们需要授权
在ceph中没有拒绝 这个权限,只有允许,意思就是只要没有给权限,那么就是没有权限
下面这些profile 开头的这些都属于x权限里的一种
借用Linux老师的一句话来总结授权:
什么样的用户有什么样的权限,对什么样的服务做什么样的操作
5.1 创建用户并授权
[root@ceph01 ~]# ceph auth get-or-create client.test mon 'allow r' osd 'allow rw pool=test_pool'
[client.test]
key = AQAlzFFm+6QnMRAA3lNgtJzN+/GByVWXfXhvrA==
[root@ceph01 ~]# ceph auth get client.test
[client.test]
key = AQAlzFFm+6QnMRAA3lNgtJzN+/GByVWXfXhvrA==
caps mon = "allow r"
caps osd = "allow rw pool=test_pool"
[root@ceph01 ~]# ceph auth get client.test > ./ceph.client.test.keyring
# 使用这个用户访问集群
[root@ceph01 ~]# ceph osd pool ls --name client.test --keyring ./ceph.client.test.keyringdevice_health_metrics
test_pool
test02
# 上传文件
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test_pool put keyring ./ceph.client.test.keyring
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test_pool ls
keyring
# 尝试上传到权限之外的pool
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test02 put keyring ./ceph.client.test.keyring
error putting test02/keyring: (1) Operation not permitted
现在test这个用户就仅仅只能对test_pool这个资源池上传文件,对其他的资源池上传文件就会报错操作没有权限
[root@ceph01 ~]# ceph auth get-or-create client.root mon 'allow *' mgr 'allow *' osd 'allow *' mds 'allow *'
[client.root]
key = AQCNzlFmeeC6DhAAvmSyiuYXg/qiOp4qCKnZLQ==
[root@ceph01 ~]# ceph auth ls |grep -A5 root
installed auth entries:
client.root
key: AQCNzlFmeeC6DhAAvmSyiuYXg/qiOp4qCKnZLQ==
caps: [mds] allow *
caps: [mgr] allow *
caps: [mon] allow *
caps: [osd] allow *
# 将文件导出并使用
[root@ceph01 ~]# ceph health detail --name client.root --keyring ./ceph.client.root.keyring
HEALTH_OK
[root@ceph01 ~]# ceph auth get-or-create client.test01 mon 'allow r' osd 'allow rw pool=test, allow r pool=test01 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data' mds 'allow r'
[client.test01]
key = AQCP0lFm2HNDAxAA+lJ9p8EYuAT6OQQabNuyYA==
[root@ceph01 ~]# ceph auth get client.test01
[client.test01]
key = AQCP0lFm2HNDAxAA+lJ9p8EYuAT6OQQabNuyYA==
caps mds = "allow r"
caps mon = "allow r"
caps osd = "allow rw pool=test, allow r pool=test01 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data"
exported keyring for client.test01
这里的osd里面有2个之前没见过的池,这两个就是文件系统,因为你要使用这个文件系统,就必须对这两个池有权限
5.2 修改用户权限
当权限给错了,或者后期需要修改权限时,并不需要删除用户
# 去掉刚刚创建的test01用户的mds权限,以及文件系统的权限
[root@ceph01 ~]# ceph auth caps client.test01 mon 'allow r' osd 'allow rw pool=test, allow r pool=test01'
updated caps for client.test01
注意,权限是没有删除的,所谓的修改权限只不过就是将你需要的权限重新再给一遍