1. Tổng quan.
Ceph Object Gateway, còn được gọi là RADOS Gateway, là một giao diện RESTful HTTP cho Ceph Storage Cluster. Nó cung cấp giao diện tương thích với các dịch vụ lưu trữ đám mây phổ biến như Amazon S3 và OpenStack Swift. Điều này cho phép các ứng dụng được viết cho các dịch vụ này có thể sử dụng Ceph Storage Cluster mà không cần thay đổi code.

Ceph Object Gateway hỗ trợ cả hai giao thức S3 và Swift, và nó có thể chạy trên cùng một cụm Ceph với các dịch vụ Ceph khác như CephFS và RBD.
Ceph Object Gateway cung cấp các tính năng như:
- Lưu trữ, lấy và xóa các đối tượng không thể thay đổi.
- Tạo, liệt kê và xóa các bucket để chứa các đối tượng.
- Kiểm soát quyền truy cập đến các đối tượng và bucket thông qua ACL.
- Tạo và quản lý người dùng và quyền truy cập của họ.
- Hỗ trợ cho việc đặt các quy tắc lifecycle cho bucket và đối tượng.
- Hỗ trợ cho việc đặt các chính sách CORS cho bucket.
Ceph Object Gateway được xây dựng trên nền tảng RADOS, nên nó cũng hưởng lợi từ các tính năng của RADOS như độ bền, khả năng mở rộng và phân phối dữ liệu.
2. Sơ đồ LAB.
Cấu hình Ceph Object Gateway [radosgw.hoanghd.com] để sử dụng Ceph Storage như sau.
|
+-------------------------+ | +-------------------------+
|[ceph-client.hoanghd.com]|192.168.13.234 | 192.168.13.235| [radosgw.hoanghd.com] |
| Ceph Client +-------------------+-------------------| RADOSGW |
| | | | |
+-------------------------+ | +-------------------------+
|
+----------------------------------+-----------------------------------+
|public: 192.168.13.231 |public: 192.168.13.232 |public: 192.168.13.233
|cluster: 172.16.13.231 |cluster: 1172.16.13.232 |cluster: 172.16.13.233
+--------------+--------------+ +--------------+--------------+ +--------------+--------------+
| [ceph-node1.hoanghd.com] | | [ceph-node2.hoanghd.com] | | [ceph-node3.hoanghd.com] |
| Object Storage +----| Object Storage +-----| Object Storage |
| Monitor Daemon | | | | |
| Manager Daemon | | | | |
+-----------------------------+ +-----------------------------+ +-----------------------------+
3. Tạo block device.
Ví dụ sau đây sẽ tạo một Block Device và mount nó trên Admin Node (ví dụ là ceph-node1.hoanghd.com
).
Bước 1: Cấu hình môi trường cho Ceph Object Gateway.
Để tiện thì mình sẽ chuyển khóa chung SSH sang cho Ceph Object Gateway và cấu hình nó từ Admin Node.
Hãy thêm nội dung mới vào file cấu hình SSH trong ~/.ssh/config
để khai báo thông tin kết nối đến Ceph Object Gateway.
cat >> ~/.ssh/config << 'OEF'
Host ceph-radosgw
Hostname radosgw.hoanghd.com
User root
OEF
Bạn có thể xác minh lại nội dung file ~/.ssh/config
sau khi thêm nội dung mới.
shell> cat ~/.ssh/config
Host ceph-node1
Hostname ceph-node1.hoanghd.com
User root
Host ceph-node2
Hostname ceph-node2.hoanghd.com
User root
Host ceph-node3
Hostname ceph-node3.hoanghd.com
User root
Host ceph-client
Hostname ceph-client.hoanghd.com
User root
Host ceph-radosgw
Hostname radosgw.hoanghd.com
User root
Do mình thêm bằng shell làm quyền của file có thể bị thay đổi nên mình sẽ cấp lại quyền truy cập cho file cấu hình SSH để chỉ có người dùng hiện tại mới có thể đọc và ghi vào file.
chmod 600 ~/.ssh/config
Mình cũng trỏ file hosts về thông tin domain của Ceph Object Gateway cho Admin Node.
cat >> /etc/hosts << 'OEF'
192.168.13.235 radosgw.hoanghd.com ceph-radosgw
OEF
Kết quả.
shell> ping -c 4 ceph-radosgw
PING radosgw.hoanghd.com (192.168.13.235) 56(84) bytes of data.
64 bytes from radosgw.hoanghd.com (192.168.13.235): icmp_seq=1 ttl=64 time=0.551 ms
64 bytes from radosgw.hoanghd.com (192.168.13.235): icmp_seq=2 ttl=64 time=0.438 ms
64 bytes from radosgw.hoanghd.com (192.168.13.235): icmp_seq=3 ttl=64 time=0.252 ms
64 bytes from radosgw.hoanghd.com (192.168.13.235): icmp_seq=4 ttl=64 time=0.485 ms
--- radosgw.hoanghd.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3074ms
rtt min/avg/max/mdev = 0.252/0.431/0.551/0.111 ms
Giờ mình sẽ copy thông tin sshkey sang cho Ceph Object Gateway theo thông tin domain mình đã khai báo.
shell> ssh-copy-id -o StrictHostKeychecking=no radosgw.hoanghd.com
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@radosgw.hoanghd.com's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -o 'StrictHostKeychecking=no' 'radosgw.hoanghd.com'"
and check to make sure that only the key(s) you wanted were added.
Bước 2 – Cài đặt Radosgw.
Radosgw
là một gateway RESTful được cung cấp bởi Ceph, cho phép Ceph cung cấp dịch vụ lưu trữ đối tượng tương tự như Amazon S3 hoặc OpenStack Swift.
Radosgw
cung cấp một giao diện HTTP cho phép các ứng dụng tương tác với Ceph Storage Cluster. Nó hỗ trợ cả giao thức S3 và Swift, cho phép các ứng dụng được viết cho các dịch vụ này có thể sử dụng Ceph mà không cần thay đổi code.
Các chức năng chính của radosgw
bao gồm:
- Lưu trữ, truy xuất và xóa các đối tượng (files).
- Quản lý bucket (nhóm các đối tượng).
- Quản lý quyền truy cập và chính sách bảo mật.
- Hỗ trợ versioning và multi-part upload.
- Hỗ trợ các tính năng khác của S3 và Swift như website hosting, CORS, lifecycle management, và nhiều hơn nữa.
Để cài đặt Radosgw
, bạn hãy chạy lệnh apt -y install radosgw
.
ssh radosgw.hoanghd.com "apt -y install radosgw"
Mở file cấu hình /etc/ceph/ceph.conf
và thêm nội dung sau đây:
Bước 3 – Cấu hình Ceph Object Gateway.
Đây là một phần của cấu hình Ceph cho radosgw
, gateway RESTful của Ceph.
cat >> /etc/ceph/ceph.conf << 'OEF'
[client.rgw.www]
host = 192.168.13.235
rgw_frontends = "civetweb port=8080"
rgw_dns_name = radosgw.hoanghd.com
OEF
[client.rgw.www]
:- Đây là tên của instance
radosgw
. Trong trường hợp này, instance có tên làwww
. - Bạn hoàn toàn có thể thay đổi phần
www
trong[client.rgw.www]
để phù hợp với nhu cầu của bạn. - Phần
client.rgw
là quy ước và không nên thay đổi vì nó chỉ định rằng đây là một instance củaradosgw
. Phần sau dấu chấm (www
trong trường hợp này) là tên của instanceradosgw
đó. - Bạn có thể đặt nhiều instances
radosgw
trên cùng một máy chủ bằng cách đặt tên khác nhau cho chúng, ví dụ[client.rgw.instance1]
,[client.rgw.instance2]
, v.v.
- Đây là tên của instance
host = 192.168.13.235
: Đây là địa chỉ IP của máy chủ nơiradosgw
instance sẽ chạy.rgw_frontends = "civetweb port=8080"
:- Đây là cấu hình cho frontend của
radosgw
.civetweb
là một web server nhẹ được tích hợp trongradosgw
để cung cấp giao diện HTTP.port=8080
chỉ định rằngradosgw
sẽ lắng nghe trên cổng 8080. civetweb
trongrgw_frontends = "civetweb port=8080"
phải là một trong những frontend HTTP màradosgw
hỗ trợ.civetweb
vàbeast
là hai frontend HTTP được tích hợp sẵn trongradosgw
. Bạn cũng có thể sử dụngfastcgi
nhưng nó yêu cầu cấu hình thêm web server như Apache hoặc Nginx.- Vì vậy, bạn không thể đặt tên gì cũng được cho frontend, nó phải là một trong những frontend được hỗ trợ bởi
radosgw
.
- Đây là cấu hình cho frontend của
rgw_dns_name = radosgw.hoanghd.com
: Đây là tên DNS được sử dụng để truy cậpradosgw
. Các ứng dụng sẽ sử dụng tên này để kết nối vớiradosgw
.
Bước 4 – Sao chép /etc/ceph/ceph.conf
từ Admin Node
sang Ceph Object Gateway
.
scp /etc/ceph/ceph.conf radosgw.hoanghd.com:/etc/ceph/
Bước 5 – Sao chép /etc/ceph/ceph.client.admin.keyring
từ Admin Node
sang Ceph Object Gateway
.
scp /etc/ceph/ceph.client.admin.keyring radosgw.hoanghd.com:/etc/ceph/
Bước 6 – Thiết lập và khởi động dịch vụ radosgw
.
Bạn hãy chạy đoạn shell sau để thiết lập và khởi động dịch vụ radosgw
.
ssh radosgw.hoanghd.com \
"mkdir -p /var/lib/ceph/radosgw/ceph-rgw.www; \
ceph auth get-or-create client.rgw.www osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/ceph-rgw.www/keyring; \
chown ceph. /etc/ceph/ceph.*; \
chown -R ceph. /var/lib/ceph/radosgw; \
systemctl enable --now ceph-radosgw@rgw.www"
Đây là một chuỗi các lệnh được thực thi trên máy chủ radosgw.hoanghd.com
để thiết lập và khởi động dịch vụ radosgw
:
ssh radosgw.hoanghd.com
: Đăng nhập vào máy chủradosgw.hoanghd.com
qua SSH.mkdir -p /var/lib/ceph/radosgw/ceph-rgw.www
:- Tạo thư mục cho instance
radosgw
có tên làwww
. - Trong lệnh
mkdir -p /var/lib/ceph/radosgw/ceph-rgw.www
, phầnceph-rgw
là quy ước và không nên thay đổi. Nó chỉ định rằng thư mục này được sử dụng choradosgw
. - Phần sau dấu chấm (
www
trong trường hợp này) là tên của instanceradosgw
mà thư mục này dành cho. Bạn có thể thay đổi nó tùy thuộc vào tên của instanceradosgw
mà bạn muốn tạo. - Vì vậy, nếu bạn muốn tạo một thư mục cho instance
radosgw
có tên làinstance1
, bạn sẽ sử dụng lệnhmkdir -p /var/lib/ceph/radosgw/ceph-rgw.instance1
.
- Tạo thư mục cho instance
ceph auth get-or-create client.rgw.www osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/ceph-rgw.www/keyring
: Tạo hoặc lấy keyring cho instanceradosgw
có tên làwww
. Keyring này cho phépradosgw
xác thực với cluster Ceph.osd 'allow rwx'
vàmon 'allow rw'
chỉ định quyền truy cập củaradosgw
tới các OSD và monitor.chown ceph. /etc/ceph/ceph.*
: Thay đổi quyền sở hữu của tất cả các file trong/etc/ceph
có tiền tố làceph.
thành userceph
.chown -R ceph. /var/lib/ceph/radosgw
: Thay đổi quyền sở hữu của thư mục/var/lib/ceph/radosgw
và tất cả các file và thư mục con bên trong nó thành userceph
.systemctl enable --now ceph-radosgw@rgw.www
:- Kích hoạt và khởi động dịch vụ
radosgw
với instance có tên làwww
.enable
đảm bảo rằng dịch vụ sẽ tự động khởi động khi hệ thống khởi động, và--now
khởi động dịch vụ ngay lập tức. - Trong lệnh
systemctl enable --now ceph-radosgw@rgw.www
, chỉ phầnwww
saurgw.
có thể thay đổi tùy thuộc vào tên của instanceradosgw
mà bạn muốn khởi động.
- Kích hoạt và khởi động dịch vụ
Bước 7 – Sử dụng lệnh curl để kiểm tra kết quả.
Lệnh curl radosgw.hoanghd.com:8080
được sử dụng để gửi một yêu cầu HTTP GET đến radosgw
đang chạy trên máy chủ radosgw.hoanghd.com
tại cổng 8080.
shell> curl radosgw.hoanghd.com:8080
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsR
Phần XML trong phản hồi là kết quả của yêu cầu GET đó. Nó tuân theo định dạng của Amazon S3 API, mà radosgw
cung cấp.
<ListAllMyBucketsResult>
: Đây là thẻ chính cho kết quả của yêu cầu “Liệt kê tất cả các bucket”.
<Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner>
: Đây là thông tin về chủ sở hữu của các bucket. Trong trường hợp này, chủ sở hữu là anonymous
, có nghĩa là yêu cầu được thực hiện mà không cần xác thực.
<Buckets></Buckets>
: Đây là danh sách các bucket. Trong trường hợp này, danh sách đó rỗng, có nghĩa là không có bucket nào tồn tại.
Bước 8 – Tạo người dùng S3.
Trên Node Ceph Object Gateway, tạo người dùng S3 có thể xác thực với Port Ceph Object Gateway. Đầu tiên hãy remote vào Node Ceph Object Gateway.
ssh root@radosgw.hoanghd.com
Lệnh radosgw-admin user create --uid=hoanghd-radosgw --display-name="Ha Dang Hoang Radosgw" --email=admin@hoanghd.com
được sử dụng để tạo một người dùng mới trong radosgw
.
radosgw-admin user create --uid=hoanghd-radosgw --display-name="Ha Dang Hoang Radosgw" --email=admin@hoanghd.com
Các tham số của lệnh có ý nghĩa như sau:
--uid=hoanghd-radosgw
: Đặt ID người dùng làhoanghd-radosgw
. ID người dùng là một định danh duy nhất cho mỗi người dùng trongradosgw
.--display-name="Ha Dang Hoang Radosgw"
: Đặt tên hiển thị của người dùng làHa Dang Hoang Radosgw
. Tên hiển thị là tên mà người dùng sẽ thấy khi họ tương tác vớiradosgw
.--email=admin@hoanghd.com
: Đặt email của người dùng làadmin@hoanghd.com
. Email này có thể được sử dụng để gửi thông báo hoặc thông tin khác cho người dùng.
Kết quả của lệnh này sẽ là một đối tượng JSON chứa thông tin về người dùng mới, bao gồm ID người dùng, tên hiển thị, email, và các thông tin khác như access key và secret key, mà người dùng sẽ sử dụng để xác thực với radosgw
.
Ví dụ.
shell> radosgw-admin user create --uid=hoanghd-radosgw --display-name="Ha Dang Hoang Radosgw" --email=admin@hoanghd.com
{
"user_id": "hoanghd-radosgw",
"display_name": "Ha Dang Hoang Radosgw",
"email": "admin@hoanghd.com",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "hoanghd-radosgw",
"access_key": "VMQLCRI4P66LQE6JIIAX",
"secret_key": "8Omx5v24CJls4PoIEz09N0Un5Yq6CNomfUWPI4vA"
}
],
"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": []
}
Đây là đối tượng JSON chứa thông tin về người dùng mới được tạo bởi lệnh radosgw-admin user create
. Dưới đây là một số trường quan trọng:
"user_id": "hoanghd-radosgw"
: ID của người dùng."display_name": "Ha Dang Hoang Radosgw"
: Tên hiển thị của người dùng."email": "admin@hoanghd.com"
: Email của người dùng."suspended": 0
: Trạng thái của người dùng. 0 có nghĩa là người dùng không bị đình chỉ."max_buckets": 1000
: Số lượng tối đa các bucket mà người dùng có thể tạo."keys": [...]
: Danh sách các key mà người dùng có thể sử dụng để xác thực vớiradosgw
. Mỗi key bao gồm mộtaccess_key
và mộtsecret_key
."op_mask": "read, write, delete"
: Các hoạt động mà người dùng có thể thực hiện. Trong trường hợp này, người dùng có thể đọc, ghi, và xóa."bucket_quota"
và"user_quota"
: Các hạn ngạch cho bucket và người dùng. Trong trường hợp này, hạn ngạch không được kích hoạt ("enabled": false
), và không có giới hạn về kích thước hoặc số lượng đối tượng ("max_size": -1
,"max_objects": -1
).
Các trường khác trong đối tượng JSON này chứa thông tin chi tiết hơn về người dùng và cấu hình của họ.
Bước 9 – Xác nhận kết quả tạo user S3 thành công.
shell> radosgw-admin user list
[
"hoanghd-radosgw"
]
Bạn có thể xem lại thông tin user S3 bằng lệnh radosgw-admin user info --uid=<some_user_s3>
.
shell> radosgw-admin user info --uid=hoanghd-radosgw
{
"user_id": "hoanghd-radosgw",
"display_name": "Ha Dang Hoang Radosgw",
"email": "admin@hoanghd.com",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "hoanghd-radosgw",
"access_key": "VMQLCRI4P66LQE6JIIAX",
"secret_key": "8Omx5v24CJls4PoIEz09N0Un5Yq6CNomfUWPI4vA"
}
],
"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": []
}
Bước 10 – Kiểm tra kết nối từ Client tới S3 với thông tin vừa tạo.
Đầu tiên mình sẽ remote vào Node Client.
ssh root@ceph-client.hoanghd.com
Vớiboto3
là tên của SDK chính thức của Amazon cho Python, nó cung cấp các API để tương tác với dịch vụ của Amazon, bao gồm Amazon S3.
Khi bạn cài đặt python3-boto3
, bạn đang cài đặt phiên bản boto3
tương thích với Python 3 trên hệ thống của bạn.
Với boto3
, bạn có thể tạo, cấu hình và quản lý các dịch vụ AWS từ mã Python của mình. Ví dụ, bạn có thể tạo và quản lý các bucket và đối tượng trong Amazon S3, hoặc bạn có thể tạo và quản lý các máy ảo trong Amazon EC2.
Để cài đặt python3-boto3, hãy chạy lệnh dưới.
apt -y install python3-boto3
Tạo file s3.py với nội dung dưới đây.
cat > s3.py << 'OEF'
import sys
import boto3
from botocore.config import Config
# user's access-key and secret-key you added on [2] section
session = boto3.session.Session(
aws_access_key_id = 'VMQLCRI4P66LQE6JIIAX',
aws_secret_access_key = '8Omx5v24CJls4PoIEz09N0Un5Yq6CNomfUWPI4vA'
)
# Object Gateway URL
s3client = session.client(
's3',
endpoint_url = 'http://192.168.13.235:8080',
config = Config()
)
# create [my-new-bucket]
bucket = s3client.create_bucket(Bucket = 'my-new-bucket')
# list Buckets
print(s3client.list_buckets())
# remove [my-new-bucket]
s3client.delete_bucket(Bucket = 'my-new-bucket')
OEF
Đây là một đoạn mã Python sử dụng thư viện boto3
để tương tác với một dịch vụ tương thích với Amazon S3, trong trường hợp này là radosgw
.
aws_access_key_id
vàaws_secret_access_key
được sử dụng để xác thực với dịch vụ. Chúng tương ứng vớiaccess_key
vàsecret_key
của người dùngradosgw
mà bạn đã tạo.s3client
là một đối tượng client được tạo để tương tác với dịch vụ S3.endpoint_url
chỉ định URL của dịch vụ, trong trường hợp này làradosgw
đang chạy trênhttp://192.168.13.235:8080
.s3client.create_bucket(Bucket = 'my-new-bucket')
tạo một bucket mới có tên làmy-new-bucket
.print(s3client.list_buckets())
in ra danh sách tất cả các bucket.s3client.delete_bucket(Bucket = 'my-new-bucket')
xóa bucketmy-new-bucket
mà bạn vừa tạo.
Lưu ý: Đoạn mã này không kiểm tra lỗi, vì vậy nếu có lỗi xảy ra (ví dụ: không thể kết nối đến dịch vụ, bucket không tồn tại, v.v.), nó sẽ dừng lại và in ra thông báo lỗi.
Và đây là kết quả của lệnh s3client.list_buckets()
, được in ra bởi đoạn mã Python bạn đã chạy. Nó chứa thông tin về tất cả các bucket trong tài khoản của bạn.
shell> python3 s3.py
{'ResponseMetadata': {'RequestId': 'tx0000076071c4dc18bd9db-0065b127d2-5efe-default', 'HostId': '', 'HTTPStatusCode': 200, 'HTTPHeaders': {'transfer-encoding': 'chunked', 'x-amz-request-id': 'tx0000076071c4dc18bd9db-0065b127d2-5efe-default', 'content-type': 'application/xml', 'date': 'Wed, 24 Jan 2024 15:08:02 GMT'}, 'RetryAttempts': 0}, 'Buckets': [{'Name': 'my-new-bucket', 'CreationDate': datetime.datetime(2024, 1, 24, 15, 7, 28, 364000, tzinfo=tzlocal())}], 'Owner': {'DisplayName': 'Ha Dang Hoang Radosgw', 'ID': 'hoanghd-radosgw'}}
'ResponseMetadata'
: Chứa thông tin về yêu cầu, bao gồm ID yêu cầu, trạng thái HTTP của phản hồi, và các thông tin khác.'Buckets'
: Một danh sách các bucket. Mỗi bucket là một đối tượng chứa tên ('Name'
) và ngày tạo ('CreationDate'
). Trong trường hợp này, có một bucket duy nhất có tên là'my-new-bucket'
.'Owner'
: Chứa thông tin về chủ sở hữu của các bucket. Trong trường hợp này, chủ sở hữu có tên hiển thị là'Ha Dang Hoang Radosgw'
và ID là'hoanghd-radosgw'
.
Lưu ý rằng 'CreationDate'
được trả về dưới dạng một đối tượng datetime
, cho biết thời điểm bucket được tạo.