Ceph radosgw的基本使用

发布时间 2023-03-28 19:29:41作者: 滴滴滴

  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/<文件名>