安裝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