是否可以在Google Kubernetes Engine上安装短暂的磁盘上存储?

Jam*_*aly 8 docker google-cloud-platform kubernetes google-kubernetes-engine

我希望我的pod中的容器共享临时(缓存)数据的卷.我不介意当pod终止时数据是否丢失(实际上,我希望删除数据并回收空间).

kubernetes文档做出emptyDir听起来像我想要的东西:

将Pod分配给节点时,首先会创建一个emptyDir卷,只要Pod在该节点上运行,就会存在

..和

默认情况下,emptyDir卷存储在支持节点的任何介质上 - 可能是磁盘或SSD或网络存储,具体取决于您的环境.但是,您可以将emptyDir.medium字段设置为"Memory",以告知Kubernetes为您安装tmpfs(RAM支持的文件系统)

这听起来像默认行为是将卷存储在磁盘上,除非我明确请求内存.

但是,如果我在GKE集群上创建以下pod:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
spec:
  containers:
  - name: alpine
    image: alpine:3.7
    command: ["/bin/sh", "-c", "sleep 60m"]
    volumeMounts:
      - name: foo
        mountPath: /foo
  volumes:
  - name: foo
    emptyDir: {}
Run Code Online (Sandbox Code Playgroud)

..然后在pod上打开一个shell并将2Gb文件写入卷:

kubectl exec -it alpine -- /bin/sh
$ cd foo/
$ dd if=/dev/zero of=file.txt count=2048 bs=1048576
Run Code Online (Sandbox Code Playgroud)

然后我可以在GKE Web控制台中看到容器的RAM使用量增加了2Gb:

高山contianer记忆力增加

在我看来emptyDir,默认情况下,GKE将内存卷存储在内存中.我计划运行的工作负载需要大量内存,所以我希望emptyDir磁盘支持卷 - 这可能吗?该GKE存储文档没有太多在这个问题上说.

另一种方法可能是使用一个本地SSD为我的缓存数据,但是如果我将它们安装在与GKE文档他们由同一个节点上运行的所有豆荚共享和数据不上荚终止清理建议,这不符合我自动管理资源的目标.

坐骑

这是df -h容器内部的输出:

# df -h
Filesystem                Size      Used Available Use% Mounted on
overlay                  96.9G     26.2G     70.7G  27% /
overlay                  96.9G     26.2G     70.7G  27% /
tmpfs                     7.3G         0      7.3G   0% /dev
tmpfs                     7.3G         0      7.3G   0% /sys/fs/cgroup
/dev/sda1                96.9G     26.2G     70.7G  27% /foo
/dev/sda1                96.9G     26.2G     70.7G  27% /dev/termination-log
/dev/sda1                96.9G     26.2G     70.7G  27% /etc/resolv.conf
/dev/sda1                96.9G     26.2G     70.7G  27% /etc/hostname
/dev/sda1                96.9G     26.2G     70.7G  27% /etc/hosts
shm                      64.0M         0     64.0M   0% /dev/shm
tmpfs                     7.3G     12.0K      7.3G   0% /run/secrets/kubernetes.io/serviceaccount
tmpfs                     7.3G         0      7.3G   0% /proc/kcore
tmpfs                     7.3G         0      7.3G   0% /proc/timer_list
tmpfs                     7.3G         0      7.3G   0% /proc/sched_debug
tmpfs                     7.3G         0      7.3G   0% /sys/firmware
Run Code Online (Sandbox Code Playgroud)

节点视图

我发现可以ssh到节点实例,我能够在节点文件系统上找到2Gb文件:

root@gke-cluster-foo-pool-b-22bb9925-xs5p:/# find . -name file.txt
./var/lib/kubelet/pods/79ad1aa4-4441-11e8-af32-42010a980039/volumes/kubernetes.io~empty-dir/foo/file.txt
Run Code Online (Sandbox Code Playgroud)

现在,我可以看到它被写入到底层的文件系统,我想知道是否也许是内存占用我看到在GKE网络用户界面是Linux文件系统缓存或类似的,而不是文件被存储在RAM磁盘?

hex*_*ide 8

从您提供的安装信息中,emptyDir卷安装在驱动器分区上,因此它按预期工作,并且未安装在内存中.您看到的内存使用量可能是由文件系统缓冲区缓存引起的,因此在内存压力足够的情况下,它最终会被写入磁盘.但是,鉴于您有足够的可用内存,系统可能不会立即执行此操作.

如果您有更多疑虑,请给予syncecho 3 > /proc/sys/vm/drop_caches继续使用机器将文件系统信息刷新到磁盘.你应该看到内存使用量的变化.

  • 您碰到了头上的钉子-节点上的`echo 3> / proc / sys / vm / drop_caches`,并且堆栈驱动器内存使用情况图表回落。我觉得很愚蠢,但谢谢! (2认同)