kubernetes 一个带有NFS的PV可以通过启用ReadWriteOncePod的方式被两个pod挂载,

ac1kyiln  于 10个月前  发布在  Kubernetes
关注(0)|答案(4)|浏览(111)

发生了什么?
云提供商:openstack
CSI驱动程序:NFS(Manila)

  • 首先,我得到了一个带有1个副本和RWOP启用的replicaSet,因此pod A出现在节点A上。
  • 然后,将nodeSelector编辑为节点B并强制删除pod A,导致pod A处于终止状态,pod B在节点B上运行。
  • 在此短暂时间内,即使启用了RWOP,pod A和pod B都可以向同一个pv写入数据。
  • 在pod A被消除后,pod B完全控制该卷。

你期望发生什么?
当旧的pod处于宽限期时,pv应该始终由单个pod进行读写,而不是由两个pod访问。
我们如何尽可能精确地重现它?

  1. 应用一个带有1个副本和RWOP启用的replicaSet,如下所示:
  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4. name: test
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app: test
  10. template:
  11. metadata:
  12. labels:
  13. app: test
  14. spec:
  15. terminationGracePeriodSeconds: 120
  16. containers:
  17. - name: writer
  18. image: busybox
  19. env:
  20. - name: MY_POD_NAME
  21. valueFrom:
  22. fieldRef:
  23. fieldPath: metadata.name
  24. volumeMounts:
  25. - name: my-volume
  26. mountPath: "/mnt"
  27. command: ["/bin/sh"]
  28. args:
  29. - -c
  30. - |
  31. while true; do
  32. echo $MY_POD_NAME $(date) >> /mnt/myfile.txt;
  33. sleep 1;
  34. done
  35. volumes:
  36. - name: my-volume
  37. persistentVolumeClaim:
  38. claimName: pvc-rwop
  39. nodeSelector:
  40. xxx
  1. 在pod运行后,将replicaSet中的nodeSelector更改为另一个节点
  2. 强制删除具有kubectl delete pod test-5nffh --force的pod
  3. 应该在不同的节点上出现一个新的节点test-g6vnt,旧的pod应该被终止
  4. 此时,这两个pod都可以对pv进行写操作,文件/mnt/myfile.txt的重叠情况如下:
  1. # cat /mnt/myfile.txt
  2. test-5nffh Tue Apr 9 07:29:03 UTC 2024
  3. test-5nffh Tue Apr 9 07:29:04 UTC 2024
  4. test-5nffh Tue Apr 9 07:29:05 UTC 2024
  5. test-g6vnt Tue Apr 9 07:29:06 UTC 2024
  6. test-5nffh Tue Apr 9 07:29:06 UTC 2024
  7. test-g6vnt Tue Apr 9 07:29:07 UTC 2024
  8. test-5nffh Tue Apr 9 07:29:07 UTC 2024
  9. test-g6vnt Tue Apr 9 07:29:08 UTC 2024
  10. test-5nffh Tue Apr 9 07:29:08 UTC 2024
  1. 这意味着在关闭期间,pv可以同时被两个pod访问
    我们需要了解其他任何信息吗?
  • 无响应*

Kubernetes版本

  1. $ kubectl version
  2. #
  3. Server Version: v1.28.6

云提供商
openstack
操作系统版本

  1. # On Linux:
  2. $ cat /etc/os-release
  3. VERSION="15-SP3"
  4. VERSION_ID="15.3"
  5. PRETTY_NAME="SUSE Linux Enterprise Server 15 SP3"
  6. $ uname -a
  7. Debian 6.1.77-0gardenlinux1 (2024-02-12) x86_64 x86_64 x86_64 GNU/Linux

安装工具
容器运行时(CRI)和版本(如适用)
相关插件(CNI,CSI等)和版本(如适用)
csidriver是:nfs.manila.csi.openstack.org

v2g6jxz6

v2g6jxz61#

注意,如果问题出在manila CSI插件上,工单应该记录在这里:
https://github.com/kubernetes/cloud-provider-openstack/issues
不在kubernetes/kubernetes中。
/sig storage

i5desfxk

i5desfxk2#

你好,@neolit123,感谢指出。稍后我会处理这个问题。但是让我们把马尼拉文件系统放在一边,我想知道当涉及到NFS时,它是否被设计成这样?我问这个问题是因为NFS没有附加的概念,这意味着如果一个pod正在被强制删除,一个新的pod可以读写相同的pv,因为即使启用了ReadWriteOncePod,attachdetach-controller也无法检测到它。

goqiplq2

goqiplq23#

DonghaopengZhu:K8s无法检测到强制删除的pod。要使此功能正常工作,pod必须被优雅地终止。我们可能需要更清楚地记录这一点。我们可以将其视为文档中的错误。
jsafrane:已接受
triage:已接受

56lgkhnf

56lgkhnf4#

  1. 使用kubectl强制删除pod test-5nffh
    强制删除会产生后果。例如,它会破坏StatefulSet的保证,即一个Pod只运行一次。StatefulSet控制器会立即启动一个新的副本,而已删除的副本仍在某个地方运行。此外,它还会破坏读写持久性保证,正如您在这里描述的那样。
    我认为这不是Kubernetes的bug。您实际上是强制删除了唯一证明还有另一个pod在使用该卷的证据。

相关问题