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使用该类别时,可以自动绑定属于该类别的pv
  capacity:
    storage: 100Gi     #存储大小
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: 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: 100Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume2/k8s-data/minio/minio-pv1
    server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv2
spec:
  storageClassName: minio-pv    
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume2/k8s-data/minio/minio-pv2
    server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv3
spec:
  storageClassName: minio-pv  
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume2/k8s-data/minio/minio-pv3
    server: 10.1.13.99

使用setafulset的方式部署minio集群,因为每个minio是有状态的应用,每个节点都存着数据,这里再说一下使用的是pvc模板的方式去绑定创建好的pv,也可以使用动态pv,使用pvc模板,然后去动态的自动创建pv绑定

vi setafulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio
  namespace: minio
spec:
  podManagementPolicy: "Parallel"  #并行启动pod,不配置的话模式是按顺序启动pod,minio、nacos都需要配置并行启动
  serviceName: minio  #指定Headless Service的名称,这个服务的作用是为每个Pod创建一个独立的DNS记录,使其能够通过该DNS记录进行唯一标识和访问
  replicas: 4
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      affinity:       #亲和性配置可忽略,我这里是为了分配到固定的节点上
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: app
                operator: In
                values:
                - minio
      containers:
        - name: minio
          image: minio/minio
          imagePullPolicy: IfNotPresent
          env:        #配置变量,配置minio集群的账户密码,密码不能少于8位数
            - name: MINIO_ROOT_USER
              value: admin
            - name: MINIO_ROOT_PASSWORD
              value: 12345678
          args:    #定义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-9000
              containerPort: 9000
              protocol: TCP
            - name: http-5000
              containerPort: 5000
              protocol: TCP
          volumeMounts:   #配置数据目录
          - name: data
            mountPath: /data
      tolerations:       #配置污点,我这里是为了能在master节点上分配pod
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
  volumeClaimTemplates:   #使用定义pvc模板,去自动创建pvc
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "minio-pv"   #配置存储类型的名称,这里配置和上面pv配置的名称一致,就会自动绑定关于此存储类型名称的pv
      resources:
        requests:
          storage: 100Gi

配置service,使得外部能访问minio集群

vi service.yaml

kind: Service
apiVersion: v1
metadata:
  name: minio
  namespace: minio
  labels:
    app: minio
spec:
  type: NodePort
  ports:
    - name: http-9000
      protocol: TCP
      port: 9000
      nodePort: 30004
      targetPort: 9000
    - name: http-5000
      protocol: TCP
      port: 5000
      nodePort: 30002
      targetPort: 5000
  selector:
    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: 100Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume2/k8s-data/minio/minio-pv4
    server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv5
spec:
  storageClassName: minio-pv    #定义了存储类型
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume2/k8s-data/minio/minio-pv5
    server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv6
spec:
  storageClassName: minio-pv    #定义了存储类型
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume2/k8s-data/minio/minio-pv6
    server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv7
spec:
  storageClassName: minio-pv    #定义了存储类型
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume2/k8s-data/minio/minio-pv7
    server: 10.1.13.99

vi setafulset

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio
  namespace: minio
spec:
  podManagementPolicy: "Parallel"  #平行启动pod,不配置的话模式是按顺序启动pod
  serviceName: minio
  replicas: 8          #更改pod数量
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: app
                operator: In
                values:
                - minio
      containers:
        - name: minio
          image: minio/minio
          imagePullPolicy: IfNotPresent
          env:
            - name: MINIO_ROOT_USER
              value: admin
            - name: MINIO_ROOT_PASSWORD
              value: Zyh@022759
          args:
            - 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-9000
              containerPort: 9000
              protocol: TCP
            - name: http-5000
              containerPort: 5000
              protocol: TCP
          volumeMounts:
          - name: data
            mountPath: /data
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "minio-pv"
      resources:
        requests:
          storage: 100Gi

执行yaml文件加载配置

kubectl apply -f pv.yaml

kubectl apply -f setafulset.yaml

执行完成后minio集群就会扩容成8节点集群,关于数据会随机分配到两部分节点上存储,可以自行做实验验证

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTP四大参数类型及请求参数的方式和如何接收

HTTP 请求中4大参数类型和接收方法。 1、请求头参数head 请求头参数顾名思义,是存放在请求头中发送给服务器的参数,服务器通过解析请求头获取参数内容。通常会存放本次请求的基本设置,以帮助服务器理解并解析本次请求的body体。 参数形式如…

中职组网络安全B模块-渗透提权2

任务五:渗透提权2 任务环境说明: 仅能获取xxx的IP地址 用户名:test,密码:123456 访问服务器主机,找到主机中管理员名称,将管理员名称作为Flag值提交; Flag:doyoudoyoudo 访问服…

Hadoop学习笔记:运行wordcount对文件字符串进行统计案例

文/朱季谦 我最近使用四台Centos虚拟机搭建了一套分布式hadoop环境,简单模拟了线上上的hadoop真实分布式集群,主要用于业余学习大数据相关体系。 其中,一台服务器作为NameNode,一台作为Secondary NameNode,剩下两台当…

[数据结构]-AVL树

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、AVL树基…

VR全景:赋能城市园区建设,打造3DVR城市名片

近年来,很多城市都在大力发展数字化经济建设,以VR全景技术赋能现代化城市和园区建设,为城市园区展示带来了全新的可能性。借助3D、VR技术把现实城市和园区搬到互联网上进行全方位展示,将城市园区的形象、景观、规划布局等1&#x…

2023年亚太地区数学建模大赛 问题B

玻璃温室中的微气候法规 温室作物的产量受到各种气候因素的影响,包括温度、湿度和风速[1]。其中,适宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气候因素,温室的设计通常采用带有温室风扇的通风系统,如…

从零开始的c语言日记day36——指针进阶

一、什么是指针: 指针的概念:1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 ⒉指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的-整数的步长,指针解引用操作的时候的权限。…

mysql中数据是如何被用B+树查询到的

innoDB是按照页为单位读写的 那页中有很多行数据,是怎么执行查询的呢,首先我们肯定,是以单向列表形式存储的,提高了增删的效率,但是查询效率低。所以实际上对页中的行数据进行了优化,能以二分的方式进行查…

FeignClient相关调用逻辑

https://www.cnblogs.com/chiangchou/p/feign.html#_label3_2

安卓隐私指示器学习笔记

最近了解到Google 在Android12上新增了权限指示器,可以在信号栏的右侧显示当前访问录音机和Camera的应用,点击后可以跳转到相应应用的权限界面,消费者可以控制权限的开启和关闭。国内手机厂商最近几年都在增加隐私看板供能,消费者…

【css】Google第三方登录按钮样式修改

文章目录 场景前置准备修改样式官方属性修改样式CSS修改样式按钮的高度height和border-radiusLogo和文字布局 场景 需要用到谷歌的第三方登录,登录按钮有自己的样式。根据官方文档:概览 | Authentication | Google for Developers,提供两种第…

Spark的通用运行流程与Spark YARN Cluster 模式的运行流程

Spark的通用运行流程 集群启动后Worker节点会向Master节点心跳汇报资源Client向Driver提交APP,根据不同的运行模式在不同的地方创建Driver。Driver以粗粒度的方式向Master注册应用并申请资源(在Application执行之前,将所有的资源申请完毕&…

创作4周年

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言机…

C语言指针相关练习题

​ C语言指针相关练习题 文章目录 C语言指针相关练习题题目一题目二题目三题目四题目五题目六题目七 题目一 #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; }…

使用Python画一棵树

&#x1f38a;专栏【不单调的代码】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f339;Turtle模块&#x1f384;效果&#x1f33a;代码&#x1f6f8;代码…

城市生命线丨桥梁健康结构监测系统作用如何

截至2022年底&#xff0c;我国拥有公路桥梁103.3万座&#xff0c;总长约8576万延米&#xff0c;其中特大桥8816座&#xff0c;总长约1621万延米。 为了确保这些桥梁的安全&#xff0c;需要进行定期的检测和维护&#xff0c;及时发现和解决桥梁存在的问题。 同时&#xff0c;政…

杭电oj 2064 汉诺塔III

#include <stdio.h>void main() {int n, i;long long sum[35] { 2,8,26 };for (i 3; i < 35; i)sum[i] 3 * sum[i - 1] 2;while (~scanf_s("%d", &n))printf("%lld\n", sum[n - 1]); }

9.4 Windows驱动开发:内核PE结构VA与FOA转换

本章将继续探索内核中解析PE文件的相关内容&#xff0c;PE文件中FOA与VA,RVA之间的转换也是很重要的&#xff0c;所谓的FOA是文件中的地址&#xff0c;VA则是内存装入后的虚拟地址&#xff0c;RVA是内存基址与当前地址的相对偏移&#xff0c;本章还是需要用到《内核解析PE结构导…

带记忆的超级GPT智能体,能做饭、煮咖啡、整理家务!

随着AI技术的快速迭代&#xff0c;Alexa、Siri、小度、天猫精灵等语音助手得到了广泛应用。但在自然语言理解和完成复杂任务方面仍然有限。 相比文本的标准格式&#xff0c;语音充满复杂性和多样性&#xff08;例如&#xff0c;地方话&#xff09;,传统方法很难适应不同用户的…

NX二次开发UF_CAM_PREPRO_mark_model_as_cam 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREPRO_mark_model_as_cam Defined in: uf_cam_prepro.h int UF_CAM_PREPRO_mark_model_as_cam(tag_t model ) overview 概述 This function will mark the facet model as…