【发布时间】:2018-07-31 09:14:07
【问题描述】:
我们已经使用这个插件https://github.com/juliohm1978/kubernetes-cifs-volumedriver,从 Windows 服务器在 kubernetes Centos 集群上挂载了一个 smb 共享作为 PV,这基本上只是一个使用 mount.cifs 的脚本。我们还尝试了 microsoft 插件和 https://github.com/fstab/cifs,但它们使用 mount.cifs 做同样的事情。
该挂载在小型项目中运行良好,但一旦我们开始在写入密集型活动中使用它,我们就会遇到一种非常奇怪的模式,即丢失刚刚写入的文件。
我们创建了一个简单的 java 程序,它在 foreach 循环中写入 900-1000 个文件之间的随机数。 这些文件都包含相同的随机字节,用这一行创建
byte[] data = org.apache.commons.lang3.RandomUtils.nextBytes(1024 * 50);
然后它会尝试列出已写入文件的目录,并且列表中的文件计数始终为丢失文件。
丢失的文件在序列中总是相同的,即使名称包含随机部分。
我们编写的文件名称包含 foreach 索引,但也是随机部分,以便每次重试都可以检查,而不会受到前一次的干扰。
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:24.331 start write file total=971
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:39.771 end write file total=971
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.041 count files=937
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.043 missing files=34
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.044 missing file=smb-cache-test-0025-yUaWG4aYTIrqFPBE93WZXzgnmBBy5Wl4.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.044 missing file=smb-cache-test-0051-yUaWG4aYTIrqFPBE93WZXzgnmBBy5Wl4.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.044 missing file=smb-cache-test-0077-yUaWG4aYTIrqFPBE93WZXzgnmBBy5Wl4.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.044 missing file=smb-cache-test-0109-yUaWG4aYTIrqFPBE93WZXzgnmBBy5Wl4.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.044 missing file=smb-cache-test-0135-yUaWG4aYTIrqFPBE93WZXzgnmBBy5Wl4.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:27:40.044 missing file=smb-cache-test-0161-yUaWG4aYTIrqFPBE93WZXzgnmBBy5Wl4.tmp
[...]
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:16.113 start write file total=995
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:30.808 end write file total=995
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.065 count files=960
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.066 missing files=35
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.066 missing file=smb-cache-test-0025-hjvVQG6JdnC0KBI5xfsBldZkCHWZQ0Fr.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.066 missing file=smb-cache-test-0051-hjvVQG6JdnC0KBI5xfsBldZkCHWZQ0Fr.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.066 missing file=smb-cache-test-0077-hjvVQG6JdnC0KBI5xfsBldZkCHWZQ0Fr.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.066 missing file=smb-cache-test-0109-hjvVQG6JdnC0KBI5xfsBldZkCHWZQ0Fr.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.067 missing file=smb-cache-test-0135-hjvVQG6JdnC0KBI5xfsBldZkCHWZQ0Fr.tmp
[smb-cache-test-6db94b688-jw8cx] 2018-07-31 07:30:31.067 missing file=smb-cache-test-0161-hjvVQG6JdnC0KBI5xfsBldZkCHWZQ0Fr.tmp
[...]
我们检查了 pod 内的挂载路径,它有同样的问题,而在 flexvolume 挂载目录中访问的节点上的相同挂载是可以的,所以它不仅仅是 java,它在 pod 操作系统级别。 这是同一运行的两个挂载上的文件计数的示例,第一个在 pod 内,后者在托管 pod 的节点中
/fileserver # pwd
/fileserver
/fileserver # ls -l _smb-cache-test/ | wc -l
938
[root@k8s-node-03 wind3-speech-file-extractor-pre-pv]# pwd
/var/lib/kubelet/pods/b4dd4252-9492-11e8-8796-000c299d5d24/volumes/juliohm~cifs/wind3-speech-file-extractor-pre-pv
[root@k8s-node-03 wind3-speech-file-extractor-pre-pv]# ls -l _smb-cache-test/ | wc -l
972
这是 docker 或 kubernetes 在节点上由 flexvolume 创建的挂载和 pod 中相同的挂载之间的“隐藏”层中做的非常可疑的事情。
附加信息:
我们已经澄清这不是 SMB 缓存问题:
- 我们已尝试使用 smb v1.0、v2.0、v2.1 和 v3.0。
- 我们还尝试通过 cifs 选项 cache=none 禁用缓存。
- 我们已禁用 Windows 上的缓存服务器端,并通过注册表破解将缓存超时设置为 0。
- 我们在共享主机名上使用了未记录的 $NOCSC$ 后缀。 问题仍然存在。
我们还在节点上手动挂载了共享并添加了它 作为“本地”persistedVolume 而不是 flexvolume 到 pod,问题不再存在。
谢谢
【问题讨论】:
标签: docker kubernetes mount smb cifs