在Kubernetes上部署高可用MinIO集群方式
一、MinIO分布式架構(gòu)核心概念
部署模式對(duì)比
單節(jié)點(diǎn)模式
適用場景:開發(fā)測試環(huán)境
特點(diǎn):
- 僅部署單個(gè)節(jié)點(diǎn),資源消耗低,部署簡單。
- 無數(shù)據(jù)冗余,硬件故障可能導(dǎo)致數(shù)據(jù)丟失,可靠性較差。
- 適合功能驗(yàn)證、性能測試等非生產(chǎn)場景。
分布式集群模式
適用場景:生產(chǎn)環(huán)境(推薦)
特點(diǎn):
- 數(shù)據(jù)分片存儲(chǔ),支持橫向擴(kuò)展,提升吞吐量和存儲(chǔ)容量。
- 采用糾刪碼(Erasure Coding)或多副本機(jī)制,確保數(shù)據(jù)高可用。
- 節(jié)點(diǎn)故障自動(dòng)恢復(fù),服務(wù)連續(xù)性高,適合關(guān)鍵業(yè)務(wù)場景。
集群關(guān)鍵組件
MinIO Server節(jié)點(diǎn):4節(jié)點(diǎn)起(推薦偶數(shù)節(jié)點(diǎn))
持久化存儲(chǔ):每個(gè)節(jié)點(diǎn)獨(dú)立PV
網(wǎng)關(guān)服務(wù):通過Service暴露統(tǒng)一入口
二、Kubernetes部署全流程
步驟1:創(chuàng)建命名空間
~]# 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:創(chuàng)建 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
三、驗(yàn)證集群狀態(tài)
- 檢查Pod運(yùn)行
~]# 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
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
K8S中設(shè)置JVM堆棧大小實(shí)現(xiàn)方式
這篇文章主要介紹了K8S中設(shè)置JVM堆棧大小實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
Kubernetes集群中Calico網(wǎng)絡(luò)插件報(bào)錯(cuò)問題分析及解決過程
Kubernetes集群中Calico網(wǎng)絡(luò)插件報(bào)錯(cuò)(如FailedCreatePodSandBox)通常由配置錯(cuò)誤、RBAC權(quán)限缺失或組件故障導(dǎo)致,解決方法包括重啟Calico組件、驗(yàn)證配置和權(quán)限,定期監(jiān)控與維護(hù)以確保網(wǎng)絡(luò)正常運(yùn)行2025-10-10
Podman開機(jī)自啟容器實(shí)現(xiàn)過程及與Docker對(duì)比
這篇文章主要為大家介紹了Podman開機(jī)自啟容器實(shí)現(xiàn)過程,通過示例代碼的形式進(jìn)行演繹過程,有需要的朋友可以參考下,希望可以有所幫助2021-09-09
tkestack/gpu-manager在k8s1.23版本之后的使用方法
這篇文章主要介紹了tkestack/gpu-manager在k8s1.23版本之后的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04

