我可以在GKE上使用本地SSD来在Pod中快速,临时存储吗?

时间:2018-11-30 02:16:13

标签: kubernetes google-kubernetes-engine

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

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

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

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

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

这些示例似乎显示了将完整的本地SSD挂载为PersistentVolume,而我更喜欢为每个吊舱使用它的隔离部分。我们也不需要数据是持久的-删除容器后,我们也很高兴删除数据。

1 个答案:

答案 0 :(得分:2)

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进入每个吊舱,那么我有一个/tmp/scratch目录,该目录是孤立的并且性能很好。

如果我通过SSHd进入主机,则可以看到每个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集群上运行我们的工作负载是不现实的,因此这对于我们来说还不是一个实用的解决方案。我们将不得不等待该功能达到beta并在标准GKE群集上可用。尽管API slowly progressing似乎确实是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"