卷已独占连接到一个节点,无法附加到另一个节点



我有一个非常简单的kubernetes pod。我想要一个陈述集并想要以下过程:

  1. 我想下载initContainer,然后将TARBALL从S3取消到安装到Initcontainer的卷中
  2. 我想将该卷安装到我的主容器中以用于使用

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

看起来您有一个悬挂的PVC和/或PV,该PV附在您的一个节点上。您可以进入节点并运行dfmount检查。

如果您看一看,状态填充中的PVC总是映射到其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>

我现在遇到了同样的问题,问题是,Pod通常运行的节点已下降,另一个接管了(该节点都无法正常工作不管是什么原因)。放了"节点"场景之前已经几次,从未引起任何问题。如果不启动下降的节点,无法获得状态满足和部署的重新运行。但是,一旦该节点启动并再次运行状态填充和部署也立即重新栩栩如生。

我也有类似的错误:

 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。

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

简短答案

访问模式:从ReadWriteOnce切换到ReadWriteMany


在更多细节中

您是一个状态填充,每个副本都有自己的状态,并为每个POD创建了独特的持续音量声明(PVC)。每个PVC都指持续卷,您决定访问模式为 ReadWriteOnce

您可以从这里看到:

ReadWriteOnce
该卷可以通过一个单一的读写安装节点。ReadWriteOnce访问模式仍然可以允许多个POD当POD在同一节点上运行时访问卷。

因此,在k8s调度程序的情况下(由于优先级或资源计算,或由于群集自动制剂决定将POD转移到另一个节点) - 您将收到一个错误,该错误表明该卷已经在一个节点上仅附加到一个节点,并且可以是附着在另一个节点上。

请考虑使用ReadWriteMany,其中可以将卷安装为许多节点的读写。

相关内容

  • 没有找到相关文章

最新更新