minio集群部署(k8s内)

本文详细描述了如何使用Minio集群进行多节点多磁盘部署,涉及创建PersistentVolume、StatefulSet,以及NFS存储的配置。文中强调了高可用性,如在不同节点存活数下的读写权限,以及如何通过ErasureCode实现数据冗余和容错。还介绍了节点对等扩容的步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

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

### Kubernetes (k8s) 部署 MinIO 分布式存储集群的最佳实践 #### 1. 架构设计 为了实现 k8s 使用独立部署MinIO 分布式集群作为其配置文件和其他文件的存储介质,需确保 MinIOk8s 的网络互通。MinIO 是一种高性能的对象存储解决方案,支持 Amazon S3 API 兼容接口[^2]。因此,在架构层面应考虑以下几点: - **高可用性**:通过多节点分布式部署提升数据冗余和可靠性。 - **性能优化**:利用本地磁盘或高速 NVMe 存储来提高读写效率。 - **安全性**:启用 TLS 加密通信并设置访问控制策略。 #### 2. 准备工作 在正式部署之前,需要完成如下准备工作: - 确保每台运行 MinIO 节点的服务器已安装 Docker 或其他容器化环境。 - 下载官方提供的 Helm Chart 文件用于简化安装过程。 - 创建必要的 Secret 对象保存认证凭证(如 Access Key 和 Secret Key)以便后续调用时验证身份合法性[^1]。 #### 3. 配置说明 以下是具体实施步骤中的几个重要环节: ##### a. 设置持久卷(PV) 由于 MinIO 数据量较大且频繁变动,建议为其分配专用 PV 并绑定到实际物理设备上以保障长期稳定运作。可以通过 YAML 文件定义这些资源属性,例如大小、访问模式等参数: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: minio-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi ``` ##### b. 自定义 Values File Helm 提供了一种灵活的方式允许用户自定义图表行为,即通过 values.yaml 文件传递个性化选项给模板引擎处理后再生成最终产物。对于本场景而言可能涉及的内容有端口映射关系调整、副本数量指定以及额外环境变量注入等方面的操作: ```yaml replicaCount: 4 # 根据实际情况修改为适合当前硬件条件下的理想值 resources: limits: cpu: "2" memory: 4Gi service: type: NodePort # 如果外部可以直接访问则改为 LoadBalancer 类型更方便管理维护 securityContext: runAsUser: 1000 persistence: enabled: true size: 50Gi env: - name: MINIO_VOLUMES value: "/data/" ``` ##### c. 执行命令启动服务实例群组 最后一步就是运用上述准备好的资料组合起来执行自动化脚本来快速搭建整个系统框架结构了。下面展示了一个典型例子演示如何借助 CLI 工具一键搞定全部流程操作: ```bash helm install my-minio ./charts/minio --values custom-values.yaml ``` #### 4. 测试连接功能正常与否 当所有组件都成功上线之后就可以尝试发起请求检验是否能够顺利交互啦!可以采用 curl 命令模拟客户端发送 HTTP GET 请求获取某个特定路径下是否存在目标对象文件之类的简单测试方法来进行初步判断。 --- ### 总结 综上所述,按照以上描述的方法论去规划布局再加上细致入微地调试校验就能达成预期效果——让 Kubernetes 成功对接远程托管着海量静态资产素材库的 MinIO Server 实现资源共享最大化的目的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值