minio集群部署(k8s内)
一、前言
minio的部署有几种方式,分别是单节点单磁盘,单节点多磁盘,多节点多磁盘三种方式,本次部署使用多节点多磁盘的方式进行部署,minio集群多节点部署最低要求需要4个节点,集群扩容时也是要求扩容的节点为4的倍数才能更好的发挥minio的性能,使用minio集群可以更好的实现高可用,在minio集群还有n/2节点存活时minio集群依然可读但不可写,在minio集群还有n/2+1节点存活时minio集群依然可读可写
二、部署
创建minio 服务yaml文件的存储目录
mkdir /opt/minio && cd /opt/minio
这里使用nfs作为minio的存储,其实最好还是单独挂载磁盘作为minio的存储更好,用nfs作为minio的存储,相当于存储还是有单点的问题,单独挂载磁盘可以在k8s的每个工作节点分配磁盘的存储路径再使用pv作为存储块,这样就能避免存储的单点问题,这里就是用nfs网络存储作为pv存储块的存储
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv0
spec:storageClassName: minio-pv #指定动态存储卷的类型或类别,当pvc使用该类别时,可以自动绑定属于该类别的pvcapacity:storage: 100Gi #存储大小accessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain #配置回收模式,配置为删除pv不自动删除存储路径中的数据nfs: #使用nfs存储path: /volume2/k8s-data/minio/minio-pv0 #nfs存储路径,这里使用4个不同的nfs路径,模拟4个单独的存储磁盘server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv1
spec:storageClassName: minio-pv capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv1server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv2
spec:storageClassName: minio-pv capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv2server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv3
spec:storageClassName: minio-pv capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv3server: 10.1.13.99
使用setafulset的方式部署minio集群,因为每个minio是有状态的应用,每个节点都存着数据,这里再说一下使用的是pvc模板的方式去绑定创建好的pv,也可以使用动态pv,使用pvc模板,然后去动态的自动创建pv绑定
vi setafulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: minionamespace: minio
spec:podManagementPolicy: "Parallel" #并行启动pod,不配置的话模式是按顺序启动pod,minio、nacos都需要配置并行启动serviceName: minio #指定Headless Service的名称,这个服务的作用是为每个Pod创建一个独立的DNS记录,使其能够通过该DNS记录进行唯一标识和访问replicas: 4selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:affinity: #亲和性配置可忽略,我这里是为了分配到固定的节点上nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: appoperator: Invalues:- miniocontainers:- name: minioimage: minio/minioimagePullPolicy: IfNotPresentenv: #配置变量,配置minio集群的账户密码,密码不能少于8位数- name: MINIO_ROOT_USERvalue: admin- name: MINIO_ROOT_PASSWORDvalue: 12345678args: #定义minio集群配置,定义每个节点- server- "http://minio-{0...3}.minio.minio.svc.cluster.local/data"# - "http://minio-{4...7}.minio.minio.svc.cluster.local/data"- --console-address- ":5000"ports:- name: tcp-9000containerPort: 9000protocol: TCP- name: http-5000containerPort: 5000protocol: TCPvolumeMounts: #配置数据目录- name: datamountPath: /datatolerations: #配置污点,我这里是为了能在master节点上分配pod- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedulevolumeClaimTemplates: #使用定义pvc模板,去自动创建pvc- metadata:name: dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "minio-pv" #配置存储类型的名称,这里配置和上面pv配置的名称一致,就会自动绑定关于此存储类型名称的pvresources:requests:storage: 100Gi
配置service,使得外部能访问minio集群
vi service.yaml
kind: Service
apiVersion: v1
metadata:name: minionamespace: miniolabels:app: minio
spec:type: NodePortports:- name: http-9000protocol: TCPport: 9000nodePort: 30004targetPort: 9000- name: http-5000protocol: TCPport: 5000nodePort: 30002targetPort: 5000selector:app: minio
创建命名空间
kubectl create namespace minio
创建各yaml服务
kubectl apply -f pv.yaml
kubectl apply -f setafulset.yaml
kubectl apply -f service.yaml
查看各服务是否正常
kubectl get all -n minio

kubectl get pv

kubectl get pvc -n minio

查看minio web
http://10.1.60.119:30002
输入配置setafulset时定义的用户名和密码

可以看到minio集群显示4个节点均正常
创建bucket上传文件后进行节点损坏实验

这里就不展示实验的过程了, 直接讲述实验的结果,本minio集群一共四个节点,当存活节点只剩下n/2时即2个节点,minio的bucket只能读取文件,不能上传文件,当存活节点剩下n/2+1时,minio的bucket可以进行正常的读取文件、上传文件,可以自行做实验尝试
注意:minio集群部署后如果删除了pvc和pv重新创建,会导致pod重新随机绑定一个pvc和pv,pod随机绑定pvc后minio集群会出现问题,会报错挂载磁盘信息不正确,如果要解决的话,需要删除该pv挂载路径下原来的数据,所以一般不要动pvc和pv,因为setafulset的特性只删除pod,pod会自动绑定原来的pvc,即使把整个setafulset删除重新创建也是会绑定原来的pvc,就不会导致集群出现问题
minio集群节点对等扩容
minio集群的扩容需要提前创建好需要扩容的pv个数,再更改setafulset配置,关于minio的扩容需要是4的倍数,这样才能更好的发挥minio集群的特性以便最好地利用 Erasure Code,并提供最佳的冗余和容错性,这是因为 Erasure Code 将数据分为数据块和冗余块,并将它们分布在不同的节点上,确保了数据的可靠性和冗余,另外使用对等扩容后,minio的集群原来的节点和新加入的加点会分成两部分,两部分不互相同步数据,当数据上传到bucket时,minio会根据算法去判断该数据存在哪一部分节点上
vi pv.yaml
apiVersion: v1 #在之前的pv配置后面加上以下pv配置
kind: PersistentVolume
metadata:name: minio-pv4
spec:storageClassName: minio-pv #定义了存储类型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv4server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv5
spec:storageClassName: minio-pv #定义了存储类型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv5server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv6
spec:storageClassName: minio-pv #定义了存储类型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv6server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv7
spec:storageClassName: minio-pv #定义了存储类型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv7server: 10.1.13.99
vi setafulset
apiVersion: apps/v1
kind: StatefulSet
metadata:name: minionamespace: minio
spec:podManagementPolicy: "Parallel" #平行启动pod,不配置的话模式是按顺序启动podserviceName: minioreplicas: 8 #更改pod数量selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: appoperator: Invalues:- miniocontainers:- name: minioimage: minio/minioimagePullPolicy: IfNotPresentenv:- name: MINIO_ROOT_USERvalue: admin- name: MINIO_ROOT_PASSWORDvalue: Zyh@022759args:- server- "http://minio-{0...3}.minio.minio.svc.cluster.local/data"- "http://minio-{4...7}.minio.minio.svc.cluster.local/data" #增加minio集群配置- --console-address- ":5000"ports:- name: tcp-9000containerPort: 9000protocol: TCP- name: http-5000containerPort: 5000protocol: TCPvolumeMounts:- name: datamountPath: /datatolerations:- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedulevolumeClaimTemplates:- metadata:name: dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "minio-pv"resources:requests:storage: 100Gi
执行yaml文件加载配置
kubectl apply -f pv.yaml
kubectl apply -f setafulset.yaml
执行完成后minio集群就会扩容成8节点集群,关于数据会随机分配到两部分节点上存储,可以自行做实验验证
相关文章:
minio集群部署(k8s内)
一、前言 minio的部署有几种方式,分别是单节点单磁盘,单节点多磁盘,多节点多磁盘三种方式,本次部署使用多节点多磁盘的方式进行部署,minio集群多节点部署最低要求需要4个节点,集群扩容时也是要求扩容的节点…...
【C语言】函数(四):函数递归与迭代,二者有什么区别
目录 前言递归定义递归的两个必要条件接受一个整型值(无符号),按照顺序打印它的每一位使用函数不允许创建临时变量,求字符串“abcd”的长度求n的阶乘求第n个斐波那契数 迭代总结递归与迭代的主要区别用法不同结构不同时间开销不同…...
[原创](免改BIOS)使用Clover升级旧电脑-(高阶玩法)让固态硬盘内置Win11 PE启动系统
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…...
React项目中发生空白但不报错的原因分析和解决?
文章目录 前言组件渲染问题状态管理问题异步操作问题代码错误但未抛出异常如果我们使用的是chorme浏览器的话,可以下载一个开发者工具,例如下图:代码审查使用调试工具日志和输出检查外部依赖异步操作终极大法,不到万不得已不可以使…...
redis运维(十七)事务
一 redis事务 事务核心参考 ① 基础概念 1、场景引入核心:通过现象思考原因? 2、事务的概念 3、事务四大特性说明: redis只具备部分特性 重点1: 原子性和一致性 重点2: 隔离性和持久性 ② redis的事务 1、基础铺垫备注&…...
Vue框架学习笔记——Vue实例中el和data的两种写法
文章目录 前文提要Vue实例的el第一种写法第二种写法小结 Vue实例中data第一种写法,对象式效果图片第二种写法,函数式效果图片小结 前文提要 本文仅做自己的学习记录,如有错误,请多谅解 Vue实例的el 第一种写法 <body><…...
libbz2 for Mac OS makefile
git地址:git://sourceware.org/git/bzip2.git a文件Makefile # ------------------------------------------------------------------ # This file is part of bzip2/libbzip2, a program and library for # lossless, block-sorting data compression. # # bzip…...
测试工具JMeter的使用
目录 JMeter的安装配置 测试的性能指标 TPS 响应时长 并发连接 和 并发用户 CPU/内存/磁盘/网络 负载 性能测试实战流程 JMeter JMeter快速上手 GUI模式 运行 HTTP请求默认值 录制网站流量 模拟间隔时间 Cookie管理器 消息数据关联 变量 后置处理器 CSV 数据文…...
C++编程——输入
#include<bits/stdc.h> using namespace std; int main(){//beginint a 0, b 0, c 0, d 0, e 0;char f1, f2;char g[30];scanf("%d", &a); //输入整数并赋值给变量ascanf("%d", &b); //输入整数并赋值给变量bscanf("%d", &…...
opencv-直方图
直方图是一种对图像亮度分布的统计表示,它显示了图像中每个灰度级别的像素数量。在OpenCV中,你可以使用cv2.calcHist() 函数计算直方图。 以下是一个简单的示例,演示如何计算和绘制图像的直方图: import cv2 import numpy as np …...
el-table表格排序(需要后端判别),el-table导出功能(向后端发送请求)
(1)表格排序 (2)简单的table导出功能(需要后台支撑)必须要有iframe (3)页面所有代码: <template><div class"mainContainer"><el-form:model&…...
【MATLAB】全网入门快、免费获取、持续更新的科研绘图教程系列2
14 【MATLAB】科研绘图第十四期表示散点分布的双柱状双Y轴统计图 %% 表示散点分布的双柱状双Y轴统计图%% Made by Lwcah (公众号:Lwcah) %% 公众号:Lwcah %% 知乎、B站、小红书、抖音同名账号:Lwcah,感谢关注~ %% 更多…...
git与ssh多账户共存
git与ssh多账户共存 前言git多账户ssh多公钥参考 前言 在使用git与ssh时,经常会遇到多个账户共存的情况 例如使用不同的公钥登陆到不同的服务;使用不同的git信息进行commit git多账户 在默认情况下 git的信息存在 ~/.gitconfig 可以使用命令查看 git…...
BLE协议栈入门学习
蓝牙LE栈 物理层 频带 蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作,该频段分为40个信道,每个信道间隔为2MHz。 时分 蓝牙LE是半双工的,可以发送和接收,但不能同时发送和接收,然而,所有的设…...
【反射】简述反射的构造方法,成员变量成员方法
🎊专栏【JavaSE】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🥰欢迎并且感谢大家指出我的问题 文章目录 🎄什么是反射🎄获取class对象的三种方式⭐代码实现 dz…...
acwing算法基础之数学知识--求卡特兰数
目录 1 基础知识2 模板3 工程化 1 基础知识 题目:给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个? 输出的答案对 1 0 …...
《洛谷深入浅出基础篇》P4017最大食物链————拓扑排序
上链接:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4017 上题干: 题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是…...
设置定时自动请求测试_自动定时循环发送http_post请求---postman工作笔记001
其实就是创建接口文件夹的时候,有个monitor collection 用来监听接口执行情况,这里就可以设置 可以看到多久执行一次对吧,这里可以设置每几分钟执行一次,一共执行多少次等等 但是这里要说明一下,如果需要使用monitor功能,必须需要登录, 所以如果这里点击monitor collection…...
Vue3封装全局插件
定义一个全局加载组件 一、首先定义dom元素 定义一个index.vue文件 <template><div class"loading">loading...</div> </template> <script setup lang"ts"></script> <style scoped> .loading {display: fl…...
【Python 训练营】N_6 求素数
题目 判断101-200之间有多少个素数,并输出所有素数。 分析 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 答案 h 0 leap 1 from math import sqrt from sys …...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
