问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

详解MinIO作为Kubernetes后端存储的部署与原理

创作时间:
作者:
@小白创作中心

详解MinIO作为Kubernetes后端存储的部署与原理

引用
CSDN
1.
https://blog.csdn.net/weixin_42562106/article/details/145766438

MinIO作为Kubernetes后端存储的部署与原理

MinIO的Docker部署

要将MinIO用作Kubernetes的后端存储,首先需要通过Docker进行部署。以下是具体的部署命令:

mkdir -p /minio/data
docker run -d \
   -p 9000:9000 \
   -p 9001:9001 \
   --name minio \
   -v /minio/data:/data \
   -e "MINIO_ROOT_USER=jbk" \
   -e "MINIO_ROOT_PASSWORD=jbjbjb123" \
   quay.io/minio/minio server /data --console-address ":9001"

安装csi-s3 CSI驱动

接下来,需要安装csi-s3 CSI驱动,以便Kubernetes能够与S3兼容的存储系统进行交互。以下是安装步骤:

helm repo add kubeblocks https://apecloud.github.io/helm-charts
helm pull kubeblocks/csi-s3
kubectl create ns csi-s3
helm install -n csi-s3 csi-s3 csi-s3-0.31.4.tgz  \
 --set secret.accessKey="tw8iFXwkBlrUmNKLp6ei" \
 --set secret.secretKey="GBQW7xObmwcTDo4Yz5b2OH4u73i6sEPGBhnvxvSl" \
 --set secret.endpoint="http://172.16.8.104:9000"

简单测试

为了验证部署是否成功,可以创建一个PersistentVolumeClaim(PVC)和一个Pod来进行测试:

cat <<EOF > demon.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: s3-pvc
spec:
  accessModes:
- ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: csi-s3
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
- name: nginx
      image: nginx
      volumeMounts:
- mountPath: /xx/xxx
          name: s3-storage
  volumes:
- name: s3-storage
      persistentVolumeClaim:
        claimName: s3-pvc
EOF

实现原理

CSI驱动架构

CSI(Container Storage Interface)是Kubernetes的标准接口,允许不同的存储系统与Kubernetes集成。csi-s3驱动实现了CSI的API,使得Kubernetes能够通过标准化的方式与S3进行交互。

StorageClass和PVC

用户首先创建一个StorageClass,指定使用csi-s3驱动。然后,用户创建一个PersistentVolumeClaim(PVC),请求特定的存储容量。Kubernetes会根据PVC的请求,调用CSI驱动来动态创建或绑定相应的存储资源。

卷的创建与管理

当PVC被创建时,csi-s3驱动会处理卷的创建请求。它会与S3 API交互,创建一个新的S3存储桶或在现有存储桶中创建一个对象。

数据读写操作

当Pod需要访问存储时,csi-s3驱动会将读写请求转换为S3 API调用。例如,写入数据时,驱动会将数据上传到S3存储桶;读取数据时,驱动会从S3存储桶下载数据。

数据一致性和性能

S3是基于对象的存储,通常采用最终一致性模型。csi-s3驱动需要处理数据一致性的问题,确保应用能够正确处理数据的读取和写入。对于性能,S3的延迟相对较高,因此不适合所有类型的工作负载,尤其是需要低延迟和高IO性能的数据库应用。

卷的删除与回收

当PVC被删除时,csi-s3驱动会处理卷的删除请求,可能会删除相应的S3对象或存储桶,具体取决于PersistentVolumeReclaimPolicy的配置。

网络交互

数据写入

当一个Pod需要将数据写入S3时,csi-s3驱动会通过网络向S3 API发起HTTP(S)请求,将数据上传到指定的S3存储桶。

数据读取

类似地,当Pod需要读取数据时,csi-s3驱动会通过网络向S3 API发起请求,下载所需的数据。

网络延迟与性能

  • 延迟:由于数据需要通过网络传输,读写操作的延迟通常会比直接使用本地或块存储要高。
  • 带宽:网络带宽也会影响数据传输的速度,尤其是在处理大量数据时。

考虑因素

  • 网络可靠性:确保网络连接的可靠性,以避免在读写操作时出现中断或失败。
  • 安全性:使用HTTPS加密数据传输,以保护敏感数据在传输过程中的安全。
  • 数据一致性:由于S3是基于对象的存储,其一致性模型为最终一致性,需考虑应用如何处理这种一致性。

注意事项

  • 权限管理:确保Kubernetes集群有足够的权限访问S3存储。
  • 性能考虑:对象存储的性能与块存储不同,适合存储大量非结构化数据,但可能不适合需要高性能的应用。
  • 数据安全性:考虑数据在传输和存储过程中的安全性,可能需要启用加密和访问控制。

关键点

  • 没有真正的挂载:与传统的块存储不同,S3是对象存储,实际上并没有将S3存储“挂载”到Pods上。相反,Pods通过csi-s3驱动与S3 API进行交互。
  • 通过CSI驱动进行读写:所有的读写操作都通过csi-s3驱动进行,这个驱动负责将Pod中的操作转换为对S3存储桶的API调用。
  • 文件系统接口:尽管Pods可以使用类似于文件系统的接口(如/mnt/s3),但底层的实现是通过网络请求与S3进行交互,而不是直接访问存储块。
  • 性能考虑:由于S3是对象存储,性能和延迟可能会影响应用的表现,特别是对于高IO的工作负载。
  • 数据一致性:S3的最终一致性模型可能会影响应用的行为,特别是在并发读写的情况下。

因此,虽然在Kubernetes中看起来像是将S3存储挂载到Pods,但实际上是通过CSI驱动与S3 API进行交互的过程。这种方式使得S3的对象存储特性能够在Kubernetes环境中使用。

总结

在测试环境中,使用MinIO作为Kubernetes的后端存储是一个不错的选择,但在生产环境中,推荐使用Ceph等性能更好的块存储解决方案。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号