我正在努力在Kubernetes上设置能够启动pyspark
的Jupyter笔记本服务器。每个用户都可以一次运行多个服务器,并且通过导航到适当的主机以及服务器的全限定名称路径来访问每个服务器。例如:http://<hostname>/<username>/<notebook server name>
。
我定义了一个顶层函数,该函数允许用户创建一个指向Kubernetes主URL的SparkSession
并将其pod设置为Spark驱动程序。
这一切都很好,但是我想使最终用户能够访问Spark Web UI的URL,以便他们可以跟踪其作业。 Spark on Kubernetes documentation将端口转发作为实现此目的的推荐方案。对于任何具有安全意识的组织来说,允许任何随机用户以这种方式设置端口转发似乎都是不可接受的。
我想使用Ingress
Kubernetes定义来允许从外部访问驱动程序的Spark Web UI。我已经设置了以下内容:
# 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 Web UI的默认入口点。但是,我没有该路径的入口规则,也无法设置这样的规则,因为每个用户的Web UI都会在负载均衡器中相互冲突(除非我有误解,这是完全可能的)。 / p>
在Spark UI configuration设置下,似乎没有一种方法可以为Spark会话设置根路径。您可以更改其运行的端口,但是我想做的是使UI在类似http://<hostname>/<username>/<notebook server name>/spark-ui/<jobs, stages, etc>
的位置上运行。真的没有办法更改URL主机名之后和最后一部分之前的内容吗?
答案 0 :(得分:2)
1:设置您的Spark配置
spark.ui.proxyBase: /foo
2:在Ingress中设置nginx批注
annotations:
nginx.ingress.kubernetes.io/proxy-redirect-from: http://$host/
nginx.ingress.kubernetes.io/proxy-redirect-to: http://$host/foo/
3:重写目标的注释:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: <host>
http:
paths:
- backend:
serviceName: <service>
servicePort: <port>
path: /foo(/|$)(.*)
答案 1 :(得分:0)
是的,您可以实现这一目标。具体来说,您可以通过在spark-defaults.conf中或在运行时设置spark.ui.proxyBase属性来执行此操作。
示例:
回显“ spark.ui.proxyBase $ SPARK_UI_PROXYBASE” >> /opt/spark/conf/spark-defaults.conf;
然后这应该工作。