Problem running gcsfuse on Google App Engine

白昼怎懂夜的黑 提交于 2020-06-29 04:23:31

问题


I am trying to run Airflow Webserver on App Engine Flexible however for it to work I need a mounted GCS bucket. I am using custom runtime. The reason why I am doing it is to get a secured endpoint that app Engine provides together with IAP.

My app.yaml is a simple file with service name, env and runtime My Dockerfile is a lots of apt-get installs and in CMD there is gcsfuse mounting and running airflow webserver, it is not a big deal.

The error I am getting when trying to use gcsfuse in App Engine is:

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

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

I know that Google Composer exists but it is way too expensive for my needs. So I prefer to create a VM with a scheduler and webserver on GAE, sharing a GCS bucket, similar to what Composer gives but without all that HA and insane cost for simple things I want to run.

I am searching to do this in App Engine, all the answers I have found so far mention GKE for some reason.

I know it is a privilege problem, however in App Engine I do not see any option to set privileges, a way to do it would be very helpful.

Is is even possible to do what I want to do on App Engine?


回答1:


This is possible. I'll show you how to do it manually, you might need to utilize shell script to deal with multiple instances.

  1. define several vars used in this manual
service=YOUR_APPENGINE_VERSION
version=YOUR_APPENGINE_VERSION
project=PROJECTID
  1. get instance list
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 into one instance
gcloud app instances ssh instance-id-1 --service $service --version $version --project $project
  1. get image id
docker ps | grep gaeapp | awk '{print $2}'

you will get an imageid

  1. get env of 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. restart gaeapp with privilege
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. enter gaeapp(assume you have gcsfuse installed and have service account key 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:


To be honest, I have tried all possible solutions. and finally the above solution worked. Unfortunately, it worked for 2-3 days only. After sometime, App Engine restarts the instances automatically, without any failure in app. Therefore all changes for gcsfuse got disappeared.

Main thing for gcsfuse to work in container is to run the docker image in priviliged mode. And App Engine doesnot allow that

The final solution that we are using is GKE which is working fine.

Note: It was expected that GAE should have some provision for privileged mode, but it doesnot have now. In future Google Team may introduce it. Thanks!



来源:https://stackoverflow.com/questions/56254714/problem-running-gcsfuse-on-google-app-engine

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!