MinIO对象存储与K8S整合
一、MinIO 简介MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。二、
一、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
更多推荐
所有评论(0)