在 Google App Engine 上运行 gcsfuse 时出现问题

Posted

技术标签:

【中文标题】在 Google App Engine 上运行 gcsfuse 时出现问题【英文标题】:Problem running gcsfuse on Google App Engine 【发布时间】:2019-10-08 19:37:29 【问题描述】:

我正在尝试在 App Engine Flexible 上运行 Airflow Webserver,但是要使其正常工作,我需要一个已安装的 GCS 存储桶。我正在使用自定义运行时。 我这样做的原因是为了获得 app Engine 与 IAP 一起提供的安全端点。

我的 app.yaml 是一个包含服务名称、环境和运行时的简单文件 我的 Dockerfile 有很多 apt-get installs 并且在 CMD 中有 gcsfuse 安装和运行气流网络服务器,这没什么大不了的。

我在 App Engine 中尝试使用 gcsfuse 时遇到的错误是:

daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithConn: Mount: mount: running fusermount: exit status 1

stderr:
fusermount: fuse device not found, try 'modprobe fuse' first

我知道 Google Composer 存在,但它对我的需求来说太贵了。所以我更喜欢在 GAE 上创建一个带有调度程序和网络服务器的 VM,共享一个 GCS 存储桶,类似于 Composer 提供的功能,但没有高可用性和我想要运行的简单事情的疯狂成本。

我正在 App Engine 中搜索,到目前为止我找到的所有答案都出于某种原因提到了 GKE。

我知道这是一个权限问题,但是在 App Engine 中我没有看到任何设置权限的选项,这样做会很有帮助。

甚至可以在 App Engine 上做我想做的事吗?

【问题讨论】:

【参考方案1】:

说实话,我已经尝试了所有可能的解决方案。最后上述解决方案奏效了。不幸的是,它只工作了2-3天。一段时间后,App Engine 会自动重新启动实例,而不会在应用程序中出现任何故障。因此 gcsfuse 的所有更改都消失了。

gcsfuse 在容器中工作的主要内容是在特权模式下运行 docker 映像。 App Engine 不允许这样做

我们使用的最终解决方案是运行良好的 GKE。

注意:原以为 GAE 应该为特权模式提供一些规定,但现在没有。将来谷歌团队可能会引入它。谢谢!

【讨论】:

【参考方案2】:

这是可能的。我将向您展示如何手动执行此操作,您可能需要使用 shell 脚本来处理多个实例。

    定义本手册中使用的几个变量
service=YOUR_APPENGINE_VERSION
version=YOUR_APPENGINE_VERSION
project=PROJECTID
    获取实例列表
gcloud app instances list  --project $project
SERVICE  VERSION          ID                                VM_STATUS  DEBUG_MODE
default  ***************  instance-id-1                     RUNNING    YES
default  ***************  instance-id-2                     RUNNING
    SSH 进入一个实例
gcloud app instances ssh instance-id-1 --service $service --version $version --project $project
    获取图片ID
docker ps | grep gaeapp | awk 'print $2'

你会得到一个 imageid

    获取gaeapp的环境
docker exec gaeapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=*****
GAE_MEMORY_MB=614
GAE_INSTANCE=****
GAE_SERVICE=default
PORT=8080
GCLOUD_PROJECT=*****
GAE_VERSION=*****
GOOGLE_CLOUD_PROJECT=*****
    以特权重启 gaeapp
docker rm -f gaeapp
docker run --privileged -d -p 8080:8080 --name gaeapp -e GAE_MEMORY_MB=614 -e GAE_INSTANCE=instance-id-1 -e GAE_SERVICE=$service -e PORT=8080 -e GCLOUD_PROJECT=$project -e GAE_VERSION=$version -e GOOGLE_CLOUD_PROJECT=$project $imageid
    输入 gaeapp(假设您已安装 gcsfuse 并拥有服务帐户密钥 json:/test-service-account.json
$ docker exec -it gaeapp bash
[in gaeapp] # GOOGLE_APPLICATION_CREDENTIALS=/test-service-account.json gcsfuse BUCKET /mnt/
Using mount point: /mnt
Opening GCS connection...
Opening bucket...
Mounting file system...
File system has been successfully mounted.

【讨论】:

我可以看到应用引擎中大约有两个实例。我已经完成了与您上面提到的步骤完全相同的操作。它工作正常。我注意到它有时不起作用的一件事可能是因为它正在另一个我们尚未配置的实例上工作。 1.如果我删除另一个实例怎么办? 2. 为什么说ssh实例为“此VM处于调试模式。禁用调试模式后,对它的所有更改都将丢失。”我们会不会丢失上面配置的东西

以上是关于在 Google App Engine 上运行 gcsfuse 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Cloud App Engine 上运行 PHP 服务

在 Google App Engine 上运行 Python37 的问题

在 Google App Engine 上按计划运行 python 脚本

在 Google-App-Engine 中使用 HSQLDB

在 Google App Engine 上部署 create-react-app

Google App Engine 上的 Pub/Sub 以约 100% 的 CPU 运行