在我们的集群中,我们对应用程序进行了横向扩展部署,该应用程序使用大量本地磁盘空间,这导致了主要的集群稳定性问题(docker崩溃,节点重新创建等)。
我们正在尝试让每个pod配置为gcePersistentDisk
,因此其磁盘使用情况与群集隔离。我们创建了一个使用该类的存储类和持久性卷声明,并在我们部署的pod模板规范中为该声明指定了卷装载。
但是,当我们将自动缩放器设置为使用多个副本时,他们显然会尝试使用相同的卷,我们会收到此错误:
Multi-Attach error for volume
Volume is already exclusively attached to one node and can't be attached to another
以下是我们清单的相关部分。存储类:
{
"apiVersion": "storage.k8s.io/v1",
"kind": "StorageClass",
"metadata": {
"annotations": {},
"name": "some-storage",
"namespace": ""
},
"parameters": {
"type": "pd-standard"
},
"provisioner": "kubernetes.io/gce-pd"
}
PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: some-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: some-class
部署:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: some-deployment
spec:
volumes:
- name: some-storage
persistentVolumeClaim:
claimName: some-pvc
containers:
[omitted]
volumeMounts:
- name: some-storage
mountPath: /var/path
应用这些后,我们将部署的自动缩放器更新为至少2个副本并获得上述错误。
答案 0 :(得分:1)
Deployment
意味着无国籍。部署控制器无法确定在重新安排pod后哪个磁盘属于哪个Pod,这将导致状态损坏。这就是为什么Deployment
只能在其所有pod中共享一个磁盘的原因。
关于您所看到的错误:
卷的多重附加错误 卷已经专门附加到一个节点,无法附加到另一个节点
您之所以这样,是因为您有多个节点的pod,但只有一个卷(因为Deployment
只能有一个),并且多个节点正在尝试装入此卷以将其附加到您的部署pod。该卷似乎不是可以同时挂载到多个节点的NFS。如果您根本不关心状态并仍想使用Deployment
,那么您必须使用同时支持来自多个节点的挂载的磁盘,如NFS。此外,您需要将PVC accessModes
策略更改为ReadWriteMany
,因为多个pod会写入相同的物理卷。
如果您需要为每个pod提供专用磁盘,则可能需要使用StatefulSet
。顾名思义,它的pod用于保持状态,因此您还可以在其中定义volumeClaimTemplates
部分,这将为documentation中描述的每个pod创建专用磁盘。