背景
我们最近有个需求需要一个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。
整个流程如下:
部署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),s3fs 或 goofys 可能更适合。如果您的重点是数据迁移或同步,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"]