我们在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
,而我更喜欢为每个吊舱使用它的隔离部分。我们也不需要数据是持久的-删除容器后,我们也很高兴删除数据。
答案 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"