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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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节点集群,关于数据会随机分配到两部分节点上存储,可以自行做实验验证

相关推荐
喵叔哟26 分钟前
19.服务集成与通信
后端·docker·容器·服务发现
Ice星空1 小时前
Docker 镜像创建和管理以及 buildx 交叉编译
运维·docker·容器
飞翔沫沫情1 小时前
OpenEuler 发行版 二进制部署docker
docker·openeuler·容器引擎
Cyber4K1 小时前
【Kubernetes专项】Docker 容器部署及基本用法
运维·docker·云原生·容器
techzhi1 小时前
Docker 多架构镜像构建方案实施指南
docker·架构
暴躁的鱼2 小时前
docker运行可登录的gerrit容器
运维·docker·容器
Joren的学习记录2 小时前
【Linux运维大神系列】Kubernetes详解2(kubeadm部署k8s1.27单节点集群)
linux·运维·kubernetes
赵文宇(温玉)2 小时前
Docker与VM的差异与最佳场景
docker·容器·eureka
lbb 小魔仙2 小时前
【Linux】K8s 集群搭建避坑指南:基于 Linux 内核参数调优的生产级部署方案
linux·运维·kubernetes
techzhi2 小时前
docker compose和docker-compose的区别
运维·docker·容器