1. 设置环境变量
1
2
| export NAMESPACE=xxx
export PVC=xxx
|
2. Dataset 无法就绪
2.1 Fluid 组件问题
1
| kubectl -n fluid-system get pod -o wide | grep -v "Running"
|
可能出现没有正常启动的情况。
2.2 有异常的 Dataset
异常的资源可能导致 Fluid 资源不断重启,需要人工介入删除。
2.3 检查 Worker \ Fuse 副本
1
| kubectl -n ${NAMESPACE} get sts -l release=${PVC}
|
1
| kubectl -n ${NAMESPACE} get pod -l release=${PVC},role=juicefs-worker
|
1
| kubectl -n kas-job get ds -l release=${PVC}
|
1
| kubectl -n ${NAMESPACE} get pod -l release=${PVC},role=juicefs-fuse
|
3. Fuse 问题,无法使用 PVC
3.1 没有创建 Fuse Pod
节点缺少标签,下面这个命令可以给全部节点打标签:
1
| kubectl label node fluid.io/f-${NAMESPACE}-${PVC}=true --all
|
下面是标签的格式:
1
| fluid.io/f-<namespace>-<pvc>=true
|
3.2 Fuse 挂载有问题
1
| kubectl -n ${NAMESPACE} logs -l release=${PVC},role=juicefs-fuse -f --max-log-requests 100
|
- could not find the requested resource
1
| Error from server (NotFound): the server could not find the requested resource ( pods/log ${PVC}-fuse-8xnmd)
|
强制删除 fuse pod
3.3 Fuse 报错 WithTimeout
报错日志如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
| goroutine 5248 [select]:
github.com/juicedata/juicefs/pkg/utils.WithTimeout(0xc021778000, 0x4af8e8?)
/root/go/pkg/mod/github.com/juicedata/[email protected]/pkg/utils/utils.go:112 +0x125
jfs/pkg/chunk.(*cachedStore).put(0xc001424000, {0xc021776020, 0x1f}, 0xc027c6c370)
/opt/jfs/pkg/chunk/cached_store.go:630 +0x245
jfs/pkg/chunk.(*cachedStore).putWithRetry(0xc001424000, {0xc021776020, 0x1f}, 0x24f10a0?, 0xc025cbb8a0)
/opt/jfs/pkg/chunk/cached_store.go:688 +0xfd
jfs/pkg/chunk.(*wChunk).syncUpload(0xc025cbb830, {0x3147e80?, 0xc00005c0e0?}, {0xc021776020, 0x1f}, 0xc027c6c370?)
/opt/jfs/pkg/chunk/cached_store.go:681 +0x295
jfs/pkg/chunk.(*wChunk).upload.func1(0x0)
/opt/jfs/pkg/chunk/cached_store.go:837 +0x779
created by jfs/pkg/chunk.(*wChunk).upload
/opt/jfs/pkg/chunk/cached_store.go:749 +0x27b
|
先检查元数据、对象存储服务的连通性,再检查主机上是否存在之前 Fuse Pod 的残留。
4. Worker 问题,缓存异常
4.1 Worker PartialReady
- 查看 JuiceFSRuntime 的状态
1
2
3
4
| kubectl -n ${NAMESPACE} get juicefsruntimes.data.fluid.io
NAME WORKER PHASE FUSE PHASE AGE
${PVC} PartialReady Ready 32m
|
- 查看 Worker 的日志
1
2
3
| kubectl -n ${NAMESPACE} logs -l release=${PVC},role=juicefs-worker -f --max-log-requests 100
Error from server (NotFound): the server could not find the requested resource ( pods/log ${PVC}-worker-53)
|
- 删除异常的 Worker
这种 Worker 可能是正常启动的,但是 Fluid 获取不到其 stats 状态,会判断其未就绪。
1
| kubectl -n ${NAMESPACE} delete pod ${PVC}-worker-53
|
- 移除异常 Worker 节点的标签
如果 worker 是使用了 nodeSelector 选择节点,应该移除改节点的标签。
4.2 某些 Worker 异常
1
| 2025/02/13 08:07:10.759238 juicefs[216] <WARNING>: send block chunks/93/67/67065235_8_4194304: peer x.x.x.x:43891: read header: read tcp x.x.x.x:46482->x.x.x.x:43891: i/o timeout [peer.go:338]
|
这种情况下,可以 delete 该 Worker,让其重新启动。
4.3 Worker 资源不足
1
| kubectl -n ${NAMESPACE} top pod |grep ai-kas-aigc-jfs-fluid-worker
|
查看 Worker 的资源使用情况,查看是否接近 Limit 配置。
5. 速度波动很大
速度波动主要是缓存问题,先参考 https://juicefs.com/docs/zh/cloud/guide/distributed-cache/#troubleshooting 进行排查。
5.1 有跨区域的 Worker 组建了分布式缓存
1
2
3
| kubectl -n ${NAMESPACE} logs -l release=${PVC},role=juicefs-worker
2025/01/16 04:12:05.546591 juicefs[189] <INFO>: add peer x.x.102.47:42769 with weight 100 [peer.go:773]
|
在 Worker 的日志中,通过 add peer
可以找到全部的缓存节点,检查是否有不符合预期的节点。同一个 cache group 的节点应该在同一个区域。
5.2 没有在 Worker 节点预热
JuiceFS 有两级缓存,如果在 Fuse 预热,只能在当前节点使用缓存,应该去 Worker 节点预热,才能提供给其他节点使用。
5.3 磁盘满导致缓存被清理
企业版 JuiceFS 有监控面板,查看 Block Cache Eviction Rate 是否有异常。
在磁盘满或者达到 JuiceRuntime 配置的阈值时,会清理缓存,就会导致速度波动。
这种情况下,可以根据缓存目录的创建时间,清理一下超过 30d 的缓存。
1
| find /data*/jfs*/*/raw/chunks -maxdepth 3 -type d -mtime +30 -exec rm -rf {} + 2>/dev/null || true
|
5.4 low 参数设置不合理
low 表示磁盘最低应该保留的空间,如果设置过高,会导致 JuiceFS 不断清理缓存。
此时,Juicefs 监控表现就是缓存命中率低、缓存清理速度大。
解决方法是降低 low 参数,默认值是 0.2。
5.5 部分节点慢
在 JuiceFS 的监控面板中,可以找到 Remote Cache Latency,查看是否有异常节点。
6. 访问速度慢
6.1 Cache-Group 不一致
使用 Fluid 1.0.0 版本配置企业版 JuiceFS 时,如果在 DataSet 中配置了 Cache,Fuse 和 Worker 的 Cache-Group 就会不一致。
JuiceFS 监控的表现就是缓存命中率低,只有 30% 左右,而正常情况下预热之后应该在 80% 以上。
最好不要配置 Cache-Group,让 Fluid 自动配置。
7. 运维建议
7.1 固定每一个 Worker 所在的节点
固定 Worker 所在的节点,可以避免 Worker 重启之后,导致缓存丢失。
具体方法是,将 NodeSelector 设置为指定标签,是得打上标签的节点数等于 Worker 的副本数。
由于 Worker 是 StatefulSet 部署,每次重启时会一个个按照顺序启动,可以保证每个 Worker 会在固定一个节点上。
8. 版本升级
从 1.0.0 升级到 1.0.4
1
| wget https://github.com/fluid-cloudnative/fluid/releases/download/v1.0.4/fluid-1.0.4.tgz
|
1
| tar -zxvf fluid-1.0.4.tgz
|
1
| helm show values ./fluid
|
1
| helm upgrade fluid ./fluid --set crdUpgrade.imagePrefix=registry.cn-beijing.aliyuncs.com/opshub --set crdUpgrade.imageName=fluidcloudnative-fluid-crd-upgrader
|
由于 Fluid 默认拉取的是 DockerHub 的镜像,组件相关的 Deployment、StatefulSet 可能会出现 ImagePullBackOff 的情况,可以通过修改镜像地址解决。
在重启过程中,缓存 worker 会被重启,Fuse 需要手工强制重启,需要注意的是重启 Fuse 会导致存储不可用,需要重启应用再次挂载。