跳到主要内容

K3s 与 MinIO 集成方案

概述

本方案详细介绍了如何在 K3s 集群中集成 MinIO 作为持久化存储后端,通过 S3 兼容接口实现数据的外部存储,提升数据可靠性和可扩展性。

目录

  1. 集成优势
  2. 架构设计
  3. 前置条件
  4. 部署步骤
  5. 验证方案
  6. 最佳实践
  7. 故障排除

1. 集成优势

将 MinIO 作为 K3s 集群的存储后端具有以下优势:

  1. 高可用性: MinIO 集群提供企业级的高可用性和数据冗余
  2. 扩展性: 可以轻松水平扩展存储容量和性能
  3. 成本效益: 使用标准硬件构建分布式存储,比传统 SAN 存储更经济
  4. S3 兼容性: 完全兼容 Amazon S3 API,可与广泛的工具和应用集成
  5. 统一存储: 可以为多个应用提供对象存储服务
  6. 数据保护: 提供版本控制、生命周期管理等高级数据保护功能

2. 架构设计

3. 前置条件

  1. 已部署 K3s 集群
  2. 已部署 MinIO 集群(参考 MinIO 集群高可用部署方案
  3. MinIO 集群可通过 K3s 集群访问(IP: 192.168.192.115:9000)
  4. 具备集群管理员权限
  5. 已安装 Helm 3.0+

4. 部署步骤

4.1 部署 MinIO CSI Driver

  1. 添加 MinIO CSI Driver Helm 仓库:
helm repo add minio-csi https://minio-csi.github.io/charts
helm repo update
  1. 创建 MinIO CSI Driver 命名空间:
kubectl create namespace minio-csi
  1. 创建 MinIO 访问密钥 Secret:
kubectl create secret generic minio-csi-secret \
--namespace minio-csi \
--from-literal=accessKey="minioadmin" \
--from-literal=secretKey="minioadmin123"
  1. 部署 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"
  1. 验证部署状态:
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 验证数据持久化

  1. 进入测试容器并创建文件:
kubectl exec -it minio-test-pod -- /bin/bash
echo "Hello MinIO CSI" > /usr/share/nginx/html/test.txt
exit
  1. 删除并重新创建 Pod:
kubectl delete pod minio-test-pod
kubectl apply -f test-app.yaml
  1. 验证数据是否持久化:
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 安全配置

  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
  1. 使用 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 性能优化

  1. 根据应用需求调整存储配置:
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
  1. 为大文件传输优化配置:
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 备份与恢复

  1. 定期备份重要数据:
# 创建备份脚本
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 常见问题

  1. PVC 无法绑定

    • 检查 StorageClass 是否正确配置
    • 验证 MinIO 服务是否可访问
    • 确认访问凭证是否正确
  2. Pod 无法启动

    • 检查 CSI Driver 是否正常运行
    • 查看 Pod 事件日志:kubectl describe pod <pod-name>
    • 验证存储桶是否存在且可访问
  3. 性能问题

    • 检查网络连接质量
    • 确认 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 监控与告警

  1. 配置 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