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

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

发生了什么?
云提供商: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,如下所示:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      terminationGracePeriodSeconds: 120
      containers:
      - name: writer
        image: busybox
        env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        volumeMounts:
        - name: my-volume
          mountPath: "/mnt"
        command: ["/bin/sh"]
        args:
        - -c
        - |
          while true; do
            echo $MY_POD_NAME $(date) >> /mnt/myfile.txt;
            sleep 1;
          done
      volumes:
      - name: my-volume
        persistentVolumeClaim:
          claimName: pvc-rwop
     nodeSelector:
       xxx
  1. 在pod运行后,将replicaSet中的nodeSelector更改为另一个节点
  2. 强制删除具有kubectl delete pod test-5nffh --force的pod
  3. 应该在不同的节点上出现一个新的节点test-g6vnt,旧的pod应该被终止
  4. 此时,这两个pod都可以对pv进行写操作,文件/mnt/myfile.txt的重叠情况如下:
# cat /mnt/myfile.txt
test-5nffh Tue Apr 9 07:29:03 UTC 2024
test-5nffh Tue Apr 9 07:29:04 UTC 2024
test-5nffh Tue Apr 9 07:29:05 UTC 2024
test-g6vnt Tue Apr 9 07:29:06 UTC 2024
test-5nffh Tue Apr 9 07:29:06 UTC 2024
test-g6vnt Tue Apr 9 07:29:07 UTC 2024
test-5nffh Tue Apr 9 07:29:07 UTC 2024
test-g6vnt Tue Apr 9 07:29:08 UTC 2024
test-5nffh Tue Apr 9 07:29:08 UTC 2024
  1. 这意味着在关闭期间,pv可以同时被两个pod访问
    我们需要了解其他任何信息吗?
  • 无响应*

Kubernetes版本

$ kubectl version
# 
Server Version: v1.28.6

云提供商
openstack
操作系统版本

# On Linux:
$ cat /etc/os-release
VERSION="15-SP3"
VERSION_ID="15.3"
PRETTY_NAME="SUSE Linux Enterprise Server 15 SP3"
$ uname -a
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在使用该卷的证据。

相关问题