Google App Engine 上的问题 运行 gcsfuse

Problem running gcsfuse on Google App Engine

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

我的 app.yaml 是一个带有服务名称、环境和 运行time 的简单文件 我的 Dockerfile 有很多 apt-get install,在 CMD 中有 gcsfuse 安装和 运行ning airflow 网络服务器,这没什么大不了的。

我在 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 提供的,但没有所有 HA 和我想要的简单事情的疯狂成本 运行。

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

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

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

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

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

你会得到一个图像ID

  1. 获取 gaeapp
  2. 的环境
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=*****
  1. 以特权重启 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
  1. 输入 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.

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

gcsfuse 在容器中工作的主要任务是 运行 特权模式下的 docker 图像。 App Engine 不允许

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

注:本来以为GAE应该对特权模式有一些规定,但现在没有了。将来 Google 团队可能会介绍它。谢谢!