Ceph对象网关快速入门
安装Ceph对象网关
1,在 client-node 上执行预安装步骤。如果你打算使用 Civetweb 的默认端口 7480 ,必须通过 firewall-cmd 或 iptables 来打开它。
2,从管理节点的工作目录,在client-node上安装对象网关软件包。
ceph-deploy install --rgw <client-node> [<client-node> ...]
注意:ceph-client为可以连接的主机名或者IP地址,最好设置好ssh免密,否则需要输入密码才能进行安装
最好在对应节点设置好yum源使用以下命令安装,否则安装很慢或者安装失败
yum -y update && yum -y install ceph-radosgw
新建对象网关实例
ceph-deploy rgw create {node_name}
例如
ceph-deploy rgw create node1
查看
[root@admin-node my-cluster]# ceph -s cluster: id: 8dc0f409-70c1-4499-94a9-466abdf4f30d health: HEALTH_OK services: mon: 3 daemons, quorum node1,node2,node3 (age 30m) mgr: node1(active, since 35m), standbys: node2 mds: 1 up:standby osd: 3 osds: 3 up (since 19h), 3 in (since 19h) rgw: 1 daemon active (node1) #一个对象网关运行在node1上 task status: data: pools: 5 pools, 256 pgs objects: 235 objects, 14 MiB usage: 3.0 GiB used, 45 GiB / 48 GiB avail pgs: 256 active+clean
一旦网关开始运行,你就可以通过 7480 端口来访问它(比如 http://client-node:7480 )。
配置 CEPH 对象网关实例
1,通过修改 Ceph 配置文件可以更改默认端口(比如改成 80 )。增加名为 [client.rgw.<client-node>] 的小节,把 <client-node> 替换成你自己 Ceph 客户端节点的短名称(即 hostname -s 的输出)。例如,你的节点名就是 client-node ,在 [global] 节后增加一个类似于下面的小节:
[client.rgw.client-node] rgw_frontends = "civetweb port=80"
例如修改配置文件
[global] fsid = 8dc0f409-70c1-4499-94a9-466abdf4f30d mon_initial_members = node1 mon_host = 192.168.1.101 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx osd pool default size = 2 public network = 192.168.1.0/24 mon_allow_pool_delete = true #增加以下两行 [client.rgw.node1] rgw_frontends = "civetweb port=80"
2,为了使新端口设置生效需要重启Ceph对象网关
如果是在管理节点修改了配置还需要先同步配置至网关节点
ceph-deploy --overwrite-conf admin client-node
重启对象网关
systemctl restart ceph-radosgw.target
你应该可以生成一个未授权的请求,并收到应答。例如,一个如下不带参数的请求:
http://<client-node>:80
应该收到这样的应答:
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>anonymous</ID> <DisplayName/> </Owner> <Buckets/> </ListAllMyBucketsResult>
使用网关
为了使用 REST 接口,首先需要为S3接口创建一个初始 Ceph 对象网关用户。然后,为 Swift 接口创建一个子用户。然后你需要验证创建的用户是否能够访问网关。
为 S3 访问创建 RADOSGW 用户
一个``radosgw`` 用户需要被新建并被分配权限。命令 man radosgw-admin 会提供该命令的额外信息。
为了新建用户,在 gateway host 上执行下面的命令:
sudo radosgw-admin user create --uid="testuser" --display-name="First User"
命令解析
radosgw-admin user create #创建用户 --uid="testuser" #用户名为testuser --display-name="First User" #用户显示名为First User
删除用户
radosgw-admin user rm --uid=testuser
注意:删除用户需要确保没有使用该用户创建的bucket,如果创建了bucket需要先删除bucket才能删除用户,如果bucket内有文件需要先删除文件才能删除bucket
创建用户输入类似以下内容
[root@admin-node ~]# radosgw-admin user create --uid="testuser" --display-name="First User" { "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [], "keys": [ { "user": "testuser", "access_key": "5YE82KZNJLIINFF3BHJQ", "secret_key": "Hek58VS56X47FUeq5UACKAONqIvD6SWxWQZ06Az3" } ], "swift_keys": [], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "default_storage_class": "", "placement_tags": [], "bucket_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "user_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "temp_url_keys": [], "type": "rgw", "mfa_ids": [] }
Note 其中 keys->access_key 和``keys->secret_key`` 的值在访问的时候需要用来做验证
注意
Important 请检查输出的 key。有个时候 radosgw-admin 会在生成的JSON 中的 access_key 和和 secret_key 部分包含有转义字符 \ ,并且一些客户端不知道如何处理 JSON 中的这个字符。补救措施包括移除 JSON 中的 \ 字符,将该字符串封装到引号中,重新生成这个 key 并确保不再包含 \ ,或者手动指定``access_key`` 和和 secret_key 。如果 radosgw-admin 生成的 JSON 中的同一个key中包含转义字符 \ 同时包含有正斜杠 / 形如 \/ ,请只移除 JSON 转义字符 \ ,不要删除正斜杠 / ,因为在 key 中它是一个有效字符。
新建一个Swift子用户
如果你想要使用这种方式访问集群,你需要新建一个 Swift 子用户。创建 Swift 用户包括两个步骤。第一步是创建用户。第二步是创建 secret key。
新建swift用户
radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
参数解析
radosgw-admin subuser create #创建子用户 --uid=testuser #上层用户是testuser --subuser=testuser:swift #子用户id --access=full #权限是所有
输入类似下面这样
{ "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [ { "id": "testuser:swift", "permissions": "full-control" } ], "keys": [ { "user": "testuser", "access_key": "5YE82KZNJLIINFF3BHJQ", "secret_key": "Hek58VS56X47FUeq5UACKAONqIvD6SWxWQZ06Az3" } ], "swift_keys": [ { "user": "testuser:swift", "secret_key": "GYDZVA9SejxTIIQlXo19eg0veJSC0dUk33Yk8zpL" } ], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "default_storage_class": "", "placement_tags": [], "bucket_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "user_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "temp_url_keys": [], "type": "rgw", "mfa_ids": [] }
新建 secret key:
sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
输出类似下面这样
{ "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [ { "id": "testuser:swift", "permissions": "full-control" } ], "keys": [ { "user": "testuser", "access_key": "5YE82KZNJLIINFF3BHJQ", "secret_key": "Hek58VS56X47FUeq5UACKAONqIvD6SWxWQZ06Az3" } ], "swift_keys": [ { "user": "testuser:swift", "secret_key": "LGTP6OUjHgxL7pWLplislHMsSTNr0bZRsgDnLdlT" } ], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "default_storage_class": "", "placement_tags": [], "bucket_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "user_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "temp_url_keys": [], "type": "rgw", "mfa_ids": [] }
验证访问
测试s3访问
为了验证 S3 访问,你需要编写并运行一个 Python 测试脚本。S3 访问测试脚本将连接 radosgw, 新建一个新的 bucket 并列出所有的 buckets。 aws_access_key_id 和 aws_secret_access_key 的值来自于命令``radosgw_admin`` 的返回值 access_key 和 secret_key 。
执行以下步骤
1,你需要安装python-boto包
sudo yum install python-boto
2,新建Python脚本文件
vi s3test.py
3,将下面的内容添加到文件中:
import boto.s3.connection access_key = '5YE82KZNJLIINFF3BHJQ' secret_key = 'Hek58VS56X47FUeq5UACKAONqIvD6SWxWQZ06Az3' conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host='192.168.1.101', port=80, is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.create_bucket('my-new-bucket') for bucket in conn.get_all_buckets(): print "{name} {created}".format( name=bucket.name, created=bucket.creation_date, )
将 {hostname} 替换为你配置了网关服务的节点的主机名。比如 gateway host. 将 {port} 替换为对象网关所使用的端口。
4,运行脚本
输出以下内容
创建新的bucket
[root@admin-node ~]# python s3test.py my-new-bucket 2020-08-07T07:47:17.399Z
使用s3cmd测试访问对象网关
第一步安装测试工具并编写配置文件
yum install s3cmd
配置文件,key为用户testuser对应的key
[root@admin-node ~]# cat /root/.s3cfg [default] access_key = 5YE82KZNJLIINFF3BHJQ secret_key = Hek58VS56X47FUeq5UACKAONqIvD6SWxWQZ06Az3 host_base = 192.168.1.101:80 host_bucket = 192.168.1.101:80/%(bucket) cloudfront_host = 192.168.1.101:80 use_https = False
列出所有bucket
[root@admin-node ~]# s3cmd ls 2020-08-07 07:47 s3://my-new-bucket
创建bucket
s3cmd mb s3://test_bucket
创建后在查看
[root@admin-node ~]# s3cmd ls 2020-08-07 07:47 s3://my-new-bucket 2020-08-07 08:05 s3://test_bucket
上传文件至bucket
[root@admin-node ~]# s3cmd put /etc/fstab s3://test_bucket/
下载文件至当前目录
s3cmd get s3://test_bucket/fstab
测试Swift访问
Swift 访问的验证则可以使用``swift`` 的命令行客户端。可以通过命令 man swift 获取更多命令行选项的更多信息。
执行下面的命令安装 swift 客户端
sudo yum install python-setuptools sudo easy_install pip sudo pip install --upgrade setuptools sudo pip install --upgrade python-swiftclient
注意:如果是Python3版本 easy_install命令类似于easy_install-3.6
执行下面的命令验证 swift 访问:
swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K '{swift_secret_key}' list
使用网关服务器的外网 IP 地址替换其中的 {IP ADDRESS} ,使用新建 swift 用户时执行的命令 radosgw-admin key create 的输出替换其中的 {swift_secret_key} 。使用你的 Civetweb 所使用的端口替换其中 {port} ,比如默认是 7480 。如果你不替换这个端口,它的默认值是 80. 举例如下:
swift -A http://192.168.1.101:80/auth/1.0 -U testuser:swift -K 'LGTP6OUjHgxL7pWLplislHMsSTNr0bZRsgDnLdlT' list
输出如下
my-new-bucket