在Kubernetes上部署高可用MinIO集群方式

 更新时间:2025年11月19日 14:19:12   作者:princeAladdin  
文章介绍了MinIO的分布式架构及其在开发测试和生产环境中的应用,重点讲解了分布式集群模式的核心组件和部署步骤,并通过验证集群状态来确保服务的高可用性和可靠性

一、MinIO分布式架构核心概念

部署模式对比

单节点模式

适用场景:开发测试环境

特点

  • 仅部署单个节点,资源消耗低,部署简单。
  • 无数据冗余,硬件故障可能导致数据丢失,可靠性较差。
  • 适合功能验证、性能测试等非生产场景。

分布式集群模式

适用场景:生产环境(推荐)

特点

  • 数据分片存储,支持横向扩展,提升吞吐量和存储容量。
  • 采用纠删码(Erasure Coding)或多副本机制,确保数据高可用。
  • 节点故障自动恢复,服务连续性高,适合关键业务场景。

集群关键组件

MinIO Server节点:4节点起(推荐偶数节点)

持久化存储:每个节点独立PV

网关服务:通过Service暴露统一入口

二、Kubernetes部署全流程

步骤1:创建命名空间

~]# kubectl create ns minio

步骤2:配置Secrets(访问密钥)

~]# kubectl create secret generic minio-creds \
  --namespace minio \
  --from-literal=MINIO_ROOT_USER=admin \
  --from-literal=MINIO_ROOT_PASSWORD=admin123

步骤3:创建 Service

LoadBalancer 类型

~]# vi minio-service.yaml
kind: Service
apiVersion: v1
metadata:
  name: minio
  namespace: minio
spec:
  selector:
    app: minio
  type: LoadBalancer
  ports:
    - name: minio
      port: 9000
    - name: console
      port: 9001

步骤4:部署StatefulSet(核心)

~]# vi minio-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio
  namespace: minio
spec:
  serviceName: "minio"
  replicas: 4
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
        directpv.min.io/organization: minio
        directpv.min.io/app: minio-example
    spec:
      containers:
      - name: minio
        image: quay.io/minio/minio:RELEASE.2025-04-08T15-41-24Z
        imagePullPolicy: Always
        env:
        - name: MINIO_ROOT_USER
          valueFrom:
            secretKeyRef:
              name: minio-creds
              key: MINIO_ROOT_USER
        - name: MINIO_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: minio-creds
              key: MINIO_ROOT_PASSWORD
        - name: MINIO_CONSOLE_ADDRESS
          value: ":9001"
        volumeMounts:
        - name: minio-data
          mountPath: /data
        args:
        - "server"
        - "http://minio-{0...3}.minio.default.svc.cluster.local:9000/data"
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - minio
            topologyKey: "kubernetes.io/hostname"
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: minio-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi
      storageClassName: standard

步骤5:暴露外部访问(Ingress)

~]# vi minio-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minio-ingress
  namespace: minio
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
spec:
  rules:
  - host: minio.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: minio
            port:
              number: 9000

三、验证集群状态

  • 检查Pod运行
~]# kubectl get po -n minio
NAME      READY   STATUS    RESTARTS   AGE
minio-0   1/1     Running   0          55s
minio-1   1/1     Running   0          45s
minio-2   1/1     Running   0          35s
minio-3   1/1     Running   0          25s

~]# kubectl get pvc -n minio
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
minio-data-minio-0   Bound    pvc-881730c2-b10c-4285-a1d6-9024482e23ac   10Gi       RWO            standard       <unset>                 92s
minio-data-minio-1   Bound    pvc-f467c8e6-576f-49d1-a1e7-2c4db046b6e1   10Gi       RWO            standard       <unset>                 82s
minio-data-minio-2   Bound    pvc-a83706fc-f9c5-433e-ba6b-0d0b27382676   10Gi       RWO            standard       <unset>                 72s
minio-data-minio-3   Bound    pvc-65415c6d-08ae-480e-aff7-b9a22f3f4b3b   10Gi       RWO            standard       <unset>                 62s

~]# kubectl get pv -n minio
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-65415c6d-08ae-480e-aff7-b9a22f3f4b3b   10Gi       RWO            Delete           Bound    minio/minio-data-minio-3   standard       <unset>                          66s
pvc-881730c2-b10c-4285-a1d6-9024482e23ac   10Gi       RWO            Delete           Bound    minio/minio-data-minio-0   standard       <unset>                          96s
pvc-a83706fc-f9c5-433e-ba6b-0d0b27382676   10Gi       RWO            Delete           Bound    minio/minio-data-minio-2   standard       <unset>                          75s
pvc-f467c8e6-576f-49d1-a1e7-2c4db046b6e1   10Gi       RWO            Delete           Bound    minio/minio-data-minio-1   standard       <unset>                          85s

~]# kubectl get svc -n minio
NAME    TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                         AGE
minio   LoadBalancer   10.105.136.9   172.19.0.200   9000:30876/TCP,9001:31775/TCP   2m33s

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k8s之容器内存与JVM内存解读

    k8s之容器内存与JVM内存解读

    这篇文章主要介绍了k8s之容器内存与JVM内存,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • K8S中设置JVM堆栈大小实现方式

    K8S中设置JVM堆栈大小实现方式

    这篇文章主要介绍了K8S中设置JVM堆栈大小实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • 新版k8s拉取镜像失败问题解决办法

    新版k8s拉取镜像失败问题解决办法

    随着Kubernetes 1.23版本的发布,Docker作为默认容器运行时被弃用,转而默认采用Containerd,这一改变意味着用户在使用Kubernetes时,将不再通过Docker来拉取镜像,文中jiang,需要的朋友可以参考下
    2024-10-10
  • k8s证书有效期时间修改的方法详解

    k8s证书有效期时间修改的方法详解

    K8S集群有证书的概念,之前一直是使用默认的,默认都是1年和10年的,1年有效期这显然对于生产环境是不合适的,下面这篇文章主要给大家介绍了关于k8s证书有效期时间修改的相关资料,需要的朋友可以参考下
    2022-08-08
  • Kubernetes集群中Calico网络插件报错问题分析及解决过程

    Kubernetes集群中Calico网络插件报错问题分析及解决过程

    Kubernetes集群中Calico网络插件报错(如FailedCreatePodSandBox)通常由配置错误、RBAC权限缺失或组件故障导致,解决方法包括重启Calico组件、验证配置和权限,定期监控与维护以确保网络正常运行
    2025-10-10
  • k8s admin用户生成token方式

    k8s admin用户生成token方式

    用户使用Kubernetes 1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其token,最后检查token是否存在及生效情况
    2025-09-09
  • CentOS 7下YUM 本地仓库的搭建详细步骤

    CentOS 7下YUM 本地仓库的搭建详细步骤

    这篇文章主要介绍了CentOS 7下YUM 本地仓库的搭建详细步骤的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下
    2017-09-09
  • Podman开机自启容器实现过程及与Docker对比

    Podman开机自启容器实现过程及与Docker对比

    这篇文章主要为大家介绍了Podman开机自启容器实现过程,通过示例代码的形式进行演绎过程,有需要的朋友可以参考下,希望可以有所帮助
    2021-09-09
  • k8s的架构组成操作代码

    k8s的架构组成操作代码

    k8s是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务,通过k8s能够进行应用的自动化部署和扩缩容,这篇文章主要介绍了k8s的架构组成,需要的朋友可以参考下
    2024-05-05
  • tkestack/gpu-manager在k8s1.23版本之后的使用方法

    tkestack/gpu-manager在k8s1.23版本之后的使用方法

    这篇文章主要介绍了tkestack/gpu-manager在k8s1.23版本之后的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论