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 缓存问题:
- 我们已经尝试使用 smb v1.0、v2.0、v2.1 和 v3.0。
- 我们还尝试通过 cifs 选项禁用缓存=none。
- 我们在 windows 上禁用了缓存服务器端,使用注册表黑客将缓存超时设置为 0。
- 我们在共享主机名上使用了未记录的 $NOCSC$ 后缀。
问题仍然存在。
我们也已经在节点上手动挂载了共享并添加了
作为 "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 访问权限的解决方案并没有解决我们的问题。
我们使用此插件 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 缓存问题:
- 我们已经尝试使用 smb v1.0、v2.0、v2.1 和 v3.0。
- 我们还尝试通过 cifs 选项禁用缓存=none。
- 我们在 windows 上禁用了缓存服务器端,使用注册表黑客将缓存超时设置为 0。
- 我们在共享主机名上使用了未记录的 $NOCSC$ 后缀。 问题仍然存在。
我们也已经在节点上手动挂载了共享并添加了 作为 "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 访问权限的解决方案并没有解决我们的问题。