K3s 与 MinIO 集成方案
概述
本方案详细介绍了如何在 K3s 集群中集成 MinIO 作为持久化存储后端,通过 S3 兼容接口实现数据的外部存储,提升数据可靠性和可扩展性。
目录
1. 集成优势
将 MinIO 作为 K3s 集群的存储后端具有以下优势:
- 高可用性: MinIO 集群提供企业级的高可用性和数据冗余
- 扩展性: 可以轻松水平扩展存储容量和性能
- 成本效益: 使用标准硬件构建分布式存储,比传统 SAN 存储更经济
- S3 兼容性: 完全兼容 Amazon S3 API,可与广泛的工具和应用集成
- 统一存储: 可以为多个应用提供对象存储服务
- 数据保护: 提供版本控制、生命周期管理等高级数据保护功能
2. 架构设计
3. 前置条件
- 已部 署 K3s 集群
- 已部署 MinIO 集群(参考 MinIO 集群高可用部署方案)
- MinIO 集群可通过 K3s 集群访问(IP: 192.168.192.115:9000)
- 具备集群管理员权限
- 已安装 Helm 3.0+
4. 部署步骤
4.1 部署 MinIO CSI Driver
- 添加 MinIO CSI Driver Helm 仓库:
helm repo add minio-csi https://minio-csi.github.io/charts
helm repo update
- 创建 MinIO CSI Driver 命名空间:
kubectl create namespace minio-csi
- 创建 MinIO 访问密钥 Secret:
kubectl create secret generic minio-csi-secret \
--namespace minio-csi \
--from-literal=accessKey="minioadmin" \
--from-literal=secretKey="minioadmin123"
- 部署 MinIO CSI Driver:
helm install minio-csi minio-csi/minio-csi \
--namespace minio-csi \
--set minio.endpoint="http://192.168.192.115:9000" \
--set minio.secretRef="minio-csi-secret" \
--set minio.defaultBucket.enabled=true \
--set minio.defaultBucket.name="k3s-csi-bucket"
- 验证部署状态:
kubectl get pods -n minio-csi
kubectl get csidrivers
4.2 配置 StorageClass
创建 MinIO StorageClass 配置文件 minio-storageclass.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minio-csi
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: min.io/csi
parameters:
endpoint: "http://192.168.192.115:9000"
accessKey: "minioadmin"
secretKey: "minioadmin123"
bucket: "k3s-csi-bucket"
region: "us-east-1"
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
应用配置:
kubectl apply -f minio-storageclass.yaml
验证 StorageClass:
kubectl get storageclass
4.3 创建 PersistentVolumeClaim
创建 PVC 配置文件 minio-pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minio-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: minio-csi
应用配置:
kubectl apply -f minio-pvc.yaml
验证 PVC 状态:
kubectl get pvc
kubectl describe pvc minio-pvc
5. 验证方案
5.1 部署测试应用
创建测试应用配置文件 test-app.yaml:
apiVersion: v1
kind: Pod
metadata:
name: minio-test-pod
namespace: default
spec:
containers:
- name: test-container
image: nginx:latest
volumeMounts:
- name: minio-storage
mountPath: /usr/share/nginx/html
volumes:
- name: minio-storage
persistentVolumeClaim:
claimName: minio-pvc
部署测试应用:
kubectl apply -f test-app.yaml
5.2 验证数据持久化
- 进入测试容器并创建文件:
kubectl exec -it minio-test-pod -- /bin/bash
echo "Hello MinIO CSI" > /usr/share/nginx/html/test.txt
exit
- 删除并重新创建 Pod:
kubectl delete pod minio-test-pod
kubectl apply -f test-app.yaml
- 验证数据是否持久化:
kubectl exec -it minio-test-pod -- cat /usr/share/nginx/html/test.txt
5.3 验证 MinIO 存储
在 MinIO 中检查存储桶内容:
mc ls minio/k3s-csi-bucket
6. 最佳实践
6.1 安全配置
- 为不同应用创建独立的 MinIO 用户和存储桶:
# 在 MinIO 中创建专用用户
mc admin user add minio k3s-user k3s-password123
# 创建专用存储桶
mc mb minio/k3s-app-data
# 分配访问策略
mc admin policy attach minio readwrite --user k3s-user
- 使用 Kubernetes Secret 管理凭证:
apiVersion: v1
kind: Secret
metadata:
name: minio-app-secret
type: Opaque
data:
accessKey: azMtc2VydmVy # base64 编码的 "k3s-server"
secretKey: azMtcGFzc3dvcmQxMjM= # base64 编码的 "k3s-password123"
6.2 性能优化
- 根据应用需求调整存储配置:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minio-csi-high-performance
provisioner: min.io/csi
parameters:
endpoint: "http://192.168.192.115:9000"
accessKey: "minioadmin"
secretKey: "minioadmin123"
bucket: "k3s-high-perf-bucket"
region: "us-east-1"
# 启用版本控制
versioning: "true"
reclaimPolicy: Retain
volumeBindingMode: Immediate
- 为大文件传输优化配置:
apiVersion: v1
kind: Pod
metadata:
name: minio-large-file-pod
spec:
containers:
- name: app-container
image: your-app:latest
env:
- name: AWS_MAX_MEMORY_UPLOAD_SIZE
value: "5GB"
volumeMounts:
- name: minio-storage
mountPath: /data
volumes:
- name: minio-storage
persistentVolumeClaim:
claimName: minio-pvc
6.3 备份与恢复
- 定期备份重要数据:
# 创建备份脚本
cat <<EOF > backup-minio.sh
#!/bin/bash
DATE=\$(date +%Y%m%d-%H%M%S)
mc cp --recursive minio/k3s-csi-bucket minio/backups/k3s-csi-bucket-\$DATE
EOF
# 创建定时任务
cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: CronJob
metadata:
name: minio-backup
namespace: minio-csi
spec:
schedule: "0 2 * * *" # 每天凌晨2点执行
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: minio/mc
command:
- /bin/sh
- -c
- mc cp --recursive minio/k3s-csi-bucket minio/backups/k3s-csi-bucket-\$(date +%Y%m%d-%H%M%S)
env:
- name: MC_HOST_minio
value: "http://minioadmin:minioadmin123@192.168.192.115:9000"
restartPolicy: OnFailure
EOF
7. 故障排除
7.1 常见问题
-
PVC 无法绑定:
- 检查 StorageClass 是否正确配置
- 验证 MinIO 服务是否可访问
- 确认访问凭证是否正确
-
Pod 无法启动:
- 检查 CSI Driver 是否正常运行
- 查看 Pod 事件日志:
kubectl describe pod <pod-name> - 验证存储桶是否存在且可访问
-
性能问题:
- 检查网络连接质量
- 确认 MinIO 集群状态
- 调整应用的存储访问模式
7.2 诊断命令
# 检查 CSI Driver 状态
kubectl get csidrivers
kubectl get csinodes
# 查看 CSI Driver 日志
kubectl logs -n minio-csi -l app=minio-csi
# 检查 PVC 状态
kubectl get pvc
kubectl describe pvc <pvc-name>
# 检查 PV 状态
kubectl get pv
kubectl describe pv <pv-name>
7.3 监控与告警
- 配置 Prometheus 监控:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: minio-csi-monitor
namespace: minio-csi
spec:
selector:
matchLabels:
app: minio-csi
endpoints:
- port: metrics
interval: 30s