При запуске SparkPi в Kubernetes возникает исключение AccessDeniedException, когда Docker изображение использует не root пользователя - PullRequest
1 голос
/ 27 января 2020

Использование Spark 2.4.4

У меня есть изображение docker, которое запускается как пользователь, не являющийся root. Программное обеспечение spark находится в каталоге, принадлежащем пользователю, и я могу запустить пример SparkPi (как пользователь, не являющийся root) из образа, используя эту команду:

/opt/nsp/spark/bin/spark-submit \
  --deploy-mode client \
  --name spark-pi \
  --class org.apache.spark.examples.SparkPi \
  --conf spark.executor.instances=1 \
  --conf spark.driver.memory=1G \
  --conf spark.executor.memory=1G \
  --conf spark.driver.cores=1 \
  local:///opt/nsp/spark/examples/jars/spark-examples_2.11-2.4.4.jar

Это завершено успешно.

Когда я пытаюсь запустить его в кластере Kubernetes с помощью spark-submit, я получаю java .nio.file.AccessDeniedException.

Я вижу это в журнале исполнителя:

20/01/27 14:48:46 INFO Utils: Fetching spark://spark-pi-1580136512257-driver-svc.nsp.svc:7078/jars/spark-examples_2.11-2.4.4.jar to /var/data/spark-ebbc540f-5256-4ef4-8568-9b22233bcc42/spark-a3dadf1e-e21f-4df6-a985-75ff161e6c80/fetchFileTemp1549348282821390884.tmp
20/01/27 14:48:46 INFO Utils: Copying /var/data/spark-ebbc540f-5256-4ef4-8568-9b22233bcc42/spark-a3dadf1e-e21f-4df6-a985-75ff161e6c80/2218273401580136519157_cache to /./spark-examples_2.11-2.4.4.jar
20/01/27 14:48:46 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.nio.file.AccessDeniedException: ./spark-examples_2.11-2.4.4.jar

Похоже, что исполнитель выбирает файл jar и помещает его в каталог с нулями. Но затем он пытается скопировать его в каталог root '/', к которому не пользователь root не имеет доступа.

Это ожидаемое поведение? Есть ли способ заставить это работать?

Спасибо


Редактировать:

Мне кажется, я понял, что происходит.

I я создаю не-1044 * пользователя с именем 'nsp' в Dockerfile и устанавливаю образ для использования этим пользователем. Тем не менее, похоже, что рабочий каталог, когда я запускаю образ docker, не является домашним каталогом пользователя 'nsp', это каталог root.

[vagrant@nsp-v6 ~]$ docker run -it --entrypoint /bin/sh 2ab0208bd5f5
sh-4.4$ id
uid=1000(nsp) gid=1000(nsp)
sh-4.4$ pwd
/
sh-4.4$

Если возникает такая же ситуация когда spark-submit создает модуль из образа docker, то исполнитель пытается создать файл в своем рабочем каталоге '/', но не имеет разрешения, поскольку он не является пользователем root.

Действительно, я изменил точку входа. Сценарий sh изменил каталог перед запуском команды executor:

# Execute the container CMD under tini for better hygiene
cd ~
exec /sbin/tini -s -- "${CMD[@]}"

Выполнение теперь успешно.


Edit # 2

Похоже, я могу выполнить sh то же самое, используя директиву WORKDIR в Dockerfile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...