惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
C
Cybersecurity and Infrastructure Security Agency CISA
N
News and Events Feed by Topic
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
Scott Helme
Scott Helme
P
Palo Alto Networks Blog
S
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tor Project blog
量子位
G
Google Developers Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog RSS Feed
NISL@THU
NISL@THU
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
AWS News Blog
AWS News Blog
爱范儿
爱范儿
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
L
LINUX DO - 最新话题
Security Archives - TechRepublic
Security Archives - TechRepublic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Secure Thoughts
Cloudbric
Cloudbric
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Hacker News: Ask HN
Hacker News: Ask HN
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
G
GRAHAM CLULEY
P
Proofpoint News Feed
V
V2EX
Martin Fowler
Martin Fowler
C
CERT Recently Published Vulnerability Notes
Attack and Defense Labs
Attack and Defense Labs
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Cloudflare Blog
SecWiki News
SecWiki News
罗磊的独立博客
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
The Last Watchdog
The Last Watchdog

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
Fluid 下的 Juicefs 企业版维护
微信公众号 · 2025-01-18 · via 陈少文的网站

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 副本

  • worker 副本
1
kubectl -n ${NAMESPACE} get sts -l release=${PVC}
1
kubectl -n ${NAMESPACE} get pod -l release=${PVC},role=juicefs-worker
  • fuse 副本
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 报错

强制删除 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/juicefs@v1.2.0-dev.0.20240116052722-9bab947db092/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 的残留。

3.4 Fuse 报错 RequestTimeTooSkewed

1
2
3
2025/04/07 23:34:51.861440 juicefs[9] <FATAL>: Storage eos://mybucket/mybucket/ is not configured correctly: Failed to create bucket eos://mybucket/mybucket/: RequestTimeTooSkewed:
        status code: 403, request id: 2ed3a7cc-d222-4980-b890-e68cd10c0088-0067f4d183-57264c0-hubei3-zone1, host id: 57264c0-hubei3-zone1-hubei3, previous error: RequestTimeTooSkewed:
        status code: 403, request id: 38aea478-0fad-4e8a-8701-27dea29b5a0b-0067f4d183-488fe87-hubei3-zone1, host id: 488fe87-hubei3-zone1-hubei3 [format.go:474]

检测节点之间的时间是否有偏差,安装 chronyd 服务自动同步时间。

1
systemctl restart chronyd.service && systemctl status chronyd.service

4. Worker 问题,缓存异常

4.1 Worker PartialReady

  1. 查看 JuiceFSRuntime 的状态
1
2
3
4
kubectl -n ${NAMESPACE} get juicefsruntimes.data.fluid.io

NAME    WORKER PHASE   FUSE PHASE   AGE
${PVC}   PartialReady   Ready        32m
  1. 查看 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)
  1. 删除异常的 Worker

这种 Worker 可能是正常启动的,但是 Fluid 获取不到其 stats 状态,会判断其未就绪。

1
kubectl -n ${NAMESPACE} delete pod ${PVC}-worker-53
  1. 移除异常 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 自动配置。

6.2 Pod 使用 PVC 时需要等待的时间过长

将 Fuse 的 cleanPolicy 设置为 OnRuntimeDeleted。

cleanPolicy 有两个可选值:

  • OnDemand, 当节点不需要时清理
  • OnRuntimeDeleted,当清理缓存时清理

如果不停地在创建和使用 Pod,采用 OnRuntimeDeleted 可以减少 Fuse 的启动时间。

7. 运维建议

7.1 固定每一个 Worker 所在的节点

固定 Worker 所在的节点,可以避免 Worker 重启之后,导致缓存丢失。

具体方法是,将 NodeSelector 设置为指定标签,是得打上标签的节点数等于 Worker 的副本数。

由于 Worker 是 StatefulSet 部署,每次重启时会一个个按照顺序启动,可以保证每个 Worker 会在固定一个节点上。

8. 安装

  • 创建命名空间
1
kubectl create ns fluid-system
  • 添加 Helm 仓库
1
2
helm repo add fluid https://fluid-cloudnative.github.io/charts
helm repo update
  • 安装 Fluid
1
helm -n fluid-system install fluid --version 1.0.0 --set csi.featureGates='FuseRecovery=true'  --set csi.config.hostNetwork=true  fluid/fluid

开启 FuseRecovery 特性可以在 Fuse 重启时自动恢复挂载。如果安装时没有开启该特性,可以再 CSI 配置中添加 - --feature-gates=FuseRecovery=true 启动参数。

9. 版本升级

从 1.0.0 升级到 1.0.4

  • 下载 1.0.4 版本的 Fluid
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 会导致存储不可用,需要重启应用再次挂载。

10. 存储桶的域名发生变化

在 Worker 和 Fuse 中,在 /root/.juicefs 目录下,有完整的配置文件,记录了完整域名的配置。

在社区版的 JuiceFS 中,我们创建 Volume 时,填写 bucket 时,只会填写同名,而不是完整域名。

企业版的 JuiceFS 会根据环境自动选择内网或者公网域名,甚至云厂的 endpoint。如果出现访问的存储桶域名变化,说明网络环境有变动。

有两种方式,可以固定存储桶的域名:

  1. 在 JuiceFS 的 Volume 配置中,填写完整的存储桶域名,比如 http://bucketname.region.aliyuncs.com
  2. 在客户端的配置文件中写明 endpoint,比如挂载完整的 /root/.juicefs/my-volume.conf 文件,指明完整的存储桶域名。