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

时间:2019-05-22 10:26:34

标签: docker google-app-engine google-cloud-platform gcsfuse

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

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

尝试在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上创建一个具有调度程序和Web服务器的VM,共享一个GCS存储桶,类似于Composer提供的功能,但没有HA以及我想运行的简单东西的所有疯狂费用。

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

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

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

2 个答案:

答案 0 :(得分:3)

这是可能的。我将向您展示如何手动执行操作,您可能需要利用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}'

您将获得一个图像ID

  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.

答案 1 :(得分:1)

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

使gcsfuse在容器中工作的主要事情是在特权模式下运行docker映像。而且 App Engine不允许

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

注意:预计GAE应该为特权模式提供一些准备,但现在还没有。将来Google团队可能会介绍它。谢谢!