我有一个非常简单的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
4条答案
按热度按时间hgb9j2n61#
看起来您的某个节点上连接了一个悬空PVC和/或PV。您可以使用ssh进入该节点并运行
df
或mount
进行检查。如果您查看this,StatefulSet中的PVC始终Map到其pod名称,因此您可能仍有一个悬空pod(?)
如果您有一个悬挂的移液器:
您可能需要强制执行:
然后,您可以尝试删除PVC及其对应的PV:
ttygqcqt2#
我现在也有同样的问题,问题是,通常运行Pod的节点出现故障,由另一个节点接管(无论出于何种原因,它都没有按预期工作)。之前已经有过几次“节点关闭”的情况,但从未导致任何问题。如果不引导关闭的节点,就无法使StatefulSet和Deployment重新启动并运行。但是,一旦节点重新启动并运行,StatefulSet和Deployment也会立即恢复活动。
nqwrtyyt3#
我也有过类似的错误:
我使用longhorn作为存储配置程序和管理器。所以我只是在错误中分离了这个pv,并重新启动了有状态集。这次它自动能够正确地连接到pv。
hivapdat4#
我将添加一个答案,以防止这种情况再次发生。
简短回答
Access modes:从
ReadWriteOnce
切换到ReadWriteMany
。更多细节
您正在使用StatefulSet,其中每个副本都有自己的状态,并为每个单元创建唯一的永久卷声明(PVC)。每个PVC都引用您决定访问模式为
ReadWriteOnce
的永久卷。这一点可以从:
读写一次
卷可由单个节点装载为读写模式。当单元在同一节点上运行时,ReadWriteOnce访问模式仍允许多个单元访问卷。
因此,如果K8S调度程序(由于优先级或资源计算,或由于决定将单元转移到不同节点的群集自动缩放器),您将收到一个错误,即卷已独占连接到一个节点,无法连接到另一个节点。
请考虑使用
ReadWriteMany
,其中卷可由多个节点以读写方式装载。