【问题标题】:Provisioning persistent disks for horizontally scaled pods为水平扩展的 Pod 配置永久性磁盘
【发布时间】:2017-12-13 15:59:45
【问题描述】:

在我们的集群中,我们有一个使用大量本地磁盘空间的应用程序的水平扩展部署,这导致了主要的集群稳定性问题(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. 我们绝对不关心卷共享,也不真正关心持久性,我们只想要与集群隔离的存储 - 这是适合这项工作的工具吗?

【问题讨论】:

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


    【解决方案1】:

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

    关于您看到的错误:

    卷的多重附加错误 卷已独占附加到一个节点,不能附加到另一个

    你得到这个是因为你有跨多个节点的 Pod,但只有一个卷(因为 Deployment 只能有一个)并且多个节点试图挂载这个卷以将它附加到你的部署 Pod。该卷似乎不是可以同时安装到多个节点的 NFS。如果您根本不关心状态并且仍然想使用Deployment,那么您必须使用支持同时从多个节点挂载的磁盘,例如 NFS。此外,您需要将 PVC 的 accessModes 策略更改为 ReadWriteMany,因为多个 pod 会写入同一个物理卷。

    如果您需要为每个 pod 分配一个专用磁盘,那么您可能希望使用 StatefulSet 来代替。顾名思义,它的 pod 是用来保持状态的,因此您还可以在其中定义一个 volumeClaimTemplates 部分,这将为每个 pod 创建一个专用磁盘,如documentation 中所述。

    【讨论】:

    • 感谢您的快速回答,对澄清其中一些概念非常有帮助。
    • 如果您或其他人好奇,我们决定为这些 pod 使用来自 emptyDirs 的卷。我们实际上不需要持久性或共享,所以emptyDirs 在概念上似乎更贴切。由于我们在将这些 pod 放入当前集群时遇到了与磁盘空间相关的生产问题,因此我们决定将它们分配到自己的节点池中:cloud.google.com/kubernetes-engine/docs/concepts/node-pools
    • @tylergould 不错的解决方案!谢谢分享!
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2016-02-20
    • 2018-03-28
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多