Я работаю над настройкой серверов ноутбуков Jupyter в Kubernetes, которые могут запускать pyspark
. Каждый пользователь может иметь несколько серверов, работающих одновременно, и может получить доступ к каждому из них, перейдя к соответствующему хосту в сочетании с путем к полному имени сервера. Например: http://<hostname>/<username>/<notebook server name>
.
У меня определена функция верхнего уровня, которая позволяет пользователю создать SparkSession
, который указывает на главный URL-адрес Kubernetes и устанавливает его модуль в качестве драйвера Spark.
Это все хорошо, но я бы хотел, чтобы конечные пользователи имели доступ к URL-адресу для Spark Web UI, чтобы они могли отслеживать свои работы. Документация Spark on Kubernetes содержит переадресацию портов в качестве рекомендуемой схемы для достижения этой цели. Похоже, что для любой организации, ориентированной на безопасность, позволить произвольному пользователю настроить переадресацию портов таким способом было бы неприемлемо.
Я хотел бы использовать определение Ingress
Kubernetes, чтобы разрешить внешний доступ к веб-интерфейсу Spark драйвера. Я настроил что-то вроде следующего:
# Service
apiVersion: v1
kind: Service
metadata:
namespace: <notebook namespae>
name: <username>-<notebook server name>-svc
spec:
type: ClusterIP
sessionAffinity: None
selector:
app: <username>-<notebook server name>-notebook
ports:
- name: app-svc-port
protocol: TCP
port: 8888
targetPort: 8888
- name: spark-ui-port
protocol: TCP
port: 4040
targetPort: 4040
# Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: workspace
name: <username>-<notebook server name>-ing
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: <hostname>
http:
paths:
- path: /<username>/<notebook server name>
backend:
serviceName: <username>-<notebook server name>-svc
servicePort: app-svc-port
- path: /<username>/<notebook server name>/spark-ui
backend:
serviceName: <username>-<notebook server name>-svc
servicePort: spark-ui-port
Однако при этой настройке при переходе к http://<hostname>/<username>/<notebook server name>/spark-ui/
меня перенаправляют на http://<hostname>/jobs
. Это связано с тем, что /jobs
является точкой входа по умолчанию для веб-интерфейса Spark. Однако у меня нет входного правила для этого пути, и я не могу установить такое правило, так как веб-интерфейс каждого пользователя будет сталкиваться друг с другом в балансировщике нагрузки (если у меня нет недопонимания, что вполне возможно).
В настройках Spark UI , кажется, нет способа установить корневой путь для сеанса Spark. Вы можете изменить порт, на котором он работает, но то, что я хотел бы сделать, заставляет интерфейс работать примерно так: http://<hostname>/<username>/<notebook server name>/spark-ui/<jobs, stages, etc>
. Неужели нет способа изменить то, что следует за именем хоста URL-адреса и перед последней частью?