docker - 是否可以在 Google Kubernetes Engine 上拥有临时的磁盘 pod 存储?

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

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

kubernetes docs使 emptyDir 听起来像我想要的:

An emptyDir volume is first created when a Pod is assigned to a Node, and exists as long as that Pod is running on that node

.. 和

By default, emptyDir volumes are stored on whatever medium is backing the node - that might be disk or SSD or network storage, depending on your environment. However, you can set the emptyDir.medium field to "Memory" to tell Kubernetes to mount a tmpfs (RAM-backed filesystem) for you instead

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

但是,如果我在 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: {}

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

kubectl exec -it alpine -- /bin/sh
$ cd foo/
$ dd if=/dev/zero of=file.txt count=2048 bs=1048576

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

memory increase in the alpine contianer

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

另一种方法可能是使用 local SSD对于我的缓存数据,但是如果我按照 GKE 文档中的建议安装它们,它们将由在同一节点上运行的所有 pod 共享,并且在 pod 终止时不会清理数据,这不符合我的自动管理目标资源。

坐骑

这是容器内 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

节点 View

我发现可以通过 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

现在我可以看到它正在写入底层文件系统,我想知道我在 GKE Web UI 中看到的 RAM 使用是否是 linux 文件系统缓存或类似的,而不是存储在RAM 盘?

最佳答案

根据您提供的安装信息,emptyDir 卷安装在驱动器分区上,因此它可以按预期工作,而不是安装在内存中。您看到的内存使用很可能是由于文件系统缓冲区缓存造成的,因此在足够的内存压力下,它最终会被写入磁盘。但是,鉴于您有如此多的可用内存,系统很可能认为没有必要立即这样做。

如果您有更多疑问,请在机器上尝试 syncecho 3 >/proc/sys/vm/drop_caches 以将文件系统信息刷新到磁盘。您应该会看到内存使用情况发生了变化。

关于docker - 是否可以在 Google Kubernetes Engine 上拥有临时的磁盘 pod 存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49932128/

相关文章:

kubernetes - 从minikube集群内部连接到本地数据库

javascript - 在 google cloud function env 上输入密码

c# - 使用 dotnet restore 的 Docker 导致错误 : GSSAPI operation failed - An unsupported mechanism was requested

java - Docker 和 Java 9 模块

nginx - 如何更改kubernetes中入口 Controller 的配置参数

flask - Minikube上的Ingress Controller无法正确路由Flask POST请求

kubernetes - 如何增加 google kubernetes 引擎上主节点的大小?

google-app-engine - App Engine 默认凭据在删除后恢复(+ 30 天)

maven - 将maven的docker镜像与jenkins结合使用-无法创建本地存储库

php - 使用 Docker 和 Laravel 我在 MySQL 中遇到此错误 : “SQLSTATE[HY000] [2002] No such file or directory”