一、MinIO 简介

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

二、MinIO 优点

  • 高性能 minio是世界上最快的对象存储(官网说的: min.io/)
  • 弹性扩容 很方便对集群进行弹性扩容
  • 天生的云原生服务
  • 开源免费,最适合企业化定制
  • S3事实标准
  • 简单强大,安装部署简单
  • 丰富的SDK支持
  • 存储机制(Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据)

三、MinIO整合K8S

1、kebernetes分布式部署

#helm安装自行google     
helm install minio --set mode=distributed,numberOfNodes=4,imagePullPolicy=IfNotPresent,accessKey=v9rwqYzXXim6KJKeyPm344,secretKey=0aIRBu9KU7gAN0luoX8uBE1eKWNPDgMnkVqbPC,service.type=NodePort,service.nodePort=25557 googleapis/minio -n velero     

#安装完成之后查询pods状态,如果pods的READY状态是正常的,则安装成功,如下图图示     
kubectl get pods -n velero -o wide     

#如果pods的READY状态一直不是状态的话,查看下logs     
kubectl logs minio-0 -n velero     

#如果都是提示disk都是等待状态,可以重启pods在查看     
kubectl delete pods -n velero minio-{0,1,2,3} 

#默认是cluser访问,为了方便,我这里是nodeport方式     
复制代码

如上图,当使用4个节点创建分布式minio时,会使用默认的pvc创建存储.默认每个节点创建1个10G的存储(可以自定义修改)

2、minio在K8S的优化实践

如上minio在k8s的实践,在我实践环境里面,我通过helm安装分布式之后,我默认是采用nfs作为storeagesclasses,一共起了4个节点,自动创建了4个pvc,在我删除1个pvc的数据之后,minio依然可以正常读写,数据依然的可以存在.参考下图:

但这其中有1个最大的问题, 如果你使用的是nfs这种自建共享存储的话,就算minio起了4个节点能保证数据安全,但是你的nfs磁盘确只有1个,万一的你的nfs宕机,磁盘损坏了,你的数据全都没有了,所以为了保证数据的安全性,建议通过hostPath的方式,在每个节点保存对应的数据,这样就算节点的宕机了,磁盘损坏了,你的数据并不会丢,而且通过本地节点的方式,读写数据的速度也会更快,当然你需要额外管理节点本地存储。

3、minio在K8S的hostPath部署实践

环境描述: 5个节点k8s环境,使用其中4个节点作为mino,同时都使用节点主机网络

#1.给其中4个节点打标签,因为我要选择标签为minio-server=true的节点部署minio     
kubectl get node --show-labels=true     
kubectl label nodes node-hostname1  minio-server=true     
kubectl label nodes node-hostname2  minio-server=true     
kubectl label nodes node-hostname3  minio-server=true     
kubectl label nodes node-hostname3  minio-server=true     

#2.给对应主机添加hosts,如果你的hostname能够自动解析,不用修改.4台主机都添加     
echo "host1 [IP1] >> /etc/hosts"     
echo "host2 [IP2] >> /etc/hosts"     
echo "host3 [IP3] >> /etc/hosts"     
echo "host4 [IP4] >> /etc/hosts"     

#3.创建namespace     
#你也可以使用自定义的其他namespace,不过你需要修改下面yaml文件     
kubectl create ns velero     

#4.下载headless、daemonset、service     
wget https://download.osichina.net/tools/k8s/yaml/minio/minio-distributed-headless-service.yaml     
wget https://download.osichina.net/tools/k8s/yaml/minio/minio-distributed-daemonset.yaml     
wget https://download.osichina.net/tools/k8s/yaml/minio/minio-distributed-service.yaml     

#5.修改并创建对应的service、daemonset     
其中主要修改的是`minio-distributed-daemonset.yaml`     
hostPath: 定义你需要使用节点本地路径     
MINIO_ACCESS_KEY、MINIO_SECRET_KEY: 定义你的秘钥,为了安全及时修改     
args: 启动参数后url改成主机名方式: http://host{1...4}/data/minio     

`minio-distributed-service.yaml`为对外服务,默认为ClusterIP,可以结合ingress或者nodePort来访问,可以自行修改     

kubectl create -f minio-distributed-statefulset.yaml      
kubectl create -f minio-distributed-daemonset.yaml     
kubectl create -f minio-distributed-service.yaml     

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐