kubernetes cifs smb flexvolume 缺少文件

kubernetes cifs smb flexvolume is missing files

我们使用此插件 https://github.com/juliohm1978/kubernetes-cifs-volumedriver, that is basically just a script to use mount.cifs. We have also tried both the microsoft plugin and https://github.com/fstab/cifs 从 kubernetes Centos 集群上的 windows 服务器挂载了一个 smb 共享作为 PV,但他们使用 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 OS级。 这是相同 运行 的两个挂载文件计数的示例,第一个在 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 中的相同挂载之间的 "hidden" 层中做了一些非常可疑的事情。

补充信息:

我们已经澄清这不是 SMB 缓存问题:

我们也已经在节点上手动挂载了共享并添加了 作为 "local" persistedVolume 而不是 flexvolume 发送到 pod,问题不再存在。

谢谢

原来问题是由在 Centos 节点中使用 Apline 图像作为 java 的基础引起的。将图像更改为基于 Centos 的图像解决了该问题。

我们尝试这种方式是因为我们发现了有关 Ubuntu 和 SMB(不涉及 docker)的相同文件消失的提示,并且认为 Apline 可能会受到相同问题的影响与 ubuntu 的相关性高于 RHEL/Centos

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1572132

顺便说一句,线程中提出的使用 noserverino 和 0777 访问权限的解决方案并没有解决我们的问题。