CentOS Stream 9
Sponsored Link

Ceph Pacific : オブジェクトゲートウェイを設定する2022/03/31

 
Ceph Object Gateway (RADOSGW) を設定して Amazon S3 や OpenStack Swift 互換 API 経由で Ceph クラスターにアクセスできるようにします。
当例では以下のような環境で [www] ホストに RADOSGW を設定します。
                                         |
        +--------------------+           |           +----------------------+
        |   [dlp.srv.world]  |10.0.0.30  |  10.0.0.31|    [www.srv.world]   |
        |     Ceph Client    +-----------+-----------+        RADOSGW       |
        |                    |           |           |                      |
        +--------------------+           |           +----------------------+
            +----------------------------+----------------------------+
            |                            |                            |
            |10.0.0.51                   |10.0.0.52                   |10.0.0.53 
+-----------+-----------+    +-----------+-----------+    +-----------+-----------+
|   [node01.srv.world]  |    |   [node02.srv.world]  |    |   [node03.srv.world]  |
|     Object Storage    +----+     Object Storage    +----+     Object Storage    |
|     Monitor Daemon    |    |                       |    |                       |
|     Manager Daemon    |    |                       |    |                       |
+-----------------------+    +-----------------------+    +-----------------------+

[1] 管理ノードから RADOSGW ホストへ必要なファイルを転送して、RADOSGW の設定をします。
# 公開鍵転送

[root@node01 ~]#
ssh-copy-id www

# RADOSGW ホストに必要なパッケージをインストール

[root@node01 ~]#
ssh www "dnf -y install centos-release-ceph-pacific"

[root@node01 ~]#
ssh www "dnf -y install ceph-radosgw"
[root@node01 ~]#
vi /etc/ceph/ceph.conf
# 最終行に追記

# client.rgw.(ノード名)
[client.rgw.www]
# ノードの IP アドレス
host = 10.0.0.31
# 待ち受けポートを設定
rgw frontends = "civetweb port=8080"
# ノードの DNS 名
rgw dns name = www.srv.world

# RADOSGW ホストに必要なファイルを転送

[root@node01 ~]#
scp /etc/ceph/ceph.conf www:/etc/ceph/

ceph.conf                                     100%  374   342.6KB/s   00:00
[root@node01 ~]#
scp /etc/ceph/ceph.client.admin.keyring www:/etc/ceph/

ceph.client.admin.keyring                     100%  151    73.7KB/s   00:00

# RADOSGW の設定

[root@node01 ~]# ssh www \
"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; \
firewall-cmd --add-port=8080/tcp; firewall-cmd --runtime-to-permanent"

# 動作確認
# 一定時間経過後に以下のような応答があれば OK

[root@node01 ~]#
curl www.srv.world: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></ListAllMyBucketsResult>
[2] Object Gateway 設定ノードで、Object Gateway に認証アクセス可能な S3 互換ユーザーを作成しておきます。
# 例として [serverworld] ユーザー作成

[root@www ~]#
radosgw-admin user create --uid=serverworld --display-name="Server World" --email=admin@srv.world

{
    "user_id": "serverworld",
    "display_name": "Server World",
    "email": "admin@srv.world",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "serverworld",
            "access_key": "ZF28WFQO2KVZHS5AL9IG",
            "secret_key": "hZB6K0iOWhx480adrMoWUS3pKx6vBQqHkIgUazzB"
        }
    ],
    "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@www ~]#
radosgw-admin user list

[
    "serverworld"
]

[root@www ~]#
radosgw-admin user info --uid=serverworld

{
    "user_id": "serverworld",
    "display_name": "Server World",
    "email": "admin@srv.world",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "serverworld",
            "access_key": "ZF28WFQO2KVZHS5AL9IG",
            "secret_key": "hZB6K0iOWhx480adrMoWUS3pKx6vBQqHkIgUazzB"
        }
.....
.....
[3] 任意のコンピューター/任意のユーザーで Python テストスクリプトを作成して S3 インターフェースでアクセス可能か確認します。
[cent@dlp ~]$
pip3 install boto3
[cent@dlp ~]$
vi s3_test.py
import sys
import boto3
from botocore.config import Config

# [2] で作成したユーザーのアクセスキーとシークレットキー
session = boto3.session.Session(
    aws_access_key_id = 'ZF28WFQO2KVZHS5AL9IG',
    aws_secret_access_key = 'hZB6K0iOWhx480adrMoWUS3pKx6vBQqHkIgUazzB'
)

# Object Gateway のホストとポート
s3client = session.client(
    's3',
    endpoint_url = 'http://10.0.0.31:8080',
    config = Config()
)

# [my-new-bucket] 作成
bucket = s3client.create_bucket(Bucket = 'my-new-bucket')

# Bucket 一覧表示
print(s3client.list_buckets())

# [my-new-bucket] 削除
s3client.delete_bucket(Bucket = 'my-new-bucket')

[cent@dlp ~]$
python3 s3_test.py

{'ResponseMetadata': {'RequestId': 'tx00000b3bd5b04da52a400-006245412a-5e9b-default', 'HostId': '', 'HTTPStatusCode': 200, 'HTTPHeaders': {'transfer-encoding': 'chunked', 'x-amz-request-id': 'tx00000b3bd5b04da52a400-006245412a-5e9b-default', 'content-type': 'application/xml', 'date': 'Thu, 31 Mar 2022 05:50:34 GMT'}, 'RetryAttempts': 0}, 'Buckets': [{'Name': 'my-new-bucket', 'CreationDate': datetime.datetime(2022, 3, 31, 5, 50, 28, 688000, tzinfo=tzutc())}], 'Owner': {'DisplayName': 'Server World', 'ID': 'serverworld'}}
関連コンテンツ