「ROOK-CEPH」- 使用对象存储,S3 API,Object Storage,RGW

问题描述

该笔记将记录:在 Rook Ceph 中,使用对象存储的方法,以及相关问题的解决办法。

解决方案

该部分内容是针对我们的应用场景而整理的笔记,建议参考官方文档以获取详细说明:
1)Object Storage Overview – Rook Ceph Documentation
2)Bucket Claim – Rook Ceph Documentation
3)Object Store CRD – Rook Ceph Documentation
4)Object Store User CRD – Rook Ceph Documentation

流程概述

在 Rook Ceph 中,使用对象存储的流程如下:
1)创建 CephObjectStore 对象,该资源将启动 RGW 服务,以提供 S3 API 接口;
2)创建 StorageClass 对象,并关联到 CephObjectStore 对象;
3)创建 ObjectBucketClaim 对象,并指定其引用的 StorageClass 对象;

在实际的部署中,集群中已经存在 StorageClass ceph-bucket 对象,所以我们可以直接从(3)开始,即直接创建 Bucket 实例:

第一步、创建 Bucket 资源

cat > bucket-foo.yaml <<EOF
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
  name: ceph-bucket
spec:
  bucketName: ceph-bkt-foo
  storageClassName: ceph-bucket
EOF

kubectl apply -f bucket-foo.yaml

# 补充说明:
# 1)在 Dashboard 中,将看到新创建的 Bucket 名称;
# 2)bucketName 指定真正的 Bucket 名称;还有 generateBucketName 属性,建议阅读官方文档以了解两者区别;
# 3)同时,将自动创建 能够访问该 Bucket 的用户,其用户名是随机的; 

第二步、获取访问信息

#config-map, secret, OBC will part of default if no specific name space mentioned
export AWS_HOST=$(kubectl -n default get cm ceph-bucket -o jsonpath='{.data.BUCKET_HOST}')
export PORT=$(kubectl -n default get cm ceph-bucket -o jsonpath='{.data.BUCKET_PORT}')
export BUCKET_NAME=$(kubectl -n default get cm ceph-bucket -o jsonpath='{.data.BUCKET_NAME}')
export AWS_ACCESS_KEY_ID=$(kubectl -n default get secret ceph-bucket -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 --decode)
export AWS_SECRET_ACCESS_KEY=$(kubectl -n default get secret ceph-bucket -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 --decode)

第三步、存储访问测试

kubectl exec -n rook-ceph -it rook-ceph-tools-6648b669df-l5dcr                 \
    -- env                                                                     \
    AWS_HOST=$AWS_HOST                                                         \
    PORT=$PORT                                                                 \
    BUCKET_NAME=$BUCKET_NAME                                                   \
    AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID                                       \
    AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY                               \
    bash

mkdir ~/.aws
cat > ~/.aws/credentials << EOF
[default]
aws_access_key_id = ${AWS_ACCESS_KEY_ID}
aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}
EOF

# 上传文件

echo "Hello Rook" > /tmp/rookObj
s5cmd --endpoint-url http://$AWS_HOST:$PORT cp /tmp/rookObj s3://$BUCKET_NAME

# 下载文件

s5cmd --endpoint-url http://$AWS_HOST:$PORT cp s3://$BUCKET_NAME/rookObj /tmp/rookObj-download
cat /tmp/rookObj-download