Проблема с запуском gcsfuse в Google App Engine

Я пытаюсь запустить веб-сервер 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?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
0
1 098
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это возможно. Я покажу вам, как сделать это вручную, вам может понадобиться использовать сценарий оболочки для работы с несколькими экземплярами.

  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. получить идентификатор изображения
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.

Я мог видеть, что в движке приложения есть около двух экземпляров. Я сделал точно так же, как вы упомянули выше шаги. Это работает нормально. Одна вещь, которую я заметил, иногда не работает, возможно, потому, что она работает с другим экземпляром, который мы не настроили. 1. Что, если я удалю этот другой экземпляр? 2. Почему для экземпляра ssh говорится: «Эта виртуальная машина находится в режиме отладки. Все изменения в ней будут потеряны при отключении режима отладки». мы потеряем то, что мы настроили выше

Prasad 05.02.2020 16:49

Честно говоря, я перепробовал все возможные решения. и, наконец, вышеуказанное решение сработало. К сожалению, проработал всего 2-3 дня. Через некоторое время App Engine автоматически перезапускает экземпляры без каких-либо сбоев в приложении. Поэтому все изменения для gcsfuse исчезли.

Главное, чтобы gcsfuse работал в контейнере, — это запускать образ докера в привилегированном режиме. И App Engine не позволяет этого

Последнее решение, которое мы используем, — это GKE, который отлично работает.

Примечание. Ожидалось, что в GAE должны быть предусмотрены некоторые возможности для привилегированного режима, но сейчас их нет. В будущем команда Google может представить его. Спасибо!

Другие вопросы по теме