云其它

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > 云其它 > Kubernetes部署高可用MinIO集群

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

作者:princeAladdin

文章介绍了MinIO的分布式架构及其在开发测试和生产环境中的应用,重点讲解了分布式集群模式的核心组件和部署步骤,并通过验证集群状态来确保服务的高可用性和可靠性

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

部署模式对比

单节点模式

适用场景:开发测试环境

特点

分布式集群模式

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

特点

集群关键组件

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

三、验证集群状态

~]# 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

总结

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

您可能感兴趣的文章:
阅读全文