发生了什么?
云提供商: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个副本和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
- 在pod运行后,将replicaSet中的nodeSelector更改为另一个节点
- 强制删除具有
kubectl delete pod test-5nffh --force
的pod - 应该在不同的节点上出现一个新的节点
test-g6vnt
,旧的pod应该被终止 - 此时,这两个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
- 这意味着在关闭期间,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
4条答案
按热度按时间v2g6jxz61#
注意,如果问题出在manila CSI插件上,工单应该记录在这里:
https://github.com/kubernetes/cloud-provider-openstack/issues
不在kubernetes/kubernetes中。
/sig storage
i5desfxk2#
你好,@neolit123,感谢指出。稍后我会处理这个问题。但是让我们把马尼拉文件系统放在一边,我想知道当涉及到NFS时,它是否被设计成这样?我问这个问题是因为NFS没有附加的概念,这意味着如果一个pod正在被强制删除,一个新的pod可以读写相同的pv,因为即使启用了ReadWriteOncePod,attachdetach-controller也无法检测到它。
goqiplq23#
DonghaopengZhu:K8s无法检测到强制删除的pod。要使此功能正常工作,pod必须被优雅地终止。我们可能需要更清楚地记录这一点。我们可以将其视为文档中的错误。
jsafrane:已接受
triage:已接受
56lgkhnf4#
强制删除会产生后果。例如,它会破坏StatefulSet的保证,即一个Pod只运行一次。StatefulSet控制器会立即启动一个新的副本,而已删除的副本仍在某个地方运行。此外,它还会破坏读写持久性保证,正如您在这里描述的那样。
我认为这不是Kubernetes的bug。您实际上是强制删除了唯一证明还有另一个pod在使用该卷的证据。