s3(minio,ceph,oss等等)用于k8s存储

1,568 阅读3分钟

背景

我们最近有个需求需要一个ReadWriteMany的磁盘,但是呢openlocal提供的只有ReadWriteOnce。因为我们组件中有minio,所以就使用minio作为存储,当然这个组件不仅限于minio 只要支持s3存储的都可以

概述

csi-s3是一个基于 S3 协议的 CSI 插件。这个插件允许 Kubernetes 使用基于 S3 协议的存储,例如 MinIO,作为持久存储。

首先minio不支持直接对接到k8s集群中作为存储,minio跟oss ceph一样都是支持s3协议的,所以我们需要一个s3兼容的csi插件来帮我们完成这个事情,这种插件可以让我们利用 S3 兼容的存储(如 MinIO)作为动态的 PV。

官网地址:github.com/ctrox/csi-s…

整个流程如下:

部署minio --- 安装csi插件----配置storageclass---创建pvc

组件介绍

  • Provisioner:负责根据 PVC 的请求动态创建存储卷(PV)。
  • Attacher:负责将存储卷附加到集群中的相应节点。
  • CSI-S3:是一个特定的 CSI 插件,用于将 S3 兼容的对象存储用作 Kubernetes 的持久存储

关于挂载模式

支持的挂载模式有四种:rclone, s3fs, goofys, 和 s3backer

1. Rclone

  • 功能rclone 是一个命令行程序,用于管理文件在多种云存储服务之间的同步和迁移。它支持多种云存储提供商,包括 S3 兼容的存储。
  • 特点
    • 支持多种云存储服务。
    • 提供数据同步、传输和加密功能。
    • 可以挂载云存储为本地文件系统,但这不是其主要功能。

2. S3FS

  • 功能s3fs 允许您将 S3 兼容的存储挂载为一个本地文件系统。它通过 FUSE(用户空间文件系统)接口实现。
  • 特点
    • 将 S3 存储表现为本地文件系统。
    • 适合需要文件系统接口的应用。
    • 性能可能不如专用的块存储或本地文件系统。

3. Goofys

  • 功能goofys 是一个专注于性能和简易性的文件系统,可以将 S3 兼容的存储挂载为本地文件系统。
  • 特点
    • 比 s3fs 有更好的性能,但可能牺牲一些一致性和 POSIX 兼容性。
    • 适合读取大量数据的场景。
    • 不适用于需要高度 POSIX 兼容性的应用。

4. S3backer

  • 功能s3backer 将云存储表现为一个单一的、大型的块设备。您可以在这个块设备上创建文件系统。
  • 特点
    • 更像是一个块存储,而不是直接的文件系统。
    • 适用于需要将云存储用作块设备的场景。
    • 可以在其上格式化任何本地文件系统。

使用场景分析

如果需要文件系统接口(如 NFS),s3fsgoofys 可能更适合。如果您的重点是数据迁移或同步,rclone 是一个更好的选择。如果需要块存储接口,s3backer 可能是一个合适的选择。

部署

依次安装 csi-s3插件 和Attacher、provisioner

kubectl apply -f csi-s3.yaml
kubectl apply -f attacher.yaml 
kubectl apply -f provisioner.yaml

安装storageclass

# 安装秘钥
cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  namespace: kube-system
  name: csi-s3-secret
stringData:
  accessKeyID: 1111
  secretAccessKey: 222
  # For AWS set it to "https://s3.<region>.amazonaws.com"
  endpoint: http://172.16.166.101:9000 # minio地址
  # If not on S3, set it to ""
  region: ""
kubectl apply -f secret.yaml
安装sc
在安装sc的时候指定挂载模式,就是以上指定的四种默认是rclone
storageclass.yamlstorageclass.yaml

接下来就可以创建pvc了,官方有给一个实例,可以通过那个快速验证

kubectl apply -f  pvc.yaml
kubectl apply -f pod.yaml 

遇到问题

现象:

pvc挂载不到pod,挂载报错。 根据以上原理步骤 pvc创建无问题,说明provisioner没有问题,挂载有问题说明是attacher 的问题,所以查看报错

attacher报错如下

k8s.io/client-go/informers/factory.go:135: Failed to list *v1beta1.VolumeAttachment: the server could not find the requested resource

解决办法:

默认的下载镜像是attacher镜像从2.2 换成3.1

role新增权限

 apiGroups: ["storage.k8s.io"]
    resources: ["volumeattachments/status"]
    verbs: ["patch"]