为水平缩放的pod配置永久磁盘

时间:2017-12-13 15:59:46

标签: kubernetes google-cloud-platform google-kubernetes-engine

在我们的集群中,我们对应用程序进行了横向扩展部署,该应用程序使用大量本地磁盘空间,这导致了主要的集群稳定性问题(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个副本并获得上述错误。

  1. 这不是持久量声明应该如何工作吗?
  2. 我们绝对不关心卷共享,我们并不关心持久性,我们只想要与群集隔离的存储 - 这是适合这项工作的工具吗?

1 个答案:

答案 0 :(得分:1)

Deployment意味着无国籍。部署控制器无法确定在重新安排pod后哪个磁盘属于哪个Pod,这将导致状态损坏。这就是为什么Deployment只能在其所有pod中共享一个磁盘的原因。

关于您所看到的错误:

  

卷的多重附加错误   卷已经专门附加到一个节点,无法附加到另一个节点

您之所以这样,是因为您有多个节点的pod,但只有一个卷(因为Deployment只能有一个),并且多个节点正在尝试装入此卷以将其附加到您的部署pod。该卷似乎不是可以同时挂载到多个节点的NFS。如果您根本不关心状态并仍想使用Deployment,那么您必须使用同时支持来自多个节点的挂载的磁盘,如NFS。此外,您需要将PVC accessModes策略更改为ReadWriteMany,因为多个pod会写入相同的物理卷。

如果您需要为每个pod提供专用磁盘,则可能需要使用StatefulSet。顾名思义,它的pod用于保持状态,因此您还可以在其中定义volumeClaimTemplates部分,这将为documentation中描述的每个pod创建专用磁盘。

相关问题