kubernetes 卷已以独占方式连接到一个节点,无法连接到另一个节点

b09cbbtk  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(4)|浏览(366)

我有一个非常简单的Kubernetes pod。我想要一个有状态的集合,并需要以下过程:
1.我希望使用initcontainer下载并将tarball从s3解压缩到装入initcontainer的卷中
1.我要将该卷装载到主容器中以供使用

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: app
  namespace: test
  labels:
    name: app
spec:
  serviceName: app
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      initContainers:
      - name: preparing
        image: alpine:3.8
        imagePullPolicy: IfNotPresent
        command:
          - "sh"
          - "-c"
          - |
            echo "Downloading data"
            wget https://s3.amazonaws.com/.........
            tar -xvzf xxxx-........ -C /root/
        volumeMounts:
        - name: node-volume
          mountPath: /root/data/

      containers:
      - name: main-container
        image: ecr.us-west-2.amazonaws.com/image/:latest
        imagePullPolicy: Always

        volumeMounts:
        - name: node-volume
          mountPath: /root/data/

  volumeClaimTemplates:
  - metadata:
      name: node-volume
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: gp2-b
      resources:
        requests:
          storage: 80Gi

我继续得到以下错误:
一开始我运行这个程序,我可以看到initcontainer下载我的tarball文件的日志。大约运行了一半,它终止了,并给我以下错误:

Multi-Attach error for volume "pvc-faedc8" Volume is 
already exclusively attached to one node and can't be 
attached to another
hgb9j2n6

hgb9j2n61#

看起来您的某个节点上连接了一个悬空PVC和/或PV。您可以使用ssh进入该节点并运行dfmount进行检查。
如果您查看this,StatefulSet中的PVC始终Map到其pod名称,因此您可能仍有一个悬空pod(?)
如果您有一个悬挂的移液器:

$ kubectl -n test delete pod <pod-name>

您可能需要强制执行:

$ kubectl -n test delete pod <pod-name> --grace-period=0 --force

然后,您可以尝试删除PVC及其对应的PV:

$ kubectl delete pvc pvc-faedc8
$ kubectl delete pv <pv-name>
ttygqcqt

ttygqcqt2#

我现在也有同样的问题,问题是,通常运行Pod的节点出现故障,由另一个节点接管(无论出于何种原因,它都没有按预期工作)。之前已经有过几次“节点关闭”的情况,但从未导致任何问题。如果不引导关闭的节点,就无法使StatefulSet和Deployment重新启动并运行。但是,一旦节点重新启动并运行,StatefulSet和Deployment也会立即恢复活动。

nqwrtyyt

nqwrtyyt3#

我也有过类似的错误:

The volume pvc-2885ea01-f4fb-11eb-9528-00505698bd8b 
   cannot be attached to the node node1 since it is already attached to the node node2*

我使用longhorn作为存储配置程序和管理器。所以我只是在错误中分离了这个pv,并重新启动了有状态集。这次它自动能够正确地连接到pv。

hivapdat

hivapdat4#

我将添加一个答案,以防止这种情况再次发生。

简短回答

Access modes:从ReadWriteOnce切换到ReadWriteMany

更多细节

您正在使用StatefulSet,其中每个副本都有自己的状态,并为每个单元创建唯一的永久卷声明(PVC)。每个PVC都引用您决定访问模式为ReadWriteOnce的永久卷。
这一点可以从:

读写一次

卷可由单个节点装载为读写模式。当单元在同一节点上运行时,ReadWriteOnce访问模式仍允许多个单元访问卷。
因此,如果K8S调度程序(由于优先级或资源计算,或由于决定将单元转移到不同节点的群集自动缩放器),您将收到一个错误,即卷已独占连接到一个节点,无法连接到另一个节点。
请考虑使用ReadWriteMany,其中卷可由多个节点以读写方式装载。

相关问题