【问题标题】:Can I use local SSDs on GKE for fast, temporary storage within a pod?我可以在 GKE 上使用本地 SSD 在 pod 内进行快速的临时存储吗?
【发布时间】:2018-11-30 02:16:13
【问题描述】:

我们在 GKE 上部署了一个应用程序,它将受益于磁盘上的快速临时存储。

GKE local SSD 功能几乎完美,但是我们有多个 pod 副本,理想情况下希望在同一个节点上支持多个 pod。使用 hostPath 挂载本地 SSD 很困难。

This 2016 SO question 提到了在本地 SSD 上安装 emptyDirs 的想法,这将是完美的,但我知道仍然不是一种选择。

有一个2017 mailing list thread有同样的想法,但答案仍然不肯定。

GCP docs for local SSDs 最近更新为通过PersistentVolume 抽象来描述使用它们,这听起来很有希望。我可以用它来实现我所追求的吗?

这些示例似乎显示将完整的本地 SSD 安装为 PersistentVolume,而我的偏好是为每个 pod 使用它的隔离部分。我们也不需要数据是持久的——一旦 pod 被删除,我们也会很高兴数据也被删除。

【问题讨论】:

  • 这个社区规范似乎揭示了许多通过 PersistentVolume (github.com/kubernetes/community/blob/master/contributors/…) 提供本地 SSD 背后的设计思想。听起来“临时存储空间”用例可能不是主要目标,所以也许我正在寻找的东西还不可能
  • 我发现 kubernetes 1.11 中添加了一个 alpha 功能:Downward API support in volume subPath。我还没有测试过,但是描述听起来好像可以通过hostPath挂载本地SSD,然后使用pod名称作为subDir
  • 在阅读您想到的不同选项时,在我看来,使用 hostPath 最适合您的用例。在使用本地 SSD 时,您是否面临使用此选项的任何特定挑战/困难?
  • 主机路径卷意味着单个 pod 可以访问整个本地 SSD。我希望每个 pod 都有一个独立的本地 SSD 块

标签: kubernetes google-kubernetes-engine


【解决方案1】:

Kubernetes 1.11 添加了一个名为 Downward API support in volume subPath 的 alpha 功能,它允许使用向下 API 设置 volumeMount 子路径。

我通过创建 GKE 1.11 alpha 集群对此进行了测试:

gcloud container clusters create jh-test --enable-kubernetes-alpha
  --zone=asia-southeast1-a --cluster-version=1.11.3-gke.18
  --local-ssd-count=1 --machine-type=n1-standard-2 --num-nodes=2
  --image-type=cos --disk-type=pd-ssd --disk-size=20Gi
  --no-enable-basic-auth --no-issue-client-certificate
  --no-enable-autoupgrade --no-enable-autorepair

然后我使用以下配置创建了一个 2 副本部署:

      env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
      volumeMounts:
        - name: scratch-space
          mountPath: /tmp/scratch
          subPath: $(POD_NAME)
  volumes:
    - name: scratch-space
      hostPath:
        path: "/mnt/disks/ssd0"

如果我 kubectl exec'd 进入每个 pod,我有一个 /tmp/scratch 目录,该目录是隔离的且非常高效。

如果我通过 SSH 连接到主机,那么我可以看到每个 pod 的目录:

$ ls -l /mnt/disks/ssd0/
drwx--x--x 14 root root 4096 Dec  1 01:49 foo-6dc57cb589-nwbjw
drwx--x--x 14 root root 4096 Dec  1 01:50 foo-857656f4-dzzzl

我还尝试将部署应用到非 alpha GKE 1.11 集群,但 SSD 内容最终看起来像这样:

$ ls -l /mnt/disks/ssd0/
drwxr-xr-x 2 root root 4096 Dec  1 04:51 '$(POD_NAME)'

不幸的是,在 alpha 集群上运行我们的工作负载是不现实的,所以这对我们来说还不是一个实用的解决方案。我们必须等待该功能达到测试版并在标准 GKE 集群上可用。它似乎是slowly progressing,虽然API will probably change slightly

对于 Kubernetes 1.14,volumeMounts 的语法已更改为使用新的 subPathExpr 字段。该功能仍然是 Alpha 版:

      env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
      volumeMounts:
        - name: scratch-space
          mountPath: /tmp/scratch
          subPathExpr: $(POD_NAME)
  volumes:
    - name: scratch-space
      hostPath:
        path: "/mnt/disks/ssd0"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2016-06-23
    • 2020-07-05
    • 2019-01-14
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多