Я пытаюсь запустить веб-сервер Airflow на App Engine Flexible, однако для его работы мне нужно смонтированное ведро GCS. Я использую пользовательскую среду выполнения. Причина, по которой я это делаю, заключается в том, чтобы получить защищенную конечную точку, которую App Engine предоставляет вместе с IAP.
Мой app.yaml — это простой файл с именем службы, env и временем выполнения.
В моем Dockerfile много apt-get install
, а в CMD есть монтирование gcsfuse и запуск веб-сервера воздушного потока, это не имеет большого значения.
Ошибка, которую я получаю при попытке использовать gcsfuse в App Engine:
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, разделяя корзину GCS, подобно тому, что дает Composer, но без всей этой высокой доступности и безумных затрат на простые вещи, которые я хочу запустить.
Я пытаюсь сделать это в App Engine, все ответы, которые я нашел до сих пор, по какой-то причине упоминают GKE.
Я знаю, что это проблема с привилегиями, однако в App Engine я не вижу возможности установить привилегии, способ сделать это был бы очень полезен.
Возможно ли вообще делать то, что я хочу делать в App Engine?
Это возможно. Я покажу вам, как сделать это вручную, вам может понадобиться использовать сценарий оболочки для работы с несколькими экземплярами.
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
gcloud app instances ssh instance-id-1 --service $service --version $version --project $project
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=*****
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
/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 работал в контейнере, — это запускать образ докера в привилегированном режиме. И App Engine не позволяет этого
Последнее решение, которое мы используем, — это GKE, который отлично работает.
Примечание. Ожидалось, что в GAE должны быть предусмотрены некоторые возможности для привилегированного режима, но сейчас их нет. В будущем команда Google может представить его. Спасибо!
Я мог видеть, что в движке приложения есть около двух экземпляров. Я сделал точно так же, как вы упомянули выше шаги. Это работает нормально. Одна вещь, которую я заметил, иногда не работает, возможно, потому, что она работает с другим экземпляром, который мы не настроили. 1. Что, если я удалю этот другой экземпляр? 2. Почему для экземпляра ssh говорится: «Эта виртуальная машина находится в режиме отладки. Все изменения в ней будут потеряны при отключении режима отладки». мы потеряем то, что мы настроили выше