存储与镜像排查笔记合集
内容提要
本文汇总了Docker存储迁移、Alpine镜像DNS与hosts解析、Fluid挂载S3/OBS及性能测试、obsutil容器使用、Docker 20.10.6拉取镜像报错、JuiceFS CSI部署等排查记录。测试表明Jindo挂载S3/OBS性能较好,适合分发模型;Fluid直接挂载S3性能较差且不同步更新。
延伸解读
Alpine 镜像的 DNS 与 hosts 解析限制
Alpine 使用 musl 库,其 DNS 解析行为与 glibc 不同,导致在容器中可能出现 DNS 请求超时。文章指出,常见的 single-request-reopen 配置仅对 glibc 生效,对 musl 无效。此外,Alpine 默认缺少 /etc/nsswitch.conf,依赖 hosts 文件的进程无法解析主机名。解决方法是在 Dockerfile 中创建该文件并写入“hosts: files dns”。这些细节提醒我们,选择基础镜像时需考虑其库实现带来的兼容性差异。
Fluid 直接挂载 S3 的性能与同步局限
文章实测 Fluid 将 S3 挂载为 PVC 时,写入速度仅 18.1 MB/s,读取 72.4 MB/s,远低于带缓存读取的 4424.7 MB/s。更关键的是,已挂载的 PVC 无法感知 S3 桶的后续更新,相当于挂载瞬间的快照;在 PVC 中创建目录或文件也不会同步回 S3。因此,这种模式不适合需要双向同步或频繁写入的场景,作者建议考虑 s3fs 加 ThinRuntimeProfile 或 JindoRuntime 方案。
Jindo 挂载对象存储的性能表现
文章对比了 Jindo 挂载 OBS 和 S3 的测试结果:OBS 写入大文件 389.70 MiB/s,读取 242.28 MiB/s;S3 写入 394.04 MiB/s,读取 304.28 MiB/s。作者认为该性能用于分发模型基本足够。不过,小文件读写和 stat 操作性能较低,例如 OBS 的 stat 仅 34.9 files/s,因此该方案更适合大文件场景,小文件密集负载需谨慎评估。
Docker 版本与内核兼容性风险
在 CentOS 7(内核 3.10.0-327)上,Docker 20.10.6 拉取部分镜像时出现 unlinkat 错误,导致镜像层注册失败。文章通过降级 Docker 到 19.03.8 解决了问题。这表明新版本 Docker 可能与旧内核存在兼容性问题,在老旧系统上升级 Docker 前应验证镜像拉取功能,并准备好回退方案。
Q&A
如何将 Docker 的存储目录迁移到新硬盘?
先停止 Docker 服务,将 /var/lib/docker 移动到新硬盘(如 /data/),然后创建软链接 ln -s /data/docker /var/lib/docker,最后重启 Docker。
Alpine 镜像中 DNS 解析超时和无法解析 hosts 文件该怎么解决?
DNS 超时是因为 Alpine 使用 musl 库,对 DNS 解析有限制,建议不使用 Alpine 镜像,或在 resolv.conf 中添加 options single-request-reopen(但该选项对 musl 无效)。无法解析 hosts 是因为缺少 /etc/nsswitch.conf,可在 Dockerfile 中添加命令生成该文件:RUN if [ ! -e /etc/nsswitch.conf ];then echo 'hosts: files dns' > /etc/nsswitch.conf; fi。
Fluid 直接挂载 S3 为 PVC 的性能如何?有什么注意事项?
性能较差:写入约 18.1 MB/s,读取约 72.4 MB/s,带缓存读取可达 4424.7 MB/s。已挂载的 PVC 看不到 S3 桶的更新,在 PVC 中创建目录或文件不会同步到 S3 桶。建议使用 s3fs + ThinRuntimeProfile 或 JindoRuntime 加速。
使用 Jindo 挂载 S3 或 OBS 的性能怎么样?适合什么场景?
Jindo 挂载 S3 写入约 394 MiB/s,读取约 304 MiB/s;挂载 OBS 写入约 389.7 MiB/s,读取约 242.3 MiB/s。性能较好,适合用于分发模型。
在容器中使用 obsutil 时遇到 mlock 失败或只读文件系统错误怎么办?
mlock 失败:Docker 启动时加 --ulimit memlock=-1;Kubernetes 下需以特权模式启动 Pod 并设置 ulimit -c unlimited。只读文件系统错误:由于凭证以只读方式挂载,需在容器启动时读取并重新生成凭证文件,例如 cat /root/.obsutilconfig1 > /root/.obsutilconfig。
Docker 20.10.6 拉取镜像报错 unlinkat invalid argument 如何解决?
该问题与内核版本(如 CentOS 7 的 3.10.0-327)有关,可降低 Docker 版本至 19.03.8 解决。先卸载当前 Docker(yum remove -y docker*),再安装指定版本。
如何部署 JuiceFS CSI Driver 并创建静态存储卷?
下载 k8s.yaml,检查 kubelet 安装目录,如有需要替换路径后应用。创建 Secret 保存文件系统认证信息,然后创建 PersistentVolume 和 PersistentVolumeClaim(storageClassName 设为空字符串,通过 selector 绑定 PV)。