文章大纲
ODF 默认创建了两种提供对象存储的存储类:
ocs-storagecluster-ceph-rgw
Ceph RADOS 对象网关openshift-storage-noobaa.io
多云对象网关
OBC
OBC(Object Bucket Claim) 类似于 PVC(Persistent Volume Claim),通过 OBC 可以请求兼容 S3 的 bucket。
ODF 提供了两个 Operator 提供存储类,Ceph RGW 和 NooBaa MCG,它们之间的区别:
属性 | Ceph RGW | NooBaa MCG |
---|---|---|
storageclass | ocs-storagecluster-ceph-rgw | openshift-storage-noobaa.io |
protocol | http | https |
port | 80 | 443 |
region | us-east-1 | |
Backend | Ceph | Ceph or S3 |
S3 端点
Ceph RGW 使用 openshift-storage
项目中的 rook-ceph-rgw-ocs-storagecluster-cephobjectstore
SVC,在集群内部可以通过 rook-ceph-rgw-ocs-storagecluster-cephobjectstore.openshift-storage.svc
进行访问。
同时在项目中也通过 route 资源将该 SVC 暴露了,意味着可以在集群外部进行访问。
Ceph RGW 使用的是 http 协议 80 端口。
NooBaa MCG 也是使用 openshift-storage
项目中的 s3
SVC,在内部使用 s3.openshift-storage.svc
进行访问,同时也通过 route 暴露了 svc,可在外部访问。
NooBaa MCG 使用的是 https 协议 443 端口。
OBC 示例
以下是创建 OBC 资源的示例,在 default 项目中创建一个 obc-demo 的 OBC:
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
name: obc-demo 
namespace: obc-demo
spec:
storageClassName: openshift-storage.noobaa.io 
generateBucketName: obc-demo
这里使用的存储类是 NooBaa MCG 也可以替换成 Ceph RGW。generateBucketName
是声明创建的 Bucket 的前缀名称。
oc apply -f obc-demo.yaml
objectbucketclaim.objectbucket.io/obc-demo created
oc get obc
NAME STORAGE-CLASS PHASE AGE
obc-demo openshift-storage.noobaa.io Bound 4s
查看详细信息:
oc describe obc obc-demo
Name: obc-demo
Namespace: obc-demo
Labels: app=noobaa
bucket-provisioner=openshift-storage.noobaa.io-obc
noobaa-domain=openshift-storage.noobaa.io
Annotations: <none>
API Version: objectbucket.io/v1alpha1
Kind: ObjectBucketClaim
Metadata:
Creation Timestamp: 2024-02-08T23:13:11Z
Finalizers:
objectbucket.io/finalizer
Generation: 4
Managed Fields:
API Version: objectbucket.io/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io/last-applied-configuration:
f:spec:
.:
f:generateBucketName:
f:storageClassName:
Manager: kubectl-client-side-apply
Operation: Update
Time: 2024-02-08T23:13:11Z
API Version: objectbucket.io/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:finalizers:
.:
v:"objectbucket.io/finalizer":
f:labels:
.:
f:app:
f:bucket-provisioner:
f:noobaa-domain:
f:spec:
f:bucketName:
f:objectBucketName:
f:status:
.:
f:phase:
Manager: noobaa-operator
Operation: Update
Time: 2024-02-08T23:13:12Z
Resource Version: 158763
Self Link: /apis/objectbucket.io/v1alpha1/namespaces/obc-demo/objectbucketclaims/obc-demo
UID: 7e8c9770-8315-4767-a3c2-7ee0f7039e34
Spec:
Bucket Name: obc-demo-e12bde82-eb51-4e42-99d7-3559f67655f7
Generate Bucket Name: obc-demo
Object Bucket Name: obc-obc-demo-obc-demo
Storage Class Name: openshift-storage.noobaa.io
Status:
Phase: Bound
Events: <none>
使用 OBC 资源
对象存储不想文件存储或块存储直接挂载到容器中,而是通过 API 进行使用。
当创建 OBC 时,API Server 会创建关联的资源:
- object bucket 这种资源不属于特定的命名空间
- configmap 包含 S3 Endpoint 和 S3 Bucket 名称
- secret 用于访问 S3 API 身份验证密钥
查看 configmap 中的内容:
oc extract configmap/obc-demo --to=-
# BUCKET_SUBREGION
# BUCKET_HOST
s3.openshift-storage.svc
# BUCKET_NAME
obc-demo-e12bde82-eb51-4e42-99d7-3559f67655f7
# BUCKET_PORT
443
# BUCKET_REGION
查看 secret 中的内容:
oc extract secret/obc-demo --to=-
# AWS_ACCESS_KEY_ID
403F9cH6TCCGrq7FCi2C
# AWS_SECRET_ACCESS_KEY
yYyldLt3tqwRxCCQ+4mUglQRq3LWJtD5JqcyviVx
在 Pod 中使用 S3 访问 object bucket 需要从 configmap 导出变量和相关的 secret,通常会导出以下变量:
- BUCKET_HOST
- BUCKET_PORT
- BUCKET_NAME
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
如果使用私有 CA 签名的证书时,还需在 AWS_CA_BUNDLE 环境变量中指定证书的路径,证书的路径可通过以下方式获取:
oc extract configmap/serviceaccount-ca -n openshift-kube-controller-manager
ca-bundle.crt