我有一个非常简单的kubernetes pod。我想要一个陈述集并想要以下过程:
- 我想下载initContainer,然后将TARBALL从S3取消到安装到Initcontainer的卷中
- 我想将该卷安装到我的主容器中以用于使用
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附在您的一个节点上。您可以进入节点并运行df
或mount
检查。
如果您看一看,状态填充中的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
,其中可以将卷安装为许多节点的读写。