Ceph radosgw的基本使用
RadosGW 是对象存储(OSS,Object Storage Service)的一种访问实现方式,RADOS 网关也称为 Ceph 对象网关、RadosGW、RGW,是一种服务,使客户端能够利用标准对象存储API 来访问 Ceph 集群,它支持 AWS S3 和 Swift API,在 ceph 0.8 版本之后使用 Civetweb(https://github.com/civetweb/civetweb) 的 web 服务器来响应 api 请求,客户端使用http/https 协议通过 RESTful API 与 RGW 通信,而 RGW 则通过 librados 与 ceph 集群通信,RGW 客户端通过 s3 或者 swift api 使用 RGW 用户进行身份验证,然后 RGW 网关代表用户利用 cephx 与 ceph 存储进行身份验证。
S3 由 Amazon 于 2006 年推出,全称为 Simple Storage Service,S3 定义了对象存储,是对象存储事实上的标准,从某种意义上说,S3 就是对象存储,对象存储就是 S3,它是对象存储市场的霸主,后续的对象存储都是对 S3 的模仿。
部署 RadosGW 服务:
将 ceph-mgr1、ceph-mgr2 服务器部署为高可用的 radosGW 服务
添加ceph仓库源并安装radosgw
| #支持 https 镜像仓库源: | |
| apt install -y apt-transport-https ca-certificates curl software-properties-common | |
| #导入 key: | |
| wget -q -O- 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | sudo apt-key add - | |
| apt-add-repository 'deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific/ bionic main' | |
| root@ceph-mgr1:/etc/apt# apt update | |
| root@ceph-mgr1:~# apt-cache madison radosgw #搜索radosgw | |
| radosgw | 16.2.10-1bionic | https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic/main amd64 Packages | |
| radosgw | 12.2.13-0ubuntu0.18.04.10 | http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-updates/main amd64 Packages | |
| radosgw | 12.2.13-0ubuntu0.18.04.10 | http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-security/main amd64 Packages | |
| radosgw | 12.2.4-0ubuntu1 | http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic/main amd64 Packages |
| #mg1和mgr2安装radosgw | |
| root@ceph-mgr1:/etc/apt# apt install radosgw | |
| root@ceph-mgr1:~# radosgw -v | |
| ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable) | |
| root@ceph-mgr2:~# radosgw -v | |
| ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable) |
ceph-deploy节点调度 mgr1 和mg2 部署rgw服务
| root@ceph-deploy:~# su - cephadmin | |
| cephadmin@ceph-deploy:~$ cd ceph-cluster/ | |
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf rgw create ceph-mgr1 | |
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf rgw create ceph-mgr2 |
--overwrite-conf 参数含义:以当前ceph-deploy的ceph.conf配置为准,替换掉mgr1节点上的/etc/ceph.conf
RGW部署完成后,会在mgr1、mgr2节点启动ceph-radosgw@rgw.ceph-mgr1、2服务,端口监听在tcp 7480



mgr1节点验证radosgw服务
| #检查radosgw服务 | |
| root@ceph-mgr1:~# systemctl status ceph-radosgw@rgw.ceph-mgr1.service | |
| root@ceph-mgr2:~# systemctl status ceph-radosgw@rgw.ceph-mgr2.service | |
| #检查服务端口 | |
| root@ceph-mgr1:~# ss -lntup|grep 7480 | |
| root@ceph-mgr2:~# ss -lntup|grep 7480 |


使用web http方式访问mgr1、mgr2 ip:7480服务


从ceph状态验证查看rgw服务部署

Radosgw默认存储池
初始化完成 radosgw 之后,会初始化默认的存储池如下:
名称以 default.rgw.* 为前缀和 .rgw.root的存储池
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool ls | |
| device_health_metrics | |
| rbd-data | |
| default.rgw.log | |
| .rgw.root | |
| default.rgw.control | |
| default.rgw.meta | |
| cephfs-metadata | |
| cephfs-data |
验证radosgw服务进程
| root@ceph-mgr1:~# ps -ef|grep radosgw | |
| ceph 1302 1 0 14:58 ? 00:00:04 /usr/bin/radosgw -f --cluster ceph --name client.rgw.ceph-mgr1 --setuser ceph --setgroup ceph | |
| root 3562 3492 0 15:32 pts/0 00:00:00 grep --color=auto radosgw | |
| root@ceph-mgr2:~# ps -ef|grep radosgw | |
| ceph 19646 1 0 15:22 ? 00:00:01 /usr/bin/radosgw -f --cluster ceph --name client.rgw.ceph-mgr2 --setuser ceph --setgroup ceph | |
| root 20332 2930 0 15:33 pts/0 00:00:00 grep --color=auto radosgw |
radosgw 的存储池类型:
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool ls | |
| device_health_metrics | |
| rbd-data | |
| default.rgw.log | |
| .rgw.root | |
| default.rgw.control | |
| default.rgw.meta | |
| cephfs-metadata | |
| cephfs-data |
查看默认 radosgw 的存储池信息:
| cephadmin@ceph-deploy:~/ceph-cluster$ radosgw-admin zone get --rgw-zone=default --rgw-zonegroup=default | |
| { | |
| "id": "638985bc-6486-4a1a-8012-a619266611ef", | |
| "name": "default", | |
| "domain_root": "default.rgw.meta:root", | |
| "control_pool": "default.rgw.control", | |
| "gc_pool": "default.rgw.log:gc", | |
| "lc_pool": "default.rgw.log:lc", | |
| "log_pool": "default.rgw.log", | |
| "intent_log_pool": "default.rgw.log:intent", | |
| "usage_log_pool": "default.rgw.log:usage", | |
| "roles_pool": "default.rgw.meta:roles", | |
| "reshard_pool": "default.rgw.log:reshard", | |
| "user_keys_pool": "default.rgw.meta:users.keys", | |
| "user_email_pool": "default.rgw.meta:users.email", | |
| "user_swift_pool": "default.rgw.meta:users.swift", | |
| "user_uid_pool": "default.rgw.meta:users.uid", | |
| "otp_pool": "default.rgw.otp", | |
| "system_key": { | |
| "access_key": "", | |
| "secret_key": "" | |
| }, | |
| "placement_pools": [ | |
| { | |
| "key": "default-placement", | |
| "val": { | |
| "index_pool": "default.rgw.buckets.index", | |
| "storage_classes": { | |
| "STANDARD": { | |
| "data_pool": "default.rgw.buckets.data" | |
| } | |
| }, | |
| "data_extra_pool": "default.rgw.buckets.non-ec", | |
| "index_type": 0 | |
| } | |
| } | |
| ], | |
| "realm_id": "", | |
| "notif_pool": "default.rgw.log:notif" | |
| } |
rgw.root: 包含 realm(领域信息),比如 zone 和 zonegroup
default.rgw.log: 存储日志信息,用于记录各种 log 信息。
default.rgw.control: 系统控制池,在有数据更新时,通知其它 RGW 更新缓存。
default.rgw.meta: 元数据存储池,通过不同的名称空间分别存储不同的 rados 对象,这些名称空间包括⽤⼾UID 及其 bucket 映射信息的名称空间 users.uid、⽤⼾的密钥名称空间users.keys、⽤⼾的 email 名称空间 users.email、⽤⼾的 subuser 的名称空间 users.swift,以及 bucket 的名称空间 root 等。
default.rgw.buckets.index: 存放 bucket 到 object 的索引信息。
default.rgw.buckets.data: 存放对象的数据。
default.rgw.buckets.non-ec: 数据的额外信息存储池
default.rgw.users.uid: 存放用户信息的存储池。
default.rgw.data.root: 存放 bucket 的元数据,结构体对应 RGWBucketInfo,比如存放桶名、桶 ID、data_pool 等。
查看对象存储池的存储策略、副本数量、pgp和pg的数量
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool get default.rgw.meta crush_rule | |
| crush_rule: replicated_rule | |
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool get default.rgw.meta size | |
| size: 3 | |
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool get default.rgw.meta pgp_num | |
| pgp_num: 8 | |
| cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool get default.rgw.meta pg_num | |
| pg_num: 8 |
radosgw http 服务高可用配置
自定义 http 端口
配置文件可以在 ceph deploy 服务器修改然后统一推送,或者单独修改每个 radosgw 服务器的配置为统一配置,然后重启 RGW 服务。
https://docs.ceph.com/en/latest/radosgw/frontends/

在ceph.conf最后面添加针对当前节点的自定义配置如下
| root@ceph-mgr1:~# vim /etc/ceph/ceph.conf | |
| [client.rgw.ceph-mgr1] | |
| rgw_host = ceph-mgr1 | |
| rgw_frontends = civetweb port=9900 |

重启节点 mgr1 的 radosgw 服务
| root@ceph-mgr1:~# systemctl restart ceph-radosgw@rgw.ceph-mgr1.service | |
| root@ceph-mgr1:~# systemctl status ceph-radosgw@rgw.ceph-mgr1.service | |
| ceph-radosgw@rgw.ceph-mgr1.service - Ceph rados gateway | |
| Loaded: loaded (/lib/systemd/system/ceph-radosgw@.service; indirect; vendor preset: enabled) | |
| Active: active (running) since Wed 2022-12-14 11:44:11 CST; 6s ago | |
| Main PID: 4196 (radosgw) | |
| Tasks: 603 | |
| CGroup: /system.slice/system-ceph\x2dradosgw.slice/ceph-radosgw@rgw.ceph-mgr1.service | |
| ©¸©¤4196 /usr/bin/radosgw -f --cluster ceph --name client.rgw.ceph-mgr1 --setuser ceph --setgroup ceph | |
| Dec 14 11:44:11 ceph-mgr1 systemd[1]: Started Ceph rados gateway. | |
| Dec 14 11:44:11 ceph-mgr1 radosgw[4196]: 2022-12-14T11:44:11.494+0800 7f76c28843c0 -1 IMPORTANT: the civetweb frontend is | |
| root@ceph-mgr1:~# ss -lntup|grep 9900 | |
| tcp LISTEN 0 128 0.0.0.0:9900 0.0.0.0:* users:(("radosgw",pid=4196,fd=75)) |


实现高可用
安装haproxy并配置反向代理:
配置haproxy,反向代理 ceph-mgr1 和 mgr2 的radosgw服务tcp网络端口,mgr2的端口此时还为默认的7480端口.
| root@haproxyA:~# vim /etc/haproxy/haproxy.cfg | |
| listen ceph-radosgw-8090 | |
| bind :8090 | |
| mode tcp | |
| server ceph-mgr1 192.168.100.38:9900 check inter 3s fall 3 rise 2 | |
| server ceph-mgr2 192.168.100.39:7480 check inter 3s fall 3 rise 2 | |
| root@haproxyA:~# systemctl restart haproxy | |
| root@haproxyA:~# systemctl status haproxy | |
| ● haproxy.service - HAProxy Load Balancer | |
| Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled) | |
| Active: active (running) since Wed 2022-12-14 12:00:17 CST; 4s ago | |
| Docs: man:haproxy(1) | |
| file:/usr/share/doc/haproxy/configuration.txt.gz | |
| Process: 1401 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q $EXTRAOPTS (code=exited, status=0/SUCCESS) | |
| Main PID: 1413 (haproxy) | |
| Tasks: 2 (limit: 2236) | |
| Memory: 2.2M | |
| CGroup: /system.slice/haproxy.service | |
| ├─1413 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock | |
| └─1417 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock | |
| Dec 14 12:00:17 haproxyA systemd[1]: Starting HAProxy Load Balancer... | |
| Dec 14 12:00:17 haproxyA haproxy[1413]: Proxy ceph-radosgw-8090 started. | |
| Dec 14 12:00:17 haproxyA haproxy[1413]: Proxy ceph-radosgw-8090 started. | |
| Dec 14 12:00:17 haproxyA haproxy[1413]: Proxy statistics started. | |
| Dec 14 12:00:17 haproxyA haproxy[1413]: Proxy statistics started. | |
| Dec 14 12:00:17 haproxyA haproxy[1413]: [NOTICE] 347/120017 (1413) : New worker #1 (1417) forked | |
| Dec 14 12:00:17 haproxyA systemd[1]: Started HAProxy Load Balancer. | |
| root@haproxyA:~# ss -lntup|grep 8090 | |
| tcp LISTEN 0 3000 0.0.0.0:8090 0.0.0.0:* users:(("haproxy",pid=1417,fd=7) |


浏览器访问haproxy代理地址 192.168.100.20:8090

查看haproxy的服务代理日志,能看到将客户端的请求均衡代理到后端实际的ceph-mgr节点 endpoint

日志及其它优化配置
创建日志目录
| root@ceph-mgr2:~# mkdir /var/log/radosgw | |
| root@ceph-mgr2:~# chown ceph.ceph /var/log/radosgw | |
| root@ceph-mgr2:~# vim /etc/ceph/ceph.conf | |
| [client.rgw.ceph-mgr1] | |
| rgw_host = ceph-mgr1 | |
| rgw_frontends = "civetweb port=9900+9443s ssl_certificate=/etc/ceph/certs/cephrgw.pem error_log_file=/var/log/radosgw/radosgw.error.log access_log_file=/var/log/radosgw/radosgw.access.log request_timeout_ms=30000 num_threads=200" | |
| [client.rgw.ceph-mgr2] | |
| rgw_host = ceph-mgr2 | |
| rgw_frontends = "civetweb port=9900+9443s ssl_certificate=/etc/ceph/certs/cephrgw.pem error_log_file=/var/log/radosgw/radosgw.error.log access_log_file=/var/log/radosgw/radosgw.access.log request_timeout_ms=30000 num_threads=200" |
error_log_file: 指定radosgw错误日志路径
access_log_file: 指定radosgw访问日志路径
request_timeout_ms:指定radosgw访问超时时间
num_threads: 指定radosgw运行线程数量,默认线程数是100,https://docs.ceph.com/en/mimic/radosgw/config-ref/

重启radosgw
| root@ceph-mgr2:/etc/ceph# systemctl restart ceph-radosgw@rgw.ceph-mgr2.service | |
| root@ceph-mgr2:/etc/ceph# systemctl status ceph-radosgw@rgw.ceph-mgr2.service |

验证日志

创建 RGW 账户
在ceph管理节点创建对象用户
--uid 指定用户ID
--display-name 指定显示用户名称
| cephadmin@ceph-deploy:~/ceph-cluster$ radosgw-admin user create --uid="user1" --display-name="user1" | |
| { | |
| "user_id": "user1", | |
| "display_name": "user1", | |
| "email": "", | |
| "suspended": 0, | |
| "max_buckets": 1000, | |
| "subusers": [], | |
| "keys": [ | |
| { | |
| "user": "user1", | |
| "access_key": "45CMIRWTFQY9DGJX7W1Z", | |
| "secret_key": "EyFmlD51WWfCGbtxFYZcygwDc48QWMYyKs13nuDD" | |
| } | |
| ], | |
| "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": [] | |
| } |
注意保存对象用户的 access_key 和 secret_key
查看用户信息
| root@ceph-mgr1:/var/log/ceph# radosgw-admin user --uid="user1" info | |
| { | |
| "user_id": "user1", | |
| "display_name": "user1", | |
| "email": "", | |
| "suspended": 0, | |
| "max_buckets": 1000, | |
| "subusers": [], | |
| "keys": [ | |
| { | |
| "user": "user1", | |
| "access_key": "45CMIRWTFQY9DGJX7W1Z", | |
| "secret_key": "EyFmlD51WWfCGbtxFYZcygwDc48QWMYyKs13nuDD" | |
| } | |
| ], | |
| "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": [] | |
| } |
查询所有用户
| root@ceph-mgr1:/var/log/ceph# radosgw-admin metadata list user | |
| [ | |
| "user1" | |
| ] |
RGW 账户权限控制
参考aws 官网文档介绍:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/example-bucket-policies.html
账户权限介绍
1、授权简介和预览
Resources: 授权的目的 Buckets、objects等资源,必须指定。
Actions:要授予的动作,CreateBucket、DeleteObject、GetObject、PubObject。必须指定
Effect:要授予的操作效果是允许(allow)还是拒绝(deny),默认为拒绝访问所有的资源,必须指定。
Principal: 要授权的目的账号,必须指定
Condition:授权策略生效的条件,比如访问TLS版本等,非必须,可不写。
| { | |
| “Condition”: { | |
| “NumericLessThan”: { | |
| “s3:TlsVersion”: 1.2 | |
| } | |
| } | |
| } |
2、权限集合
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_Operations.html
权限配置
1、授予匿名用户对 bucket01 的 GetObject权限,仅可以查看桶内的文件。
创建权限json文件
| [root@ansible ~]# vim bucket01-policy.json | |
| { | |
| "Version": "2012-10-17", | |
| "Statement": [ | |
| { | |
| "Effect": "Allow", | |
| "Principal": "*", | |
| "Action": "s3:GetObject", | |
| "Resource": [ | |
| "arn:aws:s3:::bucket01/*" | |
| ] | |
| } | |
| ] | |
| } |
进行授权
| [root@ansible ~]# s3cmd setpolicy bucket01-policy.json s3://bucket01 | |
| s3://bucket01/: Policy updated |

验证权限,客户端浏览器访问 http://rgw.cncf.net/bucket01/<文件名>

浙公网安备 33010602011771号