Saturday, February 22, 2025

[Ceph] – Phần 5: Sử dụng Ceph Object Gateway

-

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ủa radosgw. Phần sau dấu chấm (www trong trường hợp này) là tên của instance radosgw đó.
    • 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.
  • host = 192.168.13.235: Đây là địa chỉ IP của máy chủ nơi radosgw instance sẽ chạy.
  • rgw_frontends = "civetweb port=8080":
    • Đây là cấu hình cho frontend của radosgwcivetweb là một web server nhẹ được tích hợp trong radosgw để cung cấp giao diện HTTP. port=8080 chỉ định rằng radosgw sẽ lắng nghe trên cổng 8080.
    • civetweb trong rgw_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 trong radosgw. Bạn cũng có thể sử dụng fastcgi 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.
  • rgw_dns_name = radosgw.hoanghd.com: Đây là tên DNS được sử dụng để truy cập radosgw. Các ứng dụng sẽ sử dụng tên này để kết nối với radosgw.

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ần ceph-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 cho radosgw.
    • Phần sau dấu chấm (www trong trường hợp này) là tên của instance radosgw 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 instance radosgw 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ệnh mkdir -p /var/lib/ceph/radosgw/ceph-rgw.instance1.
  • 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 instance radosgw có tên là www. Keyring này cho phép radosgw xác thực với cluster Ceph. osd 'allow rwx' và mon 'allow rw' chỉ định quyền truy cập của radosgw 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 user ceph.
  • 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 user ceph.
  • 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à wwwenable đả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ần www sau rgw. có thể thay đổi tùy thuộc vào tên của instance radosgw mà bạn muốn khởi động.

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 trong radosgw.
  • --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ới radosgw.
  • --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ới radosgw. Mỗi key bao gồm một access_key và một secret_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ới access_key và secret_key của người dùng radosgw 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ên http://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 bucket my-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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories