核心概念

Overview

本文档向熟悉持久存储概念的 Kubernetes 管理员介绍 Container Object Storage Interface (COSI) 的核心资源和原理。COSI 提供了一种声明式机制来管理对象存储(如 AWS S3、MinIO 和 Ceph RGW),类似于现有的 Kubernetes 持久存储管理方式。

我们将介绍 COSI 中的三种主要资源——BucketClass、Bucket 和 BucketClaim,通过与 Kubernetes 存储资源的类比来阐明它们之间的关系和功能。

Core Resources

COSI 定义了三种核心资源:

1. BucketClass

作用域: 集群级别
对应 Kubernetes 概念: 类似于 StorageClass

BucketClass 由集群管理员创建,用于定义桶的具体类型或服务等级,包括地域位置、冗余策略和性能等级。

主要功能:

  • 指定桶的删除策略(例如,BucketClaim 删除时是否删除底层桶)
  • 指定 COSI 驱动(driverName)
  • 定义供应商特定参数

YAML 示例:

apiVersion: objectstorage.k8s.io/v1alpha1
kind: BucketClass
metadata:
  name: ceph-cosi-driver-class
deletionPolicy: Delete
driverName: ceph.objectstorage.k8s.io
parameters:
  objectStoreUserSecretName: rook-ceph-object-user-object-store-user-for-cosi
  objectStoreUserSecretNamespace: rook-ceph

2. Bucket

作用域: 集群级别
对应 Kubernetes 概念: 类似于 PersistentVolume (PV)

Bucket 表示 Kubernetes 中对外部对象存储系统(如 AWS S3、MinIO、Ceph RGW)中实际桶的抽象。

生命周期管理:

  • 动态创建:当收到 BucketClaim 请求时,由 COSI 控制器自动创建。

3. BucketClaim

作用域: 命名空间级别
对应 Kubernetes 概念: 类似于 PersistentVolumeClaim (PVC)

BucketClaim 资源由应用开发者在其命名空间内创建,用于请求对象存储桶。

工作流程:

  1. 用户创建指定 BucketClass 的 BucketClaim。
  2. COSI 控制器检测请求,根据 BucketClass 定义动态创建对象存储后端的桶。
  3. 创建对应的 Bucket 资源并绑定到 BucketClaim。
  4. 生成包含桶访问凭据的 Secret,并自动挂载到请求该桶的 Pod 中。

YAML 示例:

apiVersion: objectstorage.k8s.io/v1alpha1
kind: BucketClaim
metadata:
  name: my-app-bucket-claim
  namespace: my-app-ns
spec:
  bucketClassName: ceph-standard-replicated
  protocol:
    s3: {} # Defaults populated by the driver

Resource Interaction Workflow

以下流程展示了 COSI 资源的动态创建过程:

  1. 集群管理员 创建并维护 BucketClass。
  2. 命名空间用户 创建引用 BucketClass 的 BucketClaim。
  3. COSI 控制器 监听 BucketClaim,根据 BucketClass 定义动态创建桶。
  4. 控制器在 Kubernetes 中生成对应的 Bucket 资源。
  5. BucketClaim 与 Bucket 绑定。
  6. 创建包含存储凭据的 Secret 供 Pod 使用。
  7. Pod 挂载该 Secret 并访问对象存储。

Summary

COSI 资源作用域Kubernetes 类比作用
BucketClass集群级别StorageClass定义桶的类型和策略
Bucket集群级别PersistentVolume (PV)Kubernetes 对实际桶的抽象
BucketClaim命名空间级别PersistentVolumeClaim (PVC)用户请求桶资源

通过利用 COSI 提供的标准化 API,Kubernetes 管理员可以声明式且可移植地管理对象存储资源,大大提升应用与对象存储在 Kubernetes 集群中的集成效率。