3.7. 分隔同一池中的独立命名空间中的镜像

当直接在不使用更高级别的系统(如 OpenStack 或 OpenShift Container Storage)的情况下直接使用 Ceph 块设备时,无法限制用户对特定块设备镜像的访问。与 CephX 功能相结合时,用户可以限制为特定的池命名空间来限制对镜像的访问。

您可以使用 RADOS 命名空间(一个新的身份级别)来识别对象,以在池中客户端之间提供隔离。例如,客户端只能对特定命名空间具有完全权限。这样,每个租户都可行使用不同的 RADOS 客户端,对于很多不同租户访问自己的块设备镜像,这尤其有用。

您可以在同一池中的独立命名空间中隔离块设备镜像。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 将所有内核升级到 4x,并在所有客户端上升级到 librbd 和 librados。
  • 对 monitor 和客户端节点的 root 级别访问。

流程

  1. 创建 rbd 池:

    语法

    ceph osd pool create POOL_NAME PG_NUM

    示例

    [root@mon ~]# ceph osd pool create mypool 100
    pool 'mypool' created

  2. rbd 池与 RBD 应用关联:

    语法

    ceph osd pool application enable POOL_NAME rbd

    示例

    [root@mon ~]# ceph osd pool application enable mypool rbd
    enabled application 'rbd' on pool 'mypool'

  3. 使用 RBD 应用初始化池:

    语法

    rbd pool init -p POOL_NAME

    示例

    [root@mon ~]#  rbd pool init -p mypool

  4. 创建两个命名空间:

    语法

    rbd namespace create --namespace NAMESPACE

    示例

    [root@mon ~]# rbd namespace create --namespace namespace1
    
    [root@mon ~]# rbd namespace create --namespace namespace2
    
    [root@mon ~]# rbd namespace ls --format=json
    [{"name":"namespace2"},{"name":"namespace1"}]

  5. 为两个用户提供命名空间的访问权限:

    语法

    ceph auth get-or-create client.USER_NAME mon 'profile rbd' osd 'profile rbd pool=rbd namespace=NAMESPACE' -o /etc/ceph/client.USER_NAME.keyring

    示例

    [root@mon ~]# ceph auth get-or-create client.testuser mon 'profile rbd' osd 'profile rbd pool=rbd namespace=namespace1' -o /etc/ceph/client.testuser.keyring
    
    [root@mon ~]# ceph auth get-or-create client.newuser mon 'profile rbd' osd 'profile rbd pool=rbd namespace=namespace2' -o /etc/ceph/client.newuser.keyring

  6. 获取客户端的密钥:

    语法

    ceph auth get client.USER_NAME

    示例

    [root@mon ~]# ceph auth get client.testuser
    
    [client.testuser]
    	key = AQDMp61hBf5UKRAAgjQ2In0Z3uwAase7mrlKnQ==
    	caps mon = "profile rbd"
    	caps osd = "profile rbd pool=rbd namespace=namespace1"
    exported keyring for client.testuser
    
    [root@mon ~]# ceph auth get client.newuser
    
    [client.newuser]
    	key = AQDfp61hVfLFHRAA7D80ogmZl80ROY+AUG4A+Q==
    	caps mon = "profile rbd"
    	caps osd = "profile rbd pool=rbd namespace=namespace2"
    exported keyring for client.newuser

  7. 创建块设备镜像,并使用池中的预定义命名空间:

    语法

    rbd create --namespace NAMESPACE IMAGE_NAME --size SIZE_IN_GB

    示例

    [root@mon ~]# rbd create --namespace namespace1 image01 --size 1G
    
    [root@mon ~]# rbd create --namespace namespace2 image02 --size 1G

  8. 可选:获取命名空间和关联的镜像详情:

    语法

    rbd --namespace NAMESPACE ls --long

    示例

    [root@mon ~]#  rbd --namespace namespace1 ls --long
    NAME    SIZE  PARENT FMT PROT LOCK
    image01 1 GiB          2
    
    [root@mon ~]# rbd --namespace namespace2 ls --long
    NAME    SIZE  PARENT FMT PROT LOCK
    image02 1 GiB          2

  9. 将 Ceph 配置文件从 Ceph 监控节点复制到客户端节点:

    scp /etc/ceph/ceph.conf root@CLIENT_NODE:/etc/ceph/

    示例

    [root@mon ~]# scp /etc/ceph/ceph.conf root@host02:/etc/ceph/
    
    root@host02's password:
    ceph.conf                                                                          100%  497   724.9KB/s   00:00

  10. 将 Ceph 监控节点的 admin keyring 复制到客户端节点:

    语法

    scp /etc/ceph/ceph.client.admin.keyring root@CLIENT_NODE:/etc/ceph

    示例

    [root@mon ~]# scp /etc/ceph/ceph.client.admin.keyring root@host02:/etc/ceph/
    
    root@host02's password:
    ceph.client.admin.keyring                                                          100%  151   265.0KB/s   00:00

  11. 将用户的密钥环从 Ceph 监控节点复制到客户端节点:

    语法

    scp /etc/ceph/ceph.client.USER_NAME.keyring root@CLIENT_NODE:/etc/ceph/

    示例

    [root@mon ~]# scp /etc/ceph/client.newuser.keyring root@host02:/etc/ceph/
    
    [root@mon ~]# scp /etc/ceph/client.testuser.keyring root@host02:/etc/ceph/

  12. 映射块设备镜像:

    语法

    rbd map --name NAMESPACE IMAGE_NAME -n client.USER_NAME --keyring /etc/ceph/client.USER_NAME.keyring

    示例

    [root@mon ~]# rbd map --namespace namespace1 image01  -n  client.testuser --keyring=/etc/ceph/client.testuser.keyring
    
    /dev/rbd0
    
    [root@mon ~]# rbd map --namespace namespace2 image02 -n client.newuser --keyring=/etc/ceph/client.newuser.keyring
    
    /dev/rbd1

    这不允许访问同一池中的其他命名空间中的用户。

    示例

    [root@mon ~]# rbd map --namespace namespace2 image02  -n  client.testuser --keyring=/etc/ceph/client.testuser.keyring
    
    rbd: warning: image already mapped as /dev/rbd1
    rbd: sysfs write failed
    rbd: error asserting namespace: (1) Operation not permitted
    In some cases useful info is found in syslog - try "dmesg | tail".
    2021-12-06 02:49:08.106 7f8d4fde2500 -1 librbd::api::Namespace: exists: error asserting namespace: (1) Operation not permitted
    rbd: map failed: (1) Operation not permitted
    
    [root@mon ~]# rbd map --namespace namespace1 image01 -n client.newuser --keyring=/etc/ceph/client.newuser.keyring
    
    rbd: warning: image already mapped as /dev/rbd0
    rbd: sysfs write failed
    rbd: error asserting namespace: (1) Operation not permitted
    In some cases useful info is found in syslog - try "dmesg | tail".
    2021-12-03 12:16:24.011 7fcad776a040 -1 librbd::api::Namespace: exists: error asserting namespace: (1) Operation not permitted
    rbd: map failed: (1) Operation not permitted

  13. 验证设备:

    示例

    [root@mon ~]# rbd showmapped
    
    id pool namespace      image   snap device
    0  rbd  namespace1  image01 -  /dev/rbd0
    1  rbd  namespace2   image02 -  /dev/rbd1