2

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

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

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

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

4

2 回答 2

9

这个有可能。我将向您展示如何手动操作,您可能需要使用 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 $2}'

你会得到一个imageid

  1. 获得环境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=*****
  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.
于 2019-05-23T00:59:36.607 回答
1

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

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

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

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

于 2020-06-03T16:42:18.493 回答