004.MinIO-DirectPV分布式存储部署

news/2024/9/18 8:53:32/文章来源:https://www.cnblogs.com/itzgr/p/18377344

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-devlabels:name: minio-dev---
kind: Service
apiVersion: v1
metadata:name: minionamespace: minio-devlabels:app: minio
spec:selector:app: miniotype: NodePortports:- name: apiport: 9000protocol: TCPtargetPort: 9000nodePort: 9000- name: webuiport: 9090protocol: TCPtargetPort: 9090nodePort: 9090
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: minionamespace: minio-devlabels:app: minio
spec:serviceName: "minio"replicas: 4selector:matchLabels:app: miniotemplate:metadata:labels:app: miniodirectpv.min.io/organization: miniodirectpv.min.io/app: minio-exampledirectpv.min.io/tenant: tenant-1spec:containers:- name: minioimage: minio/minioenv:- name: MINIO_ACCESS_KEYvalue: minio- name: MINIO_SECRET_KEYvalue: minio123volumeMounts:- name: minio-data-1mountPath: /data1- name: minio-data-2mountPath: /data2- name: minio-data-3mountPath: /data3- name: minio-data-4mountPath: /data4args:- "server"- "http://minio-{0...3}.minio.minio-dev.svc.cluster.local/data{1...4}"- "--console-address"- ":9090"volumeClaimTemplates:                 #配置StorageClass- metadata:name: minio-data-1spec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1GistorageClassName: directpv-min-io #配置已存在的storageClass- metadata:name: minio-data-2spec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1GistorageClassName: directpv-min-io #配置已存在的storageClass- metadata:name: minio-data-3spec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1GistorageClassName: directpv-min-io #配置已存在的storageClass- metadata:name: minio-data-4spec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1GistorageClassName: 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=minioNAME                     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

015

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-ingressnamespace: minio-devannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: "nginx"tls:- hosts:- 'minio.linuxsb.com'secretName: minio-webui-tlsrules:- host: minio.linuxsb.comhttp:paths:- path: /pathType: Prefixbackend:service:name: minioport:number: 9090
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: minio-api-ingressnamespace: minio-devannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: "nginx"tls:- hosts:- 'api.linuxsb.com'secretName: minio-api-tlsrules:- host: api.linuxsb.comhttp:paths:- path: /pathType: Prefixbackend:service:name: minioport: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 。

010

011

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

012

013

  • 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

014

提示:更多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-iovolume.kubernetes.io/selected-node: worker02volume.kubernetes.io/storage-provisioner: directpv-min-iocreationTimestamp: "2024-08-23T16:27:13Z"finalizers:- kubernetes.io/pvc-protectionlabels:app: minioname: minio-data-1-minio-0namespace: minio-devresourceVersion: "1536089"uid: 4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e
spec:accessModes:- ReadWriteOnceresources:requests:storage: 2Gi                          #直接修改大小storageClassName: directpv-min-iovolumeMode: FilesystemvolumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e
status:accessModes:- ReadWriteOncecapacity:storage: 1Giphase: 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:- ReadWriteOnceresources:requests:storage: 2Gi                          #扩容后的当前容量storageClassName: directpv-min-iovolumeMode: FilesystemvolumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e
status:accessModes:- ReadWriteOncecapacity: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存储管理 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786420.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dotnet 默认创建的 JsonContent 没有 Content Lenght 的内容头

本文记录一个 dotnet 的设计问题,默认创建出来的 JsonContent 对象的 Headers 里,是没有 Content-Length 信息的如下面代码创建一个 JsonContent 对象 using System.Net.Http.Json;var foo = new Foo();var jsonContent = JsonContent.Create(foo);class Foo {public int Val…

dotnet X11 多次调用 XPutImage 是否能做到渲染同步

本文将告诉大家我在麒麟系统和统信系统以及分别搭配飞腾和兆芯处理器的设备上,使用连续的 XPutImage 方法推送界面,测试是否能够在一次渲染内完成。测试结论是不能做到渲染同步本文的核心测试代码如下XPutImage(display, handle, gc, ref xImage, @event.ExposeEvent.x, @eve…

dotnet C# 结构体出方法弹栈之后的行为

本文记录我在 .NET 9 里测试的行为,在方法里面创建的在栈上的结构体,在方法执行结束之后,栈上的结构体将会被弹栈进入不受管理区域,此时的结构体内存内容不会立刻被清空或被改写这是我在对 dotnet X11 栈空间被回收导致调用 XPutShmImage 闪退 博客的内容进行更多的测试,确…

Tesla 开发者 API 指南:BLE 密钥 – 身份验证和车辆命令

注意:本工具只能运行于 mac 或者 linux, win下不支持。 1. 克隆项目到本地 https://github.com/teslamotors/vehicle-command.git 2. 项目根目录下执行命令 go get ./... go build ./... go install ./... cd cmd cd tesla-control go build 3. 生成密钥 生成私钥 openssl e…

it程序员常用的技术社区网站有哪些?

it程序员常用的技术社区网站有哪些??作为程序员,选择好合适的开发社区对提高自己的编程能力会有很大的帮助,技术人员经常会在各种技术交流社区游逛。优秀的实时开发社区确实能帮你积累不少开发经验1、gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一…

推荐7款美观且功能强大的WPF UI库

前言 经常看到有小伙伴在DotNetGuide技术社区交流群里提问:WPF有什么好用或者好看的UI组件库推荐的?,今天大姚给大家分享7款开源、美观、功能强大、简单易用的WPF UI组件库。 WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用。它提供了灵…

HTML+JS初试水

情境 参加了培训的第二次课, 这里是第二颗的作业题, 及我的解答. 1、使用 html 写一个网页,要求满足以下条件: (1)网页中含有任意一张图片,图片路径使用绝对路径,鼠标悬停在图片时出现“马哥教育”文本,且点击图片可跳转至马哥教育官方页面 (2)网页中包含账号、密码登…

Vue3的学习---8

8. Vue可复用解决方案 Vue可复用方案是指在Vue.js项目中,通过创建可复用的组件、指令、插件等,来提高代码的复用性和可维护性常见的Vue可复用方案有:组件(Components)、指令(Directives)、插件(Plugins)、混入(Mixins)、高阶组件(Higher-Order Components, HOC)等…

蓝帽杯2020-Misc-熟悉的解密

蓝帽杯2020-MISC-熟悉的解密 前言 怎么说呢,我觉得对我一个不懂加解密算法的人来说,应该算是Crypto,不过对于专业人员来说可能TEA、AES、RSA、LCG这种应该都比较ez(like 编码?) 一、题目 IyEvdXNyL2Jpbi9lbnYgcHl0aG9uDT== Iy0qLSBjb2Rpbmc6IHV0Zi04IC0qLQ0= aW1wb3J0IHN…

051、Vue3+TypeScript基础,页面通讯之v-model的基本用法

1、main.ts代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.moun…

InternLM 2.5 书生浦语 开源大模型本地部署体验

上海人工智能实验室发布了书生浦语(InternLM)新开源版本,增强了在复杂场景下的推理能力,本文介绍在本地进行部署和推理……老牛同学之前偶尔刷到过InternLM大模型相关的介绍文章,因为在老牛同学心中,Qwen2千问才是国内开源模型中最适合自己的大模型,原因是自己在本地部署…

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

在Python中,列表是一个非常灵活且常用的复合数据类型。它允许存储多个项,这些项可以是任意的数据类型,包括其他列表。列表推导式是一种简洁的方式来创建和操作列表。全网最适合入门的面向对象编程教程:37 Python 常用复合数据类型-列表和列表推导式摘要: 在 Python 中,列…