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:

1
2
3
4
5
6
7
8
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 的前缀名称。

1
2
3
4
5
6
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

查看详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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 中的内容:

1
2
3
4
5
6
7
8
9
10
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 中的内容:

1
2
3
4
5
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 环境变量中指定证书的路径,证书的路径可通过以下方式获取:

1
2
oc extract configmap/serviceaccount-ca -n openshift-kube-controller-manager
ca-bundle.crt