在 Kubernetes 中使用 MinIO 作为存储类(StorageClass),可以通过以下两种主流方案实现动态存储供给:
方案一:使用 MinIO CSI 驱动(推荐生产环境)
1. 安装 MinIO CSI 驱动
`bash
添加 Helm 仓库
helm repo add minio-csi https://minio.github.io/csi-driver
helm repo update
安装驱动(替换以下参数)
helm install minio-csi minio-csi/minio-csi \
--namespace kube-system \
--set accessKeyID=MINIOACCESSKEY \
--set secretAccessKey=MINIOSECRETKEY \
--set endpoints=https://minio.example.com \
--set storageClass.name=minio-csi \
--set storageClass.defaultClass=true
`
2. 验证安装
`bash
检查 CSI 驱动 Pod
kubectl get pods -n kube-system -l app.kubernetes.io/name=minio-csi
查看 StorageClass
kubectl get storageclass minio-csi -o yaml
`
3. 创建 PVC 测试
`yaml
minio-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minio-test-pvc
spec:
storageClassName: minio-csi
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
`
方案二:使用 S3FS Provisioner(兼容 S3 协议)
1. 安装 S3FS Provisioner
bash
helm install s3fs-provisioner \
https://charts.kubesphere.io/main/s3fs-provisioner-1.3.0.tgz \
--namespace kube-system \
--set accessKeyID=MINIO_ACCESS_KEY \
--set secretAccessKey=MINIO_SECRET_KEY \
--set endpoint=https://minio.example.com \
--set storageClass.name=minio-s3 \
--set storageClass.defaultClass=false
2. 创建自定义 StorageClass
`yaml
minio-s3-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minio-s3
provisioner: cluster.local/s3fs-provisioner
parameters:
bucket: "my-k8s-bucket" # 需先在MinIO创建的桶
endpoint: "https://minio.example.com"
path: "/k8s-pv"
otherOpts: "-o usepathrequest_style -o umask=0022"
reclaimPolicy: Retain
volumeBindingMode: Immediate
`
关键配置说明
| 参数 | CSI 驱动方案 | S3FS 方案 |
| -------------- | ------------------ | ----------------- |
| 协议支持 | CSI 标准接口 | S3/FUSE 兼容 |
| 动态扩容 | ✅ 支持 | ❌ 不支持 |
| 性能 | ⭐️⭐️⭐️ (直接挂载) | ⭐️⭐️ (FUSE 层转换) |
| 多租户隔离 | 通过K8s RBAC控制 | 依赖MinIO桶策略 |
| 适用场景 | 生产环境持久化存储 | 开发测试/临时存储 |
生产环境优化建议
- MinIO 服务器配置
bash
# 分布式MinIO部署(4节点示例)
helm install minio minio/minio \
--set mode=distributed \
--set persistence.size=10Ti \
--set resources.requests.memory=8Gi \
--set accessKey=MINIO_ROOT_USER \
--set secretKey=MINIO_ROOT_PASSWORD
- 网络策略
`yaml
# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: minio-csi-access
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: minio-csi
ingress:- from:
- podSelector:
matchLabels:
app: data-intensive-app
`
- podSelector:
- from:
- 监控告警
yaml
# 启用Prometheus监控
metrics:
enabled: true
serviceMonitor:
enabled: true
interval: 30s
故障排查命令
`bash
查看CSI驱动日志
kubectl logs -n kube-system -l app.kubernetes.io/name=minio-csi -c minio-csi
测试MinIO连接性
kubectl run -it --rm --image=minio/mc test -- \
mc alias set minio https://minio.example.com $MINIOACCESSKEY $MINIOSECRETKEY --api S3v4 && \
mc admin info minio
检查PVC绑定事件
kubectl get events --field-selector involvedObject.name=minio-test-pvc
`
注意事项
- 访问密钥管理:
- 使用K8s Secret存储凭证
bash
kubectl create secret generic minio-creds \
--from-literal=accesskey=$MINIO_ACCESS_KEY \
--from-literal=secretkey=$MINIO_SECRET_KEY
- 使用K8s Secret存储凭证
- 版本兼容性:
- MinIO Server ≥ RELEASE.2023-08-29T23-54-05Z
- Kubernetes ≥ v1.21
- 性能调优:
`yaml
# values-csi-tuning.yaml
args:- "--fuse-max-idle=30"
- "--fuse-mount-timeout=5m"
resources:
limits:
cpu: 2
memory: 2Gi
`
根据实际需求选择方案,生产环境推荐CSI驱动方案,可获得更好的性能和稳定性。
欢迎来撩 : 汇总all