MinIO-DirectPV分布式存储部署
.1. 部署概述
Kubernetes hostpath、local和本地静态配置都存在需要事先在node节点准备好可用的块存储或文件系统,例如对插入的硬盘,或者磁盘阵列做分区格式化,文件系统则需提前创建好Kubernetes即将利用的挂载目录,并且两种方法都会有亲和性限制,无法做到让Kubernetes自身的去调度让数据卷分布在不同的node节点上。
若利用传统的SAN或者NAS的CSI存储驱动(网络PV)来为minio集群提供存储,minio集群本身就分布式存储和保障高可用的特点,不仅会在数据路径中增加另一层复制/擦除编码和额外的网络跃点。这种额外的分解层还会导致复杂性增加和性能下降的问题。
而DirectPV可以解决如上问题,DirectPV做到了跨服器发现可用存储资源、跨服器格式化存储、创建供Kubernetes PV使用的存储池,由Kubernetes API通过DirectPV CSI调度存储资源为POD分配直连式存储PV,分布式地在node节点创建符合PVC申请要求的PV。DirectPV创建的存储资源统一由部署DirectPV的节点监视和维护。
通俗点讲,相当于在master节点部署DirectPV后,只需在node节点插入硬盘或者组建磁盘阵列,后续的格式化只需在安装了DirectPV的master节点上操作,node节点无需后续操作,PV由Kubernetes自行调度和创建,并由PV卷将数据持久化。
DirectPV更多介绍参考:002.DirectPV介绍及安装
基于如上考虑,本实验Kubernetes部署Minio集群存储,选择使用DirectPV CSI作为分布式存储的最佳实践。同时minio官方支持通过简单的快速部署,以便于进行基础测试:
curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O kubectl apply -f minio-dev.yaml
参考官方: 快速部署MinIO 。
.2. minio集群特性
每个minio集群节点上由Kubernetes调度,而每个集群节点的驱动器使用的PV由DirectPV调度,也就是说驱动器实际使用的存储资源是由DirectPV随机的从属于Kubernetes的DirectPV存储池中分配出来的,那实际的数据会随机的分布在node节点上的硬盘上,只要node节点硬盘数量较多,很大程度上可以规避硬盘单点故障的问题。
分布式minio集群将数据分布在每个minio集群节点上,每个集群节点至少拥有4个驱动器,数据被均匀分布在每个集群节点的驱动器上,一半的驱动器空间用于数据备份利用,一半的空间用于存储。
高可用minio集群的高可用特性,即驱动器只要有总数的N/2在线,即可完整的同步和还原数据,解决了硬盘单点故障导致数据丢失的问题。只要minio的集群节点数量够多,也能规避minio集群节点故障大面积的驱动器掉线导致存储数据丢失的问题。
1. MinIO部署
1.1 部署规划
Kubernetes 安装本实验不涉及 Kubernetes 部署, Kubernetes 部署参考 Kubernetes_v1.30.3高可用部署架构二 。
节点规划已完成部署的Kubernetes集群的规划及磁盘相关信息如下:
| 主机 | IP | 磁盘 | 备注 |
|---|---|---|---|
| master01 | 172.24.10.11 | —— | master节点 |
| master02 | 172.24.10.12 | —— | master节点 |
| master03 | 172.24.10.13 | —— | master节点 |
| worker01 | 172.24.10.14 | /dev/nvme0n2 | worker节点+ MinIO 节点 + DirectPV节点 |
| worker02 | 172.24.10.15 | /dev/nvme0n2 | worker节点+ MinIO 节点 + DirectPV节点 |
| worker03 | 172.24.10.16 | /dev/nvme0n2 | worker节点+ MinIO 节点 + DirectPV节点 |
集群VIP: 172.24.10.100相关域名均能正常解析,可通过hosts解析相关域名至 VPI 。
1.2 DirectPV部署
DirectPV部署安装参考:002.DirectPV介绍及安装
通常安装完DirectPV后会自动生成默认的 directpv-min-io StorageClass 。
[root@master01 directpv]# kubectl get sc -o wide NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE directpv-min-io directpv-min-io Delete WaitForFirstConsumer true 11h
1.3 配置MinIO
根据当前规划,参考 DirectPV部署MinIO存储官方yaml 进行修改。
也可参考 MinIO官方yaml 修改。
当前版本的minio把API端口和WebUI端口进行了区分,本实验API保留9000,webui配置为9090。部署在独立的namespace minio-dev中。
[root@master01 minio]# curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O[root@master01 minio]# vim minio-dev.yamlapiVersion: v1kind: Namespacemetadata:
name: minio-dev
labels:
name: minio-dev---kind: ServiceapiVersion: v1metadata:
name: minio
namespace: minio-dev
labels:
app: miniospec:
selector:
app: minio
type: NodePort
ports:
- name: api
port: 9000
protocol: TCP
targetPort: 9000
nodePort: 9000
- name: webui
port: 9090
protocol: TCP
targetPort: 9090
nodePort: 9090---apiVersion: apps/v1kind: StatefulSetmetadata:
name: minio
namespace: minio-dev
labels:
app: miniospec:
serviceName: "minio"
replicas: 4
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
directpv.min.io/organization: minio
directpv.min.io/app: minio-example
directpv.min.io/tenant: tenant-1
spec:
containers:
- name: minio
image: minio/minio
env:
- name: MINIO_ACCESS_KEY
value: minio
- name: MINIO_SECRET_KEY
value: minio123
volumeMounts:
- name: minio-data-1
mountPath: /data1
- name: minio-data-2
mountPath: /data2
- name: minio-data-3
mountPath: /data3
- name: minio-data-4
mountPath: /data4
args:
- "server"
- "http://minio-{0...3}.minio.minio-dev.svc.cluster.local/data{1...4}"
- "--console-address"
- ":9090"
volumeClaimTemplates: #配置StorageClass
- metadata:
name: minio-data-1
spec:
accessModes: [ "ReadWriteOnce" ] resources:
requests:
storage: 1Gi
storageClassName: directpv-min-io #配置已存在的storageClass
- metadata:
name: minio-data-2
spec:
accessModes: [ "ReadWriteOnce" ] resources:
requests:
storage: 1Gi
storageClassName: directpv-min-io #配置已存在的storageClass
- metadata:
name: minio-data-3
spec:
accessModes: [ "ReadWriteOnce" ] resources:
requests:
storage: 1Gi
storageClassName: directpv-min-io #配置已存在的storageClass
- metadata:
name: minio-data-4
spec:
accessModes: [ "ReadWriteOnce" ] resources:
requests:
storage: 1Gi
storageClassName: directpv-min-io #配置已存在的storageClass1.4 正式部署
[root@master01 minio]# kubectl apply -f minio-dev.yaml [root@master01 minio]# kubectl -n minio-dev get all -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/minio-0 1/1 Running 0 2m42s 10.10.30.123 worker02pod/minio-1 1/1 Running 0 2m33s 10.10.196.75 worker04 pod/minio-2 1/1 Running 0 2m25s 10.10.5.11 worker01 pod/minio-3 1/1 Running 0 2m16s 10.10.19.65 worker03 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/minio NodePort 10.20.113.61 9000:9000/TCP,9090:9090/TCP 2m42s app=minio NAME READY AGE CONTAINERS IMAGES statefulset.apps/minio 4/4 2m42s minio minio/minio [root@master01 minio]# kubectl directpv list drives ┌──────────┬─────────┬──────────────────────────┬────────┬────────┬─────────┬────────┐ │ NODE │ NAME │ MAKE │ SIZE │ FREE │ VOLUMES │ STATUS │ ├──────────┼─────────┼──────────────────────────┼────────┼────────┼─────────┼────────┤ │ worker01 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4 │ Ready │ │ worker02 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4 │ Ready │ │ worker03 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4 │ Ready │ │ worker04 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4 │ Ready │ └──────────┴─────────┴──────────────────────────┴────────┴────────┴─────────┴────────┘ [root@master01 minio]# kubectl -n minio-dev get pvc

1.5 ingress访问webui
使用ingress将Webui开放出来。创建证书。
[root@master01 minio]# ll *com*-rw-r--r-- 1 root root 3.9K Aug 24 06:19 api.linuxsb.com.crt-rw-r--r-- 1 root root 1.7K Aug 24 06:19 api.linuxsb.com.key-rw-r--r-- 1 root root 3.9K Aug 24 05:36 minio.linuxsb.com.crt-rw-r--r-- 1 root root 1.7K Aug 24 05:36 minio.linuxsb.com.key[root@master01 minio]# kubectl -n minio-dev create secret tls minio-webui-tls --cert=minio.linuxsb.com.crt --key=minio.linuxsb.com.key[root@master01 minio]# kubectl -n minio-dev create secret tls minio-api-tls --cert=api.linuxsb.com.crt --key=api.linuxsb.com.key[root@master01 minio]# kubectl -n minio-dev describe secrets minio-webui-tls [root@master01 minio]# kubectl -n minio-dev describe secrets minio-api-tls
创建ingress规则。
[root@master01 minio]# vim minio-ingress.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: minio-webui-ingress namespace: minio-dev annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: ingressClassName: "nginx" tls: - hosts: - 'minio.linuxsb.com' secretName: minio-webui-tls rules: - host: minio.linuxsb.com http: paths: - path: / pathType: Prefix backend: service: name: minio port: number: 9090---apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: minio-api-ingress namespace: minio-dev annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: ingressClassName: "nginx" tls: - hosts: - 'api.linuxsb.com' secretName: minio-api-tls rules: - host: api.linuxsb.com http: paths: - path: / pathType: Prefix backend: service: name: minio port: number: 9000 [root@master01 minio]# kubectl apply -f minio-ingress.yaml [root@master01 minio]# kubectl -n minio-dev get ingress -o wideNAME CLASS HOSTS ADDRESS PORTS AGEminio-api-ingress nginx api.linuxsb.com 172.24.10.11 80, 443 64sminio-webui-ingress nginx minio.linuxsb.com 172.24.10.11 80, 443 64s
1.6 确认验证
- 浏览器验证使用浏览器访问 https://172.24.10.100:9090 ,默认minio账号密码: minioadmin / minioadmin ,本实验已设置账号密码: minio / minio123 。


也可使用ingress所暴露的域名访问: https://minio.linuxsb.com 。


- MC验证MinIO Client mc命令行工具提供了ls、cat、cp、mirror和diff等命令,支持文件系统和Amazon s3兼容的云存储服务。
mc命令行工具是为与AWS S3 API兼容而构建的,并在MinIO和AWS S3上测试了预期的功能和行为。
安装mc:
[root@master01 minio]# curl https://dl.min.io/client/mc/release/linux-amd64/mc \ --create-dirs \ -o /usr/local/bin/mc [root@master01 minio]# chmod +x /usr/local/bin/mc [root@master01 minio]# mc --help
连接minio:使用mc alias set命令将Amazon s3兼容的服务添加到mc配置中,将alias替换为要关联到S3服务的名称。mc命令通常需要alias作为参数来标识要对哪个S3服务执行,如果省略ACCESS_KEY和SECRET_KEY,执行命令时会提示在CLI中输入这些值。
[root@master01 minio]# mc alias set myminio https://api.linuxsb.com minio minio123Added `myminio` successfully. [root@master01 minio]# mc admin info myminio

提示:更多mc命令使用参考: MinIO Client 。
2. MinIO扩容
2.1 在线扩容
MinIO结合DirectPV部署的分布式存储集群,可通过DirectPV的特性完成在线卷扩容,不需要重新启动使用这些卷的pod,调整扩容后的大小,然后Persistent Volume Claim自动完成相应动作。
[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0 -o yaml > minio-data-1-minio-0.yaml #将需要扩容的卷的yaml导出[root@master01 minio]# vim minio-data-1-minio-0.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata: annotations: pv.kubernetes.io/bind-completed: "yes" pv.kubernetes.io/bound-by-controller: "yes" volume.beta.kubernetes.io/storage-provisioner: directpv-min-io volume.kubernetes.io/selected-node: worker02 volume.kubernetes.io/storage-provisioner: directpv-min-io creationTimestamp: "2024-08-23T16:27:13Z" finalizers: - kubernetes.io/pvc-protection labels: app: minio name: minio-data-1-minio-0 namespace: minio-dev resourceVersion: "1536089" uid: 4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167espec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi #直接修改大小 storageClassName: directpv-min-io volumeMode: Filesystem volumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167estatus: accessModes: - ReadWriteOnce capacity: storage: 1Gi phase: Bound[root@master01 minio]# kubectl apply -f minio-data-1-minio-0.yaml……
2.2 确认验证
验证扩容后的相应的卷是否为2G。
[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0 -o yamlapiVersion: v1kind: PersistentVolumeClaim#……spec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi #扩容后的当前容量 storageClassName: directpv-min-io volumeMode: Filesystem volumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167estatus: accessModes: - ReadWriteOnce capacity: storage: 2Gi[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGEminio-data-1-minio-0 Bound pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e 2Gi RWO directpv-min-io6h20m
提示:在享受本文内容的同时,请注意版权归属 徐州鑫坤机电设备有限公司https://www.xzxkjd.com如果您觉得有价值欢迎分享,但请务必注明出处,感谢您的理解,谢谢!
以下部分内容需要登录查看 立即登录
相关内容
- MinIO-DirectPV分布式存储部署
- 供需裂口持续扩大:2025年铜价暴涨,产业链如何应对?
- 铜,新时代的“石油”?2025年价格狂飙背后的战略博弈
- 从能源革命到智能时代:2025铜价暴涨背后的全球新逻辑
- 铜价创历史新高!绿色转型与供需失衡背后的财富浪潮
- 2025铜价为何一飞冲天?三大核心驱动力深度解析
- 上海非急救出租服务全解析
- 深耕中考复读赛道 深圳深才教育为复读生搭建升学桥梁
- 阳光下的童年:那些被温暖照亮的纯真时光
- 群晖DSM7.0-7.21监控套件Surveillance Station 9.20-11289开心版60个许可证设置教程(无重启、无断流、无卡死、史上最完美)
- 云服务器+SD-WAN组网和域名DNS解析
- 在云主机上安装iKuai OS,实现SD-WAN组网,利用云主机80;443端口搭建企业网站。个人博客。让云主机当做你的堡垒机,实现数据本地化。
简体中文
繁體中文
English
Nederlands
Français
Русский язык
Polski
日本語
ภาษาไทย
Deutsch
Português
español
Italiano
한어
Suomalainen
Gaeilge
dansk
Tiếng Việt
Pilipino
Ελληνικά
Maori
tongan
ᐃᓄᒃᑎᑐᑦ
ଓଡିଆ
Malagasy
Norge
bosanski
नेपालीName
čeština
فارسی
हिंदी
Kiswahili
ÍslandName
ગુજરાતી
Slovenská
היברית
ಕನ್ನಡ್Name
Magyar
தாமில்
بالعربية
বাংলা
Azərbaycan
lifiava
IndonesiaName
Lietuva
Malti
català
latviešu
УкраїнськаName
Cymraeg
ກະຣຸນາ
తెలుగుQFontDatabase
Română
Kreyòl ayisyen
Svenska
հայերեն
ဗာရမ်
پښتوName
Kurdî
Türkçe
български
Malay
मराठीName
eesti keel
മലമാലം
slovenščina
اوردو
አማርኛ
ਪੰਜਾਬੀName
albanian
Hrvatski
Suid-Afrikaanse Dutch taal
ខ្មែរKCharselect unicode block name




