004.MinIO-DirectPV分布式存储部署
MinIO部署介绍
部署概述
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 。
minio集群特性
每个minio集群节点上由Kubernetes调度,而每个集群节点的驱动器使用的PV由DirectPV调度,也就是说驱动器实际使用的存储资源是由DirectPV随机的从属于Kubernetes的DirectPV存储池中分配出来的,那实际的数据会随机的分布在node节点上的硬盘上,只要node节点硬盘数量较多,很大程度上可以规避硬盘单点故障的问题。
分布式
minio集群将数据分布在每个minio集群节点上,每个集群节点至少拥有4个驱动器,数据被均匀分布在每个集群节点的驱动器上,一半的驱动器空间用于数据备份利用,一半的空间用于存储。高可用
minio集群的高可用特性,即驱动器只要有总数的N/2在线,即可完整的同步和还原数据,解决了硬盘单点故障导致数据丢失的问题。只要minio的集群节点数量够多,也能规避minio集群节点故障大面积的驱动器掉线导致存储数据丢失的问题。
MinIO部署
部署规划
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 。
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
配置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.yaml
apiVersion: v1
kind: Namespace
metadata:
name: minio-dev
labels:
name: minio-dev
---
kind: Service
apiVersion: v1
metadata:
name: minio
namespace: minio-dev
labels:
app: minio
spec:
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/v1
kind: StatefulSet
metadata:
name: minio
namespace: minio-dev
labels:
app: minio
spec:
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 #配置已存在的storageClass
正式部署
[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 worker02 <none> <none>
pod/minio-1 1/1 Running 0 2m33s 10.10.196.75 worker04 <none> <none>
pod/minio-2 1/1 Running 0 2m25s 10.10.5.11 worker01 <none> <none>
pod/minio-3 1/1 Running 0 2m16s 10.10.19.65 worker03 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/minio NodePort 10.20.113.61 <none> 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
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.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
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/v1
kind: Ingress
metadata:
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 wide
NAME CLASS HOSTS ADDRESS PORTS AGE
minio-api-ingress nginx api.linuxsb.com 172.24.10.11 80, 443 64s
minio-webui-ingress nginx minio.linuxsb.com 172.24.10.11 80, 443 64s
确认验证
- 浏览器验证
使用浏览器访问 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 minio123
Added `myminio` successfully.
[root@master01 minio]# mc admin info myminio
提示:更多mc命令使用参考: MinIO Client 。
MinIO扩容
在线扩容
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: v1
kind: PersistentVolumeClaim
metadata:
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-5b0f3c65167e
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi #直接修改大小
storageClassName: directpv-min-io
volumeMode: Filesystem
volumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
phase: Bound
[root@master01 minio]# kubectl apply -f minio-data-1-minio-0.yaml
……
确认验证
验证扩容后的相应的卷是否为2G。
[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0 -o yaml
apiVersion: v1
kind: PersistentVolumeClaim
#……
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi #扩容后的当前容量
storageClassName: directpv-min-io
volumeMode: Filesystem
volumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi
[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
minio-data-1-minio-0 Bound pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e 2Gi RWO directpv-min-io <unset> 6h20m
更多DirectPV卷管理参考: Volume management 和 003.DirectPV存储管理 。
004.MinIO-DirectPV分布式存储部署的更多相关文章
- MinIO 的分布式部署
目录 1 前言 2 分布式存储可靠性常用方法 2.1 冗余 2.2 校验 3 MinIO存储机制 3.1 概念理解 3.2 纠删码EC(Erasure Code) 3.3 存储形式 4 部署实践 4. ...
- Ceph分布式存储部署过程
前言: 环境介绍:此次部署系统为Cenots 7 MON.OSD 10.110.180.112 Admin MON.OSD 10.110.180.113 Node1 MON.OSD 10.110.18 ...
- ETCD分布式存储部署
一.ETCD 概述 ETCD 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置.具有一下优点: 简单: 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致 ...
- 004.etcd集群部署-动态发现
一 etcd发现简介 1.1 需求背景 在实际环境中,集群成员的ip可能不会提前知道.如使用dhcp自动获取的情况,在这些情况下,使用自动发现来引导etcdetcd集群,而不是指定静态配置,这个过程被 ...
- 免费版对象存储【minIO】CentOS部署实践记录 2021
好久没写,记录一下 1.背景 之前一直用的七牛,不过是收费的,然后有些定制化需求,可能比较看重预算,然后就有了这篇开源方式:minio 2.简介 官方文档:http://docs.minio.org. ...
- glusterFS分布式存储部署流程
转自:http://bangbangba.blog.51cto.com/3180873/1712061 GlusterFS是一款非常易于使用的分布式文件存储系统,实现了全部标准POSIX接口,并用fu ...
- Glusterfs 分布式存储安装部署
Glusterfs 分布式存储部署 是存储当中可以选择的一种 现在很多虚拟化 云计算都在用软件存储 例如 ceph Glusterfs 等等 今天我们部署一下Glusterfs环境 GlusterFs ...
- 基于Docker Compose部署分布式MinIO集群
一.概述 Minio 是一个基于Go语言的对象存储服务.它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器 ...
- Minio分布式集群部署——Swarm
最近研究minio分布式集群部署,发现网上大部分都是单服务器部署,而minio官方在github上现在也只提供了k8s和docker-compose的方式,网上有关与swarm启动minio集群的文章 ...
- MinIO分布式集群部署方式
文章转载自:https://blog.51cto.com/u_10950710/4843738 关于分布式集群MinIo 单机Minio服务存在单点故障,如果是一个有N块硬盘的分布式Minio,只要有 ...
随机推荐
- scarpy基础
1. 创建项目 scrapy startproject 项目名称 2. 进入项目 cd 项目名称 3. 创建爬虫 scrapy genspider 名字 域名 4. 可能需要start_urls,修改 ...
- 第一个Vert.x程序(基于Gradle7)
这里跑一下Vert.x中文站的入门程序(以后就不写那个点了,或者干脆写vx)简易教程.这个程序非常简单,为啥还写一下呢?因为里面的依赖有点老,已经不能直接成功启动了. 搭建项目 通过IDEA创建Gra ...
- Java使用不同方式优雅拆分业务逻辑
如何处理复杂的业务逻辑 在实际的业务开发当中,经常会遇到复杂的业务逻辑,可能实现出来的代码并没有什么问题,但是代码的可读性很差. 那么在实际开发中如何避免大面积的 if-else 代码块的问题? 补充 ...
- Python通过GPIO从DHT11温度传感器获取数据
Python通过GPIO从DHT11温度传感器获取数据 设备:树莓派4B.DHT11.杜邦线 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器. 其精度湿度±5%RH, 温度±2℃,量程 ...
- python 自动化神器 多平台纯代码RPA办公自动化python框架
Pyaibote是一款专注于纯代码RPA(机器人流程自动化)的强大工具,支持Android.Browser和Windows三大主流平台.无论您需要自动化安卓应用.浏览器操作还是Windows应用程 ...
- SpringBoot+Mybatis整合出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)的解决
在搭建自己的后台管理,遇到一个比较小问题,顺便记录了一下. 启动SpringBoot后台时,前端访问后台执行Mybatis时,出现了这样的报错: org.apache.ibatis.binding.B ...
- ASP.NET Core中创建中间件的几种方式
前言 今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式. 中间件介绍 ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件, ...
- 3.1 Y86-64指令集体系结构
程序员可见的状态 这里的程序员即可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器.程序员可见的状态如下,有15个程序寄存器(%rax,%rbx等),三个一位的条件(ZF,OF,SF) ,程序 ...
- MYSQL DQL in 到底会不会走索引&in 范围查询引发的思考。
前情引子 in 会不会走索引?很多人肯定会回答.废话.如果命中了索引.那肯定会走. 其实我和大多数人一样.一开始也是这么想的.直至有一个血淋淋的案子让我有所改观.有所思考. 背景介绍 业务的工单表.我 ...
- WCF异常System.ServiceModel.ProtocolException问题处理
现象: 最近遇到了WCF 服务无法调用的错误,异常如下. System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0 ...