8.2 KiB
8.2 KiB
JuiceFS + MinIO + PostgreSQL 部署指南
架构
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes 集群 │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ JuiceFS CSI Driver │ │
│ │ (StorageClass: juicefs-sc) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ rcoder 主服务 │ │ Agent Runner │ │
│ │ Pod (Deployment)│ │ Pod (动态创建) │ │
│ └────────┬───────┘ └────────┬───────┘ │
│ │ │ │
│ └──────────┬───────────┘ │
│ ↓ │
│ ┌──────────────┐ │
│ │ JuiceFS 卷 │ ← 共享文件系统 (RWX) │
│ └───────┬──────┘ │
└──────────────────────┼────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────┐
│ MinIO (S3) ←──── 数据存储 │
│ PostgreSQL ← 元数据存储 │
└───────────────────────────────────────────────────────────────┘
文件结构
manifests/
├── 00-namespace.yaml # Namespace
├── 01-storage/ # 存储层
│ ├── postgresql-deployment.yaml
│ ├── minio-deployment.yaml
│ ├── minio-init-job.yaml
│ ├── juicefs-secret.yaml
│ ├── juicefs-storageclass.yaml
│ └── juicefs-pvc.yaml
├── 02-rcoder/ # 应用层
│ ├── serviceaccount.yaml
│ ├── rcoder-configmap.yaml
│ ├── rcoder-deployment.yaml
│ ├── rcoder-service.yaml
│ ├── rcoder-networkpolicy.yaml
│ └── rcoder-pdb.yaml
└── _deprecated/nfs/ # 废弃的 NFS 配置
部署顺序
第一步:部署 JuiceFS CSI Driver
# 使用 Helm 部署
helm repo add juicefs https://juicefs.github.io/charts
helm repo update
helm install juicefs-csi-driver juicefs/juicefs-csi-driver \
--namespace kube-system \
--set webhook.enabled=false \
--set csiSidecarImage.registry=docker.io \
--set csiSidecarImage.repository=juicedata/csi-sidecar \
--set csiSidecarImage.tag=v1.3.8 \
--set image.registry=docker.io \
--set image.repository=juicedata/juicefs-csi-driver \
--set image.tag=v1.1.0 \
--set nodeDaemonImage.registry=docker.io \
--set nodeDaemonImage.repository=juicedata/juicefs-csi-driver \
--set nodeDaemonImage.tag=v1.1.0
验证:
kubectl get pods -n kube-system | grep juicefs
# 预期:juicefs-csi-driver-xxx 运行正常
第二步:部署 PostgreSQL
kubectl apply -f manifests/01-storage/postgresql-deployment.yaml
验证:
kubectl get pods -n nuwax-rcoder | grep postgresql
kubectl logs -n nuwax-rcoder -l app=postgresql --tail=50
第三步:部署 MinIO
kubectl apply -f manifests/01-storage/minio-deployment.yaml
验证:
kubectl get pods -n nuwax-rcoder | grep minio
# 访问 MinIO Console: http://<minio-ip>:9001
第四步:初始化 MinIO Bucket
kubectl apply -f manifests/01-storage/minio-init-job.yaml
# 等待完成
kubectl wait --for=condition=complete job/minio-init -n nuwax-rcoder --timeout=120s
# 验证
kubectl exec -it -n nuwax-rcoder deploy/minio -- mc ls myminio/
第五步:创建 JuiceFS Secret
kubectl apply -f manifests/01-storage/juicefs-secret.yaml
第六步:创建 JuiceFS StorageClass
kubectl apply -f manifests/01-storage/juicefs-storageclass.yaml
验证:
kubectl get sc | grep juicefs
第七步:部署 RCoder 相关资源
# 部署 rcoder PVC (使用 JuiceFS)
kubectl apply -f manifests/01-storage/juicefs-pvc.yaml
# 验证 PVC
kubectl get pvc -n nuwax-rcoder
# 状态应为 Bound
# 部署其他 rcoder 资源
kubectl apply -f manifests/00-namespace.yaml
kubectl apply -f manifests/02-rcoder/serviceaccount.yaml
kubectl apply -f manifests/02-rcoder/rcoder-configmap.yaml
kubectl apply -f manifests/02-rcoder/rcoder-deployment.yaml
kubectl apply -f manifests/02-rcoder/rcoder-service.yaml
kubectl apply -f manifests/02-rcoder/rcoder-networkpolicy.yaml
kubectl apply -f manifests/02-rcoder/rcoder-pdb.yaml
第八步:验证整个系统
# 检查所有 Pod
kubectl get pods -n nuwax-rcoder
# 查看 JuiceFS 挂载情况
kubectl exec -it -n nuwax-rcoder deploy/rcoder -- df -h | grep juicefs
# 测试写入
kubectl exec -it -n nuwax-rcoder deploy/rcoder -- sh -c "echo 'test' > /app/project_workspace/test.txt"
# 查看日志
kubectl logs -n nuwax-rcoder -l app=rcoder --tail=50
存储结构
部署后,数据存储结构如下:
PostgreSQL (元数据):
├── juicefs database
│ ├── inodes
│ ├── chunks
│ ├── del-files
│ └── sessions
MinIO (S3 数据):
├── juicefs bucket
│ └── juicefs/
│ ├── juicefs.db ← JuiceFS 内部数据库
│ └── chunk-xxx ← 数据块
卸载顺序
# 1. 删除 rcoder 资源
kubectl delete -f manifests/02-rcoder/rcoder-deployment.yaml
kubectl delete -f manifests/02-rcoder/rcoder-configmap.yaml
kubectl delete -f manifests/01-storage/juicefs-pvc.yaml
# 2. 删除 JuiceFS 相关
kubectl delete -f manifests/01-storage/juicefs-storageclass.yaml
kubectl delete -f manifests/01-storage/juicefs-secret.yaml
# 3. 删除存储层
kubectl delete -f manifests/01-storage/minio-deployment.yaml
kubectl delete -f manifests/01-storage/postgresql-deployment.yaml
# 4. 删除 JuiceFS CSI Driver (可选)
helm uninstall juicefs-csi-driver -n kube-system
常见问题
1. PVC 一直 Pending
# 检查 JuiceFS CSI Driver 状态
kubectl get pods -n kube-system | grep juicefs
# 检查 StorageClass
kubectl get sc juicefs-sc -o yaml
# 检查 Secret
kubectl get secret juicefs-secret -n nuwax-rcoder -o yaml
2. MinIO Bucket 创建失败
# 确认 MinIO 运行正常
kubectl logs -n nuwax-rcoder -l app=minio --tail=20
# 手动进入 Pod 测试
kubectl exec -it -n nuwax-rcoder deploy/minio -- sh
mc alias set myminio http://localhost:9000 minioadmin minioadmin
mc mb myminio/juicefs
3. JuiceFS 挂载失败
# 查看 Node Pod 日志
kubectl get pods -n kube-system -o wide | grep juicefs
# 查看挂载详情
kubectl describe pod -n kube-system -l app=juicefs-csi-driver-node
资源需求
| 组件 | CPU | Memory | Storage |
|---|---|---|---|
| PostgreSQL | 500m | 1Gi | 20Gi |
| MinIO | 500m | 1Gi | 100Gi+ |
| JuiceFS CSI | 100m | 128Mi | - |
总计:约 2 核 + 2.5Gi + 120Gi 存储