8.6. 隔离同一池中的隔离命名空间中的镜像

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

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

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

先决条件

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

流程

  1. 创建 rbd 池:

    语法

    ceph osd pool create POOL_NAME PG_NUM

    示例

    [ceph: root@host01 /]# ceph osd pool create mypool 100
    pool 'mypool' created

  2. rbd 池与 RBD 应用关联:

    语法

    ceph osd pool application enable POOL_NAME rbd

    示例

    [ceph: root@host01 /]# ceph osd pool application enable mypool rbd
    enabled application 'rbd' on pool 'mypool'

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

    语法

    rbd pool init -p POOL_NAME

    示例

    [ceph: root@host01 /]#  rbd pool init -p mypool

  4. 创建两个命名空间:

    语法

    rbd namespace create --namespace NAMESPACE

    示例

    [ceph: root@host01 /]# rbd namespace create --namespace namespace1
    
    [ceph: root@host01 /]# rbd namespace create --namespace namespace2
    
    [ceph: root@host01 /]# 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

    示例

    [ceph: root@host01 /]# ceph auth get-or-create client.testuser mon 'profile rbd' osd 'profile rbd pool=rbd namespace=namespace1' -o /etc/ceph/client.testuser.keyring
    
    [ceph: root@host01 /]# 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

    示例

    [ceph: root@host01 /]# 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
    
    [ceph: root@host01 /]# 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

    示例

    [ceph: root@host01 /]# rbd create --namespace namespace1 image01 --size 1G
    
    [ceph: root@host01 /]# rbd create --namespace namespace2 image02 --size 1G

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

    语法

    rbd --namespace NAMESPACE ls --long

    示例

    [ceph: root@host01 /]#  rbd --namespace namespace1 ls --long
    NAME    SIZE  PARENT FMT PROT LOCK
    image01 1 GiB          2
    
    [ceph: root@host01 /]# 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/

    示例

    [ceph: root@host01 /]# 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 密钥环复制到客户端节点:

    语法

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

    示例

    [ceph: root@host01 /]# 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/

    示例

    [ceph: root@host01 /]# scp /etc/ceph/client.newuser.keyring root@host02:/etc/ceph/
    
    [ceph: root@host01 /]# 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

    示例

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

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

    示例

    [ceph: root@host01 /]# 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
    
    [ceph: root@host01 /]# 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. 验证该设备:

    示例

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