一、MinIO是什么
MinIO是go开发的,高性能分布式存储;基于GNU AGPL v3开源,可免费使用;
官网:https://min.io/
github: https://github.com/minio/minio
官网宣传MinIO是世界上速度最快的分布式对象存储;
二、安装
2.1 单机单磁盘
安装非常简单,可参考官网:https://min.io/docs/minio/container/index.html
docker run -p 9000:9000 -p 9090:9090 \
-v F:/minIO:/data \
-e "MINIO_ROOT_USER=ROOTUSER" \
-e "MINIO_ROOT_PASSWORD=CHANGEME123" \
minio/minio server /data --console-address ":9090"
./minio server /data --console-address :9090
/data
为挂载目录
--console-address :9090
设置控制面板端口,不设置会变为随机端口;
启动后,访问看板:http://127.0.0.1:9090/,输入设置的用户名密码,这样一个单节点MinIO就搭建好了;
单节点模式仅用于测试,因有单节点故障
2.2 集群搭建
MinIO是云原生应用,最适合在k8s内部搭建集群,Linux下集群搭建可参考官网,这里简单记录下,因MinIO迭代较快,具体还需要参考官网:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html
export MINIO_ROOT_USER=ROOTUSER
export MINIO_ROOT_PASSWORD=CHANGEME123
nohup /opt/server/minio/minio server --console-address ":9090" \
http://172.16.10.226:9000/minio-data \
http://172.16.10.227:9000/minio-data \
http://172.16.10.228:9000/minio-data \
http://172.16.10.229:9000/minio-data \
> /data/logs/minio/minio.out 2>&1 &
因为分布式存储需要冗余存储,MinIO需要一半节点存切片后的数据,一半节点存储奇偶校验块,因此集群至少需要4个节点
集群搭建完毕后,每个节点都可以进行操作,需要在前端搭建nginx进行负载均衡;
2.2.2 k8s内部部署
官网上也提供了一个单例配置方法,但该方法仅能用于测试不能用于生产;
- 单节点模式yml:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: minio
name: minio
namespace: minio-dev # Change this value to match the namespace metadata.name
spec:
replicas: 1
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: quay.io/minio/minio:latest
command:
- /bin/bash
- -c
args:
- minio server /data --console-address :9090
volumeMounts:
- mountPath: /data
name: localvolume # Corresponds to the `spec.volumes` Persistent Volume
nodeSelector:
minio: "true" # Specify a node label associated to the Worker Node on which you want to deploy the pod.
hostNetwork: true
volumes:
- name: localvolume
hostPath: # MinIO generally recommends using locally-attached volumes
path: /mnt/disk1/data # Specify a path to a local drive or volume on the Kubernetes worker node
type: DirectoryOrCreate # The path to the last directory must exist
注意修改nodeSelector,访问方式这里使用hostNetwork,可根据情况自行调整,这里仅做测试;
该yml会把选择node的本地磁盘路径/mnt/disk1/data映射入minIO;
创建pod成功后,访问节点IP:9090
即可打开控制台,进行上传下载等操作;IP:9000
为API接口;
- 多节点配置模式
MinIO官方为了方便用户部署,专门写了一个MinIO Operator
, 用来部署集群,架构如下:
MinIO Operator分为两部分:Console Pod 和 Operator Pod, 一个是负责显示控制台,一个负责执行部署;
为了安装MinIO Operator
,官方专门写了一个插件kubectl-minio
,官方真的我哭死;为了安装这个插件需要安装k8s插件管理器krew
;……,因众所周知的原因,凡是这种包管理器都需要源,一般网都不通;只能直接下载安装;
整个安装步骤:- 安装
kubectl-minio
; - 通过
kubectl-minio
安装MinIO Operator
; - 通过
MinIO Operator
安装MinIO集群;
- 安装
1. 安装kubectl-minio
curl https://github.com/minio/operator/releases/download/v5.0.7/kubectl-minio_5.0.7_linux_amd64 -o kubectl-minio
chmod +x kubectl-minio
mv kubectl-minio /usr/local/bin/
这里使用的5.07,请根据自己k8s版本自行下载安装,https://github.com/minio/operator/releases
4.0.0+对应k8s版本>=1.19.0;
5.0.0+对应k8s>=1.21.0;
5.0.6+对应k8s>=1.25.0
安装完成后,查看版本
kubectl minio version #查看版本
2. 安装MinIO Operator
运行以下命令进行安装,该命令会自动创建名为minio-operator
的namespace;并在该命名空间创建Console Pod
和 Operator Pod
kubectl minio init
等待pod创建成功
修改service/console为NodePort或者配置ingress路由,让console可以集群外访问;当然也可以按照官方文档上的,进行端口代理;
kubectl minio proxy
运行后,即可通过当前节点ip:9090进行访问,jwt token控制台也打出来了,
这种方式我并没有登录成功,可能这种代理只能通过localhost:9090访问,没有深入研究,我是通过ingress暴露地址,拿token进行访问的;
另外一个获取token的命令:
kubectl get secret/console-sa-secret -n minio-operator -o json | jq -r '.data.token' | base64 -d
登录后,我这里已经创建好了一个集群或者说租户suozq;
3. 创建MinIO集群
创建集群就非常简单了,在控制台配置创建即可
以上就是所有的必填项,其他配置,可以大概看下,不想看的点击创建也可;
下方可以通过Images配置MinIO的镜像版本
填写完成点击create;
等待创建完成
创建的服务中,minio对外提供API服务,suozq-console提供控制台服务;
查看nodeport端口
打开控制台:https://192.168.10.100:30822/
在Operator
控制台中修改密码, 注意:密码需要至少8位数,如果不是会导致pod重启失败
等待pod重启完毕后,使用账号密码登录即可;
bucket 可以理解为文件夹
API访问,集群外部通过nodeport或者ingress,集群内部同一命名空间通过minio进行访问,集群内部不同命名空间通过:https://minio.minio-dev.svc.cluster.local
访问
即:{SERVICE_NAME}.{NAMESPACE_NAME}.svc.cluster.local
跨命名空间访问服务方式;