Ceph对象网关快速入门
安装Ceph对象网关
1,在 client-node 上执行预安装步骤。如果你打算使用 Civetweb 的默认端口 7480 ,必须通过 firewall-cmd 或 iptables 来打开它。
2,从管理节点的工作目录,在client-node上安装对象网关软件包。
1 | ceph-deploy install --rgw <client-node> [<client-node> ...] |
注意:ceph-client为可以连接的主机名或者IP地址,最好设置好ssh免密,否则需要输入密码才能进行安装
最好在对应节点设置好yum源使用以下命令安装,否则安装很慢或者安装失败
1 | yum -y update && yum -y install ceph-radosgw |
新建对象网关实例
1 | ceph-deploy rgw create {node_name} |
例如
1 | ceph-deploy rgw create node1 |
查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [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] 节后增加一个类似于下面的小节:
1 2 | [client.rgw.client-node] rgw_frontends = "civetweb port=80" |
例如修改配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 | [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对象网关
如果是在管理节点修改了配置还需要先同步配置至网关节点
1 | ceph-deploy --overwrite-conf admin client-node |
重启对象网关
1 | systemctl restart ceph-radosgw.target |
你应该可以生成一个未授权的请求,并收到应答。例如,一个如下不带参数的请求:
1 | http: //<client-node>:80 |
应该收到这样的应答:
1 2 3 4 5 6 7 | <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 上执行下面的命令:
1 | sudo radosgw-admin user create --uid= "testuser" --display-name= "First User" |
命令解析
1 2 3 4 | radosgw-admin user create #创建用户 --uid= "testuser" #用户名为testuser --display-name= "First User" #用户显示名为First User |
删除用户
1 | radosgw-admin user rm --uid=testuser |
注意:删除用户需要确保没有使用该用户创建的bucket,如果创建了bucket需要先删除bucket才能删除用户,如果bucket内有文件需要先删除文件才能删除bucket
创建用户输入类似以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | [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" : [] } |
1 | Note 其中 keys->access_key 和``keys->secret_key`` 的值在访问的时候需要用来做验证 |
注意
1 | 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用户
1 | radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full |
参数解析
1 2 3 4 5 | radosgw-admin subuser create #创建子用户 --uid=testuser #上层用户是testuser --subuser=testuser:swift #子用户id --access=full #权限是所有 |
输入类似下面这样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | { "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:
1 | sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret |
输出类似下面这样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | { "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包
1 | sudo yum install python-boto |
2,新建Python脚本文件
1 | vi s3test.py |
3,将下面的内容添加到文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
1 2 | [root@admin-node ~]# python s3test.py my- new -bucket 2020-08-07T07:47:17.399Z |
使用s3cmd测试访问对象网关
第一步安装测试工具并编写配置文件
1 | yum install s3cmd |
配置文件,key为用户testuser对应的key
1 2 3 4 5 6 7 8 | [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
1 2 | [root@admin-node ~]# s3cmd ls 2020-08-07 07:47 s3: //my-new-bucket |
创建bucket
1 | s3cmd mb s3: //test_bucket |
创建后在查看
1 2 3 | [root@admin-node ~]# s3cmd ls 2020-08-07 07:47 s3: //my-new-bucket 2020-08-07 08:05 s3: //test_bucket |
上传文件至bucket
1 | [root@admin-node ~]# s3cmd put /etc/fstab s3: //test_bucket/ |
下载文件至当前目录
1 | s3cmd get s3: //test_bucket/fstab |
测试Swift访问
Swift 访问的验证则可以使用``swift`` 的命令行客户端。可以通过命令 man swift 获取更多命令行选项的更多信息。
执行下面的命令安装 swift 客户端
1 2 3 4 | 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 访问:
1 | 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. 举例如下:
1 | swift -A http: //192.168.1.101:80/auth/1.0 -U testuser:swift -K 'LGTP6OUjHgxL7pWLplislHMsSTNr0bZRsgDnLdlT' list |
输出如下
1 | my- new -bucket |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
2019-08-07 Nginx之开启压缩
2018-08-07 Red Hat6设置使用CentOS的yum源